From 181033634634a30acb1c5eff45b9c660d234d10a Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 16 Apr 2019 17:02:14 -0400 Subject: [PATCH 001/179] Separated control session logic in SDLIAPTransport * Separated out control session logic in SDLIAPTransport into the SDLIAPControlSession class * Added test cases for the SDLIAPControlSession class --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 13 +- SmartDeviceLink/SDLIAPControlSession.h | 39 ++++ SmartDeviceLink/SDLIAPControlSession.m | 217 ++++++++++++++++++ SmartDeviceLink/SDLIAPTransport.h | 10 - SmartDeviceLink/SDLIAPTransport.m | 196 +++++----------- .../iAP/SDLIAPControlSessionSpec.m | 116 ++++++++++ .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 56 +++-- 7 files changed, 474 insertions(+), 173 deletions(-) create mode 100644 SmartDeviceLink/SDLIAPControlSession.h create mode 100644 SmartDeviceLink/SDLIAPControlSession.m create mode 100644 SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 736289d46..4c138431b 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1355,6 +1355,9 @@ 88B58DC922204C9E0011B063 /* SDLNavigationActionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B58DC822204C9E0011B063 /* SDLNavigationActionSpec.m */; }; 88B848C31F45E1A600DED768 /* TestResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B848C21F45E1A600DED768 /* TestResponse.m */; }; 88B848C91F462E3600DED768 /* TestFileProgressResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = 88B848C81F462E3600DED768 /* TestFileProgressResponse.m */; }; + 88BCEA922266250B00BB7E70 /* SDLIAPControlSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */; }; + 88BCEA932266250B00BB7E70 /* SDLIAPControlSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */; }; + 88BCEA952266592D00BB7E70 /* SDLIAPControlSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */; }; 88C23E8822297C6000EA171F /* SDLRPCResponseNotificationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C23E8722297C6000EA171F /* SDLRPCResponseNotificationSpec.m */; }; 88C23E8A22297DE400EA171F /* SDLRPCNotificationNotificationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C23E8922297DE400EA171F /* SDLRPCNotificationNotificationSpec.m */; }; 88C282CA220CD17200D02F90 /* SDLGetFileResponseSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C282C9220CD17200D02F90 /* SDLGetFileResponseSpec.m */; }; @@ -2976,6 +2979,9 @@ 88B848C21F45E1A600DED768 /* TestResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestResponse.m; sourceTree = ""; }; 88B848C71F462E3600DED768 /* TestFileProgressResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestFileProgressResponse.h; sourceTree = ""; }; 88B848C81F462E3600DED768 /* TestFileProgressResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestFileProgressResponse.m; sourceTree = ""; }; + 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPControlSession.h; sourceTree = ""; }; + 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPControlSession.m; sourceTree = ""; }; + 88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPControlSessionSpec.m; sourceTree = ""; }; 88C23E8522297BD500EA171F /* SDLRPCRequestNotificationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLRPCRequestNotificationSpec.m; sourceTree = ""; }; 88C23E8722297C6000EA171F /* SDLRPCResponseNotificationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCResponseNotificationSpec.m; sourceTree = ""; }; 88C23E8922297DE400EA171F /* SDLRPCNotificationNotificationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCNotificationNotificationSpec.m; sourceTree = ""; }; @@ -5349,6 +5355,8 @@ 5D61FADB1A84238A00846EE7 /* SDLIAPTransport.m */, E9C32B8C1AB20BA200F283AF /* SDLStreamDelegate.h */, E9C32B8D1AB20BA200F283AF /* SDLStreamDelegate.m */, + 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */, + 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */, ); name = IAP; sourceTree = ""; @@ -5898,6 +5906,7 @@ 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */, 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */, 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */, + 88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */, ); path = iAP; sourceTree = ""; @@ -6491,6 +6500,7 @@ 8B9376D71F3349FC009605C4 /* SDLMetadataTags.h in Headers */, 5D61FD471A84238C00846EE7 /* SDLProtocolListener.h in Headers */, EE28F9E3209802A500B1B61D /* SDLStreamingProtocolDelegate.h in Headers */, + 88BCEA922266250B00BB7E70 /* SDLIAPControlSession.h in Headers */, 5D61FCA01A84238C00846EE7 /* SDLEncodedSyncPDataResponse.h in Headers */, 5D61FD271A84238C00846EE7 /* SDLPerformAudioPassThruResponse.h in Headers */, 5D61FD251A84238C00846EE7 /* SDLPerformAudioPassThru.h in Headers */, @@ -6891,6 +6901,7 @@ 1EB59CC4202DB40400343A61 /* SDLSeatControlCapabilities.m in Sources */, 5D61FD261A84238C00846EE7 /* SDLPerformAudioPassThru.m in Sources */, 1EAA471E203410BB000FE74B /* SDLAudioControlCapabilities.m in Sources */, + 88BCEA932266250B00BB7E70 /* SDLIAPControlSession.m in Sources */, 5D61FC971A84238C00846EE7 /* SDLECallConfirmationStatus.m in Sources */, 8816772D222097C3001FACFF /* SDLNavigationServiceData.m in Sources */, 1E5AD04D1F1F79640029B8AF /* SDLDefrostZone.m in Sources */, @@ -7304,7 +7315,6 @@ 5DA026901AD44EE700019F86 /* SDLDialNumberResponseSpec.m in Sources */, 162E83901A9BDE8B00906325 /* SDLTireStatusSpec.m in Sources */, 162E82E01A9BDE8B00906325 /* SDLHMILevelSpec.m in Sources */, - BB3C600E221AEF37007DD4CA /* NSMutableDictionary+StoreSpec.m in Sources */, 88F65133220C6DC300CAF321 /* SDLWeatherAlertSpec.m in Sources */, 5DC09EDA1F2F7FEC00F4AB1D /* SDLControlFramePayloadNakSpec.m in Sources */, 1EB59CCE202DC97900343A61 /* SDLMassageCushionSpec.m in Sources */, @@ -7377,6 +7387,7 @@ 1EB59CD8202DCCD500343A61 /* SDLMassageCushionFirmnessSpec.m in Sources */, 162E83661A9BDE8B00906325 /* SDLShowResponseSpec.m in Sources */, 5D9F50831BEA5C6100FEF399 /* SDLFileManagerSpec.m in Sources */, + 88BCEA952266592D00BB7E70 /* SDLIAPControlSessionSpec.m in Sources */, 88AAD4C02211B7E200F1E6D7 /* SDLMediaServiceManifestSpec.m in Sources */, 5DAB5F512098994C00A020C8 /* SDLMenuCellSpec.m in Sources */, 1EE8C4481F38430900FDC2CF /* SDLRadioControlCapabilitiesSpec.m in Sources */, diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h new file mode 100644 index 000000000..f09cdae9b --- /dev/null +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -0,0 +1,39 @@ +// +// SDLIAPControlSession.h +// SmartDeviceLink +// +// Created by Nicole on 4/16/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import +#import "SDLIAPSessionDelegate.h" + +@class EAAccessory; +@class SDLIAPSession; + + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^SDLIAPControlSessionRetryCompletionHandler)(BOOL retryEstablishSession); +typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccessory *connectedaccessory, NSString *indexedProtocolString); + +extern NSString *const ControlProtocolString; +extern NSString *const IndexedProtocolStringPrefix; + +/** + * Session for establishing a connection with Core. Once the connection has been established, the session is closed and a session is established. A `controlSession` is not needed if the head unit supports the multisession protocol string. + */ +@interface SDLIAPControlSession : NSObject + +@property (nullable, strong, nonatomic, readonly) SDLIAPSession *session; +@property (assign, nonatomic, readonly) NSUInteger accessoryID; + ++ (nullable SDLIAPSession *)createSessionWithAccessory:(EAAccessory *)accessory; + +- (void)setSession:(nullable SDLIAPSession *)session delegate:(id)delegate retryCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retryCompletionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler; +- (void)destroySession; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m new file mode 100644 index 000000000..c3ad5d2e2 --- /dev/null +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -0,0 +1,217 @@ +// +// SDLIAPControlSession.m +// SmartDeviceLink +// +// Created by Nicole on 4/16/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLIAPControlSession.h" + +#import "EAAccessory+SDLProtocols.h" +#import "EAAccessoryManager+SDLProtocols.h" +#import "SDLIAPSession.h" +#import "SDLLogMacros.h" +#import "SDLStreamDelegate.h" +#import "SDLTimer.h" +#import + + +NS_ASSUME_NONNULL_BEGIN + +NSString *const ControlProtocolString = @"com.smartdevicelink.prot0"; +NSString *const IndexedProtocolStringPrefix = @"com.smartdevicelink.prot"; + +int const ProtocolIndexTimeoutSeconds = 10; + +@interface SDLIAPControlSession () + +@property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; +@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; +@property (nullable, strong, nonatomic) SDLIAPControlSessionRetryCompletionHandler retryCompletionHandler; +@property (nullable, strong, nonatomic) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionCompletionHandler; + +@end + +@implementation SDLIAPControlSession + +- (instancetype)init { + SDLLogV(@"SDLIAPControlSession Init"); + self = [super init]; + if (!self) { + return nil; + } + + _session = nil; + _protocolIndexTimer = nil; + + return self; +} + ++ (nullable SDLIAPSession *)createSessionWithAccessory:(EAAccessory *)accessory { + return [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; +} + +- (void)setSession:(nullable SDLIAPSession *)session delegate:(id)delegate retryCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retryCompletionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { + SDLLogD(@"Starting control session with accessory (%@)", self.session.accessory.name); + + self.session = session; + self.retryCompletionHandler = retryCompletionHandler; + self.createDataSessionCompletionHandler = createDataSessionCompletionHandler; + + if (self.session) { + self.session.delegate = delegate; + + EAAccessory *accessory = session.accessory; + SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; + controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory]; + controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandler]; + controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamErroredHandler]; + self.session.streamDelegate = controlStreamDelegate; + + if (![self.session start]) { + SDLLogW(@"Control session failed to setup (%@), trying to creating a new control session", accessory); + self.session.streamDelegate = nil; + self.session = nil; + [self sdl_shouldRetryEstablishSession:YES]; + } else { + SDLLogW(@"Control session started"); + if (self.protocolIndexTimer != nil) { + SDLLogV(@"Cancelling currently running protocol index timer"); + [self.protocolIndexTimer cancel]; + } + + SDLLogD(@"Setting timer for %d seconds to get the protocol string from Core", ProtocolIndexTimeoutSeconds); + self.protocolIndexTimer = [self sdl_startTimerToGetProtocolString]; + } + } else { + SDLLogW(@"Failed to setup control session"); + [self sdl_shouldRetryEstablishSession:YES]; + } +} + +- (SDLTimer *)sdl_startTimerToGetProtocolString { + SDLTimer *protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO]; + + __weak typeof(self) weakSelf = self; + void (^elapsedBlock)(void) = ^{ + __strong typeof(weakSelf) strongSelf = weakSelf; + SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds); + [strongSelf.session stop]; + strongSelf.session.streamDelegate = nil; + strongSelf.session = nil; + [strongSelf sdl_shouldRetryEstablishSession:YES]; + }; + protocolIndexTimer.elapsedBlock = elapsedBlock; + + return protocolIndexTimer; +} + +- (void)destroySession { + if (self.session != nil) { + SDLLogD(@"Destroying control session"); + [self.session stop]; + self.session.streamDelegate = nil; + self.session = nil; + } else { + SDLLogW(@"Attempted to destroy the control session but control session does not exists"); + } +} + +#pragma mark - Control Stream Handlers + +- (SDLStreamEndHandler)sdl_controlStreamEndedHandler { + __weak typeof(self) weakSelf = self; + + return ^(NSStream *stream) { + __strong typeof(weakSelf) strongSelf = weakSelf; + SDLLogD(@"Control stream ended"); + + // End events come in pairs, only perform this once per set. + if (strongSelf.session != nil) { + [strongSelf.protocolIndexTimer cancel]; + [strongSelf.session stop]; + strongSelf.session.streamDelegate = nil; + strongSelf.session = nil; + [strongSelf sdl_shouldRetryEstablishSession:YES]; + } + }; +} + +- (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory { + __weak typeof(self) weakSelf = self; + + return ^(NSInputStream *istream) { + __strong typeof(weakSelf) strongSelf = weakSelf; + SDLLogV(@"Control stream received data"); + + // Read in the stream a single byte at a time + uint8_t buf[1]; + NSInteger len = [istream read:buf maxLength:1]; + if (len <= 0) { + SDLLogV(@"No data received from the control stream"); + return; + } + + // If we have data from the control stream, use the data to create the protocol string needed to establish the data session. Destroy the control session as it is no longer needed and then create the data session,. + NSString *indexedProtocolString = [NSString stringWithFormat:@"%@%@", IndexedProtocolStringPrefix, @(buf[0])]; + SDLLogD(@"Control Stream will switch to protocol %@", indexedProtocolString); + + // Destroy the control session + dispatch_sync(dispatch_get_main_queue(), ^{ + [strongSelf.session stop]; + strongSelf.session.streamDelegate = nil; + strongSelf.session = nil; + }); + + if (accessory.isConnected) { + dispatch_async(dispatch_get_main_queue(), ^{ + [strongSelf sdl_createDataSessionWithIndexProtocolString:indexedProtocolString connectedAccessory:accessory]; + [strongSelf.protocolIndexTimer cancel]; + }); + } else { + SDLLogE(@"Accessory is not connected"); + } + }; +} + +- (SDLStreamErrorHandler)sdl_controlStreamErroredHandler { + __weak typeof(self) weakSelf = self; + + return ^(NSStream *stream) { + __strong typeof(weakSelf) strongSelf = weakSelf; + SDLLogE(@"Control stream error"); + + [strongSelf.protocolIndexTimer cancel]; + [strongSelf.session stop]; + strongSelf.session.streamDelegate = nil; + strongSelf.session = nil; + [strongSelf sdl_shouldRetryEstablishSession:YES]; + }; +} + +#pragma mark - Helper + +- (void)sdl_shouldRetryEstablishSession:(BOOL)retryEstablishSession { + if (self.retryCompletionHandler == nil) { + return; + } + + self.retryCompletionHandler(retryEstablishSession); +} + +- (void)sdl_createDataSessionWithIndexProtocolString:(NSString *)indexProtocolString connectedAccessory:(EAAccessory *)accessory { + if (self.createDataSessionCompletionHandler == nil) { + return; + } + + self.createDataSessionCompletionHandler(accessory, indexProtocolString); +} + +- (NSUInteger)accessoryID { + return self.session.accessory.connectionID; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPTransport.h b/SmartDeviceLink/SDLIAPTransport.h index 6934ffc27..a4261b2cf 100644 --- a/SmartDeviceLink/SDLIAPTransport.h +++ b/SmartDeviceLink/SDLIAPTransport.h @@ -10,16 +10,6 @@ NS_ASSUME_NONNULL_BEGIN @interface SDLIAPTransport : NSObject -/** - * Session for establishing a connection with Core. Once the connection has been established, the session is closed and a session is established. A `controlSession` is not needed if the head unit supports the multisession protocol string. - */ -@property (nullable, strong, nonatomic) SDLIAPSession *controlSession; - -/** - * Session for transporting data between the app and Core. - */ -@property (nullable, strong, nonatomic) SDLIAPSession *session; - /** * The subscribed listener. */ diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index b0fa07177..ee75d1fd5 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -5,37 +5,49 @@ #import #import +#import "SDLIAPTransport.h" + #import "EAAccessory+SDLProtocols.h" #import "EAAccessoryManager+SDLProtocols.h" #import "SDLGlobals.h" +#import "SDLIAPControlSession.h" #import "SDLIAPSession.h" -#import "SDLIAPTransport.h" -#import "SDLIAPTransport.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" #import "SDLTimer.h" #import + NS_ASSUME_NONNULL_BEGIN NSString *const LegacyProtocolString = @"com.ford.sync.prot0"; -NSString *const ControlProtocolString = @"com.smartdevicelink.prot0"; -NSString *const IndexedProtocolStringPrefix = @"com.smartdevicelink.prot"; +// NSString *const ControlProtocolString = @"com.smartdevicelink.prot0"; +// NSString *const IndexedProtocolStringPrefix = @"com.smartdevicelink.prot"; NSString *const MultiSessionProtocolString = @"com.smartdevicelink.multisession"; NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; int const CreateSessionRetries = 3; -int const ProtocolIndexTimeoutSeconds = 10; +//int const ProtocolIndexTimeoutSeconds = 10; @interface SDLIAPTransport () { BOOL _alreadyDestructed; } +// Session for getting the index protocol string used to connect to the head unit. Legacy head units will connect with an index procol string, newer ones will connect with the multisession protocol string. Once the protocol string is received from Core, the control session is closed and a data session is established. +@property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; + +// Session for transporting data between the app and Core. +@property (nullable, strong, nonatomic) SDLIAPSession *session; + @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; + +@property (nonatomic, copy, nullable) SDLIAPControlSessionRetryCompletionHandler retryCompletionHandler; +@property (nonatomic, copy, nullable) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionCompletionHandler; + @end @@ -47,7 +59,7 @@ - (instancetype)init { _alreadyDestructed = NO; _sessionSetupInProgress = NO; _session = nil; - _controlSession = nil; + _controlSession = [[SDLIAPControlSession alloc] init]; _retryCounter = 0; _protocolIndexTimer = nil; _accessoryConnectDuringActiveSession = NO; @@ -95,7 +107,6 @@ - (void)sdl_backgroundTaskEnd { } #pragma mark - Notifications - #pragma mark Subscription /** @@ -107,22 +118,18 @@ - (void)sdl_startEventListening { selector:@selector(sdl_accessoryConnected:) name:EAAccessoryDidConnectNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_accessoryDisconnected:) name:EAAccessoryDidDisconnectNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; - [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications]; } @@ -134,7 +141,6 @@ - (void)sdl_stopEventListening { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - #pragma mark EAAccessory Notifications /** @@ -192,17 +198,25 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { self.accessoryConnectDuringActiveSession = NO; } - if (self.controlSession == nil && self.session == nil) { + if (self.controlSession.session == nil && self.session == nil) { + // No connection has yet been established so we will not destroy the current session. The current session needs to watch for accessory connections. SDLLogV(@"Accessory (%@), disconnected, but no session is in progress", accessory.serialNumber); - } else if (accessory.connectionID == self.controlSession.accessory.connectionID) { + SDLLogE(@"DEBUG - Will not destroy session"); + } else if (accessory.connectionID == self.controlSession.accessoryID) { + // The data session has yet been established so we will not destroy the current session. The current session needs to watch for accessory connections. SDLLogV(@"Accessory (%@) disconnected during a control session", accessory.serialNumber); + SDLLogE(@"DEBUG - Will not destroy session"); + self.retryCounter = 0; + self.sessionSetupInProgress = NO; + + [self.controlSession destroySession]; } else if (accessory.connectionID == self.session.accessory.connectionID) { + // The data session has been established so we will destroy the current session and let the lifecycle manager create a new session. SDLLogV(@"Accessory (%@) disconnected during a data session", accessory.serialNumber); + [self sdl_destroySession]; } else { SDLLogV(@"Accessory (%@) disconnecting during an unknown session", accessory.serialNumber); } - - [self sdl_destroySession]; } - (void)sdl_destroySession { @@ -276,10 +290,7 @@ - (void)disconnect { // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications [self sdl_stopEventListening]; if (self.controlSession != nil) { - SDLLogD(@"Disconnecting control session"); - [self.controlSession stop]; - self.controlSession.streamDelegate = nil; - self.controlSession = nil; + [self.controlSession destroySession]; } else if (self.session != nil) { SDLLogD(@"Disconnecting data session"); [self.session stop]; @@ -310,7 +321,8 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { [self sdl_createIAPDataSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString]; connecting = YES; } else if ([accessory supportsProtocol:ControlProtocolString]) { - [self sdl_createIAPControlSessionWithAccessory:accessory]; + SDLIAPSession *session = [SDLIAPControlSession createSessionWithAccessory:accessory]; + [self.controlSession setSession:session delegate:self retryCompletionHandler:self.retryCompletionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; connecting = YES; } else if ([accessory supportsProtocol:LegacyProtocolString]) { [self sdl_createIAPDataSessionWithAccessory:accessory forProtocol:LegacyProtocolString]; @@ -319,6 +331,28 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { return connecting; } +- (nullable SDLIAPControlSessionRetryCompletionHandler)retryCompletionHandler { + if (!_retryCompletionHandler) { + __weak typeof(self) weakSelf = self; + self.retryCompletionHandler = ^(BOOL retryEstablishSession) { + [weakSelf sdl_retryEstablishSession]; + }; + } + + return _retryCompletionHandler; +} + +- (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { + if (!_createDataSessionCompletionHandler) { + __weak typeof(self) weakSelf = self; + self.createDataSessionCompletionHandler = ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { + [weakSelf sdl_createIAPDataSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString]; + }; + } + + return _createDataSessionCompletionHandler; +} + /** Check all required protocol strings in the info.plist dictionary. @@ -374,7 +408,8 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { [self sdl_createIAPDataSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { - [self sdl_createIAPControlSessionWithAccessory:sdlAccessory]; + SDLIAPSession *session = [SDLIAPControlSession createSessionWithAccessory:sdlAccessory]; + [self.controlSession setSession:session delegate:self retryCompletionHandler:self.retryCompletionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { [self sdl_createIAPDataSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString]; } else { @@ -389,49 +424,6 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { } } -- (void)sdl_createIAPControlSessionWithAccessory:(EAAccessory *)accessory { - SDLLogD(@"Starting IAP control session (%@)", accessory); - self.controlSession = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; - - if (self.controlSession) { - self.controlSession.delegate = self; - - if (self.protocolIndexTimer == nil) { - self.protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO]; - } else { - [self.protocolIndexTimer cancel]; - } - - __weak typeof(self) weakSelf = self; - void (^elapsedBlock)(void) = ^{ - __strong typeof(weakSelf) strongSelf = weakSelf; - - SDLLogW(@"Control session timeout"); - [strongSelf.controlSession stop]; - strongSelf.controlSession.streamDelegate = nil; - strongSelf.controlSession = nil; - [strongSelf sdl_retryEstablishSession]; - }; - self.protocolIndexTimer.elapsedBlock = elapsedBlock; - - SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; - controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory]; - controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandler]; - controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamErroredHandler]; - self.controlSession.streamDelegate = controlStreamDelegate; - - if (![self.controlSession start]) { - SDLLogW(@"Control session failed to setup (%@)", accessory); - self.controlSession.streamDelegate = nil; - self.controlSession = nil; - [self sdl_retryEstablishSession]; - } - } else { - SDLLogW(@"Failed to setup control session (%@)", accessory); - [self sdl_retryEstablishSession]; - } -} - - (void)sdl_createIAPDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol { SDLLogD(@"Starting data session (%@:%@)", protocol, accessory); self.session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; @@ -457,12 +449,14 @@ - (void)sdl_createIAPDataSessionWithAccessory:(EAAccessory *)accessory forProtoc } - (void)sdl_retryEstablishSession { + SDLLogE(@"DEBUG - control session ended.."); // Current strategy disallows automatic retries. self.sessionSetupInProgress = NO; if (self.session != nil) { [self.session stop]; self.session.delegate = nil; self.session = nil; + SDLLogE(@"DEBUG - setting stuff to nil.."); } // Search connected accessories @@ -513,78 +507,6 @@ - (void)sendData:(NSData *)data { #pragma mark - Stream Handlers -#pragma mark Control Stream - -- (SDLStreamEndHandler)sdl_controlStreamEndedHandler { - __weak typeof(self) weakSelf = self; - - return ^(NSStream *stream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - SDLLogD(@"Control stream ended"); - - // End events come in pairs, only perform this once per set. - if (strongSelf.controlSession != nil) { - [strongSelf.protocolIndexTimer cancel]; - [strongSelf.controlSession stop]; - strongSelf.controlSession.streamDelegate = nil; - strongSelf.controlSession = nil; - [strongSelf sdl_retryEstablishSession]; - } - }; -} - -- (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory { - __weak typeof(self) weakSelf = self; - - return ^(NSInputStream *istream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - SDLLogV(@"Control stream received data"); - - // Read in the stream a single byte at a time - uint8_t buf[1]; - NSInteger len = [istream read:buf maxLength:1]; - if (len <= 0) { - return; - } - - // If we have data from the stream - // Determine protocol string of the data session, then create that data session - NSString *indexedProtocolString = [NSString stringWithFormat:@"%@%@", IndexedProtocolStringPrefix, @(buf[0])]; - SDLLogD(@"Control Stream will switch to protocol %@", indexedProtocolString); - - // Destroy the control session - dispatch_sync(dispatch_get_main_queue(), ^{ - [strongSelf.controlSession stop]; - strongSelf.controlSession.streamDelegate = nil; - strongSelf.controlSession = nil; - }); - - if (accessory.isConnected) { - dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf sdl_createIAPDataSessionWithAccessory:accessory forProtocol:indexedProtocolString]; - [strongSelf.protocolIndexTimer cancel]; - }); - } - - [strongSelf sdl_backgroundTaskStart]; - }; -} - -- (SDLStreamErrorHandler)sdl_controlStreamErroredHandler { - __weak typeof(self) weakSelf = self; - - return ^(NSStream *stream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - SDLLogE(@"Control stream error"); - - [strongSelf.protocolIndexTimer cancel]; - [strongSelf.controlSession stop]; - strongSelf.controlSession.streamDelegate = nil; - strongSelf.controlSession = nil; - [strongSelf sdl_retryEstablishSession]; - }; -} - #pragma mark Data Stream diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m new file mode 100644 index 000000000..f15c93bd0 --- /dev/null +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -0,0 +1,116 @@ +// +// SDLIAPControlSessionSpec.m +// SmartDeviceLinkTests +// +// Created by Nicole on 4/16/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import +#import +#import + +#import "EAAccessory+OCMock.m" +#import "SDLIAPControlSession.h" +#import "SDLTimer.h" +#import "SDLIAPSession.h" + +@interface SDLIAPControlSession () +@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; +@end + +QuickSpecBegin(SDLIAPControlSessionSpec) + +describe(@"SDLIAPControlSession", ^{ + __block SDLIAPControlSession *controlSession = nil; + __block EAAccessory *mockAccessory = nil; + __block id mockSessionDelegate = nil; + + beforeEach(^{ + controlSession = [SDLIAPControlSession new]; + mockAccessory = [EAAccessory.class sdlCoreMock]; + mockSessionDelegate = OCMProtocolMock(@protocol(SDLIAPSessionDelegate)); + }); + + describe(@"Initialization", ^{ + it(@"Should init correctly", ^{ + expect(controlSession.session).to(beNil()); + expect(controlSession.protocolIndexTimer).to(beNil()); + }); + }); + + describe(@"Creating a session", ^{ + __block SDLIAPSession *session = nil; + + beforeEach(^{ + session = [SDLIAPControlSession createSessionWithAccessory:mockAccessory]; + }); + + it(@"Should init correctly", ^{ + expect(session).toNot(beNil()); + }); + }); + + describe(@"Setting a session", ^{ + __block SDLIAPSession *session = nil; + + beforeEach(^{ + session = nil; + }); + + describe(@"When a session starts successfully", ^{ + beforeEach(^{ + session = OCMClassMock([SDLIAPSession class]); + OCMStub([session start]).andReturn(YES); + [controlSession setSession:session delegate:mockSessionDelegate retryCompletionHandler:^(BOOL retryEstablishSession) { + //TODO + } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { + //TODO + }]; + }); + + it(@"Should create a session", ^{ + expect(controlSession.session).toNot(beNil()); + expect(controlSession.accessoryID).toNot(beNil()); + expect(controlSession.protocolIndexTimer).toNot(beNil()); + }); + }); + + describe(@"When a session does not start successfully", ^{ + beforeEach(^{ + session = OCMClassMock([SDLIAPSession class]); + OCMStub([session start]).andReturn(NO); + [controlSession setSession:session delegate:mockSessionDelegate retryCompletionHandler:^(BOOL retryEstablishSession) { + expect(retryEstablishSession).to(beTrue()); + } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { + //TODO + }]; + }); + + it(@"Should not create a session", ^{ + expect(controlSession.session).to(beNil()); + expect(controlSession.accessoryID).to(equal(0)); + expect(controlSession.protocolIndexTimer).to(beNil()); + }); + }); + + describe(@"When a session is nil", ^{ + beforeEach(^{ + session = nil; + [controlSession setSession:session delegate:mockSessionDelegate retryCompletionHandler:^(BOOL retryEstablishSession) { + expect(retryEstablishSession).to(beTrue()); + } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { + //TODO + }]; + }); + + it(@"Should not create a session", ^{ + expect(controlSession.session).to(beNil()); + expect(controlSession.accessoryID).to(equal(0)); + expect(controlSession.protocolIndexTimer).to(beNil()); + }); + }); + }); +}); + +QuickSpecEnd diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index 7223c8d0b..41e809a5b 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -15,8 +15,12 @@ #import "SDLIAPTransport.h" #import "SDLIAPSession.h" #import "SDLTimer.h" +#import "SDLIAPControlSession.h" @interface SDLIAPTransport () +@property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; +@property (nullable, strong, nonatomic) SDLIAPSession *session; + @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @@ -42,11 +46,11 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * describe(@"Initialization", ^{ it(@"Should init correctly", ^{ expect(transport.delegate).toNot(beNil()); - expect(transport.controlSession).to(beNil()); + expect(transport.controlSession.session).to(beNil()); expect(transport.session).to(beNil()); expect(transport.sessionSetupInProgress).to(beFalse()); expect(transport.session).to(beNil()); - expect(transport.controlSession).to(beNil()); + expect(transport.controlSession.session).to(beNil()); expect(transport.retryCounter).to(equal(0)); expect(transport.protocolIndexTimer).to(beNil()); expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); @@ -55,10 +59,11 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * describe(@"When an accessory connects while a session is not open", ^{ beforeEach(^{ - transport.session = nil; + expect(transport.controlSession.session).to(beNil()); + expect(transport.session).to(beNil()); }); - it(@"If no session is open, it should create a session when an accessory connects", ^{ + it(@"should return that a session is not active", ^{ BOOL sessionInProgress = [transport sdl_isSessionActive:transport.session newAccessory:mockAccessory]; expect(sessionInProgress).to(beFalse()); }); @@ -69,7 +74,7 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * transport.session = OCMClassMock([SDLIAPSession class]); }); - it(@"If a session is in progress", ^{ + it(@"should return that a session is active", ^{ BOOL sessionInProgress = [transport sdl_isSessionActive:transport.session newAccessory:mockAccessory]; expect(sessionInProgress).to(beTrue()); }); @@ -86,32 +91,33 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * it(@"It should close the open data session", ^{ expect(transport.session).to(beNil()); - expect(transport.controlSession).to(beNil()); + expect(transport.controlSession.session).to(beNil()); expect(transport.retryCounter).to(equal(0)); expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); expect(transport.sessionSetupInProgress).to(beFalse()); }); }); - describe(@"When an accessory disconnects while a control session is open", ^{ - beforeEach(^{ - transport.controlSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.prot0"];; - transport.session = nil; - transport.accessoryConnectDuringActiveSession = NO; - transport.sessionSetupInProgress = YES; - transport.retryCounter = 1; - NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; - [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; - }); - - it(@"It should close the open control session", ^{ - expect(transport.session).to(beNil()); - expect(transport.controlSession).to(beNil()); - expect(transport.retryCounter).to(equal(0)); - expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); - expect(transport.sessionSetupInProgress).to(beFalse()); - }); - }); +// describe(@"When an accessory disconnects while a control session is open", ^{ +// beforeEach(^{ +//// transport.controlSession = [SDLIAPControlSession new]; +// transport.controlSession.session = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.prot0"];; +// transport.session = nil; +// transport.accessoryConnectDuringActiveSession = NO; +// transport.sessionSetupInProgress = YES; +// transport.retryCounter = 1; +// NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; +// [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; +// }); +// +// it(@"It should close the open control session", ^{ +// expect(transport.session).to(beNil()); +// expect(transport.controlSession).to(beNil()); +// expect(transport.retryCounter).to(equal(0)); +// expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); +// expect(transport.sessionSetupInProgress).to(beFalse()); +// }); +// }); }); QuickSpecEnd From db35421bddaf00f02a00f4ddcdb2ce18d786521c Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 17 Apr 2019 14:39:51 -0400 Subject: [PATCH 002/179] Separated data session logic in SDLIAPTransport --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 8 + SmartDeviceLink/SDLIAPControlSession.h | 25 +- SmartDeviceLink/SDLIAPControlSession.m | 89 ++--- SmartDeviceLink/SDLIAPDataSession.h | 42 +++ SmartDeviceLink/SDLIAPDataSession.m | 186 ++++++++++ SmartDeviceLink/SDLIAPTransport.m | 331 +++++++----------- .../iAP/SDLIAPControlSessionSpec.m | 52 +-- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 24 +- 8 files changed, 475 insertions(+), 282 deletions(-) create mode 100644 SmartDeviceLink/SDLIAPDataSession.h create mode 100644 SmartDeviceLink/SDLIAPDataSession.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 4c138431b..37b1e073c 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1364,6 +1364,8 @@ 88C37F632204EBF000901DC6 /* SDLAppServiceData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88C37F612204EBF000901DC6 /* SDLAppServiceData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 88C37F642204EBF000901DC6 /* SDLAppServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C37F622204EBF000901DC6 /* SDLAppServiceData.m */; }; 88D2AAE41F682BB20078D5B2 /* SDLLogConstantsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D2AAE31F682BB20078D5B2 /* SDLLogConstantsSpec.m */; }; + 88D3EBC92267949D00493C38 /* SDLIAPDataSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */; }; + 88D3EBCA2267949D00493C38 /* SDLIAPDataSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */; }; 88D5EB37220CD95000EC3782 /* SDLWeatherServiceData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D5EB35220CD95000EC3782 /* SDLWeatherServiceData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 88D5EB38220CD95000EC3782 /* SDLWeatherServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D5EB36220CD95000EC3782 /* SDLWeatherServiceData.m */; }; 88DF998D22035CC600477AC1 /* EAAccessory+OCMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */; }; @@ -2989,6 +2991,8 @@ 88C37F612204EBF000901DC6 /* SDLAppServiceData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLAppServiceData.h; sourceTree = ""; }; 88C37F622204EBF000901DC6 /* SDLAppServiceData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAppServiceData.m; sourceTree = ""; }; 88D2AAE31F682BB20078D5B2 /* SDLLogConstantsSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLogConstantsSpec.m; sourceTree = ""; }; + 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPDataSession.h; sourceTree = ""; }; + 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPDataSession.m; sourceTree = ""; }; 88D5EB35220CD95000EC3782 /* SDLWeatherServiceData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLWeatherServiceData.h; sourceTree = ""; }; 88D5EB36220CD95000EC3782 /* SDLWeatherServiceData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherServiceData.m; sourceTree = ""; }; 88D6F17D22319FE000D4BFB3 /* SDLRPCRequestNotification.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCRequestNotification.m; sourceTree = ""; }; @@ -5357,6 +5361,8 @@ E9C32B8D1AB20BA200F283AF /* SDLStreamDelegate.m */, 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */, 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */, + 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */, + 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */, ); name = IAP; sourceTree = ""; @@ -6231,6 +6237,7 @@ 5D61FC4F1A84238C00846EE7 /* SDLBodyInformation.h in Headers */, 5D61FDAB1A84238C00846EE7 /* SDLStartTime.h in Headers */, 5D61FD071A84238C00846EE7 /* SDLOnCommand.h in Headers */, + 88D3EBC92267949D00493C38 /* SDLIAPDataSession.h in Headers */, 5D00AC671F140F0A004000D9 /* SDLSystemCapabilityType.h in Headers */, DA9F7E9B1DCC052C00ACAE48 /* SDLLocationDetails.h in Headers */, 5D61FD1D1A84238C00846EE7 /* SDLOnTBTClientState.h in Headers */, @@ -7053,6 +7060,7 @@ 884E701C21FB8D0F008D53BA /* SDLPublishAppService.m in Sources */, 8831FA49220235B000B8FFB7 /* SDLAppServicesCapabilities.m in Sources */, 884E702421FBA952008D53BA /* SDLAppServiceType.m in Sources */, + 88D3EBCA2267949D00493C38 /* SDLIAPDataSession.m in Sources */, 5D61FD2C1A84238C00846EE7 /* SDLPerformInteractionResponse.m in Sources */, 5D00AC7C1F15287E004000D9 /* SDLPhoneCapability.m in Sources */, 5D61FDF21A84238C00846EE7 /* SDLUpdateTurnList.m in Sources */, diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index f09cdae9b..2322ca5d1 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -12,7 +12,6 @@ @class EAAccessory; @class SDLIAPSession; - NS_ASSUME_NONNULL_BEGIN typedef void (^SDLIAPControlSessionRetryCompletionHandler)(BOOL retryEstablishSession); @@ -22,16 +21,34 @@ extern NSString *const ControlProtocolString; extern NSString *const IndexedProtocolStringPrefix; /** - * Session for establishing a connection with Core. Once the connection has been established, the session is closed and a session is established. A `controlSession` is not needed if the head unit supports the multisession protocol string. + * A control session is used by to get the unique protocol string needed to create a session with Core. The control session is only used on legacy head units that do not support the multisession protocol which allows multiple apps to connect over the same protocol string. When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core. */ @interface SDLIAPControlSession : NSObject +/** + * Session for getting the protocol string from Core. The protocol string is the protocol used for communication with the accessory. + */ @property (nullable, strong, nonatomic, readonly) SDLIAPSession *session; + +/** + * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. + */ @property (assign, nonatomic, readonly) NSUInteger accessoryID; -+ (nullable SDLIAPSession *)createSessionWithAccessory:(EAAccessory *)accessory; +- (instancetype)init NS_UNAVAILABLE; -- (void)setSession:(nullable SDLIAPSession *)session delegate:(id)delegate retryCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retryCompletionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler; +/** + * Sets a new control session. + * + * @param session The new control session + * @param retrySessionCompletionHandler A handler called when the control session failed to be established and a new session should be attempted. + * @param createDataSessionCompletionHandler A handler called when control session is successful and a new session must be established with the recevied protocol string. + */ +- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler; + +/** + * Destroys a current session. + */ - (void)destroySession; @end diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index c3ad5d2e2..00776d172 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -14,7 +14,6 @@ #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" #import "SDLTimer.h" -#import NS_ASSUME_NONNULL_BEGIN @@ -28,8 +27,8 @@ @interface SDLIAPControlSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; -@property (nullable, strong, nonatomic) SDLIAPControlSessionRetryCompletionHandler retryCompletionHandler; -@property (nullable, strong, nonatomic) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionCompletionHandler; +@property (nullable, strong, nonatomic) SDLIAPControlSessionRetryCompletionHandler retrySessionHandler; +@property (nullable, strong, nonatomic) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionHandler; @end @@ -48,20 +47,19 @@ - (instancetype)init { return self; } -+ (nullable SDLIAPSession *)createSessionWithAccessory:(EAAccessory *)accessory { - return [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; -} +- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler { -- (void)setSession:(nullable SDLIAPSession *)session delegate:(id)delegate retryCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retryCompletionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { - SDLLogD(@"Starting control session with accessory (%@)", self.session.accessory.name); + self = [super init]; + if (!self) { + return nil; + } self.session = session; - self.retryCompletionHandler = retryCompletionHandler; - self.createDataSessionCompletionHandler = createDataSessionCompletionHandler; + self.retrySessionHandler = retrySessionHandler; + self.createDataSessionHandler = createDataSessionHandler; if (self.session) { - self.session.delegate = delegate; - + SDLLogD(@"Starting control session with accessory (%@)", self.session.accessory.name); EAAccessory *accessory = session.accessory; SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory]; @@ -70,41 +68,26 @@ - (void)setSession:(nullable SDLIAPSession *)session delegate:(id + +@class SDLIAPSession; + +NS_ASSUME_NONNULL_BEGIN + +typedef void (^SDLIAPDataSessionRetryCompletionHandler)(BOOL retryEstablishSession); +typedef void (^SDLIAPDataSessionCreateDataReceivedHandler)(NSData *dataIn); + +extern NSString *const LegacyProtocolString; + +@interface SDLIAPDataSession : NSObject + +/** + * The communications channel between the app and the SDL enabled accessory. + */ +@property (nullable, strong, nonatomic, readonly) SDLIAPSession *session; + +/** + * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. + */ +@property (assign, nonatomic, readonly) NSUInteger accessoryID; + +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler; + +/** + * Destroys a current session. + */ +- (void)destroySession; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m new file mode 100644 index 000000000..8d8266ee4 --- /dev/null +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -0,0 +1,186 @@ +// +// SDLIAPDataSession.m +// SmartDeviceLink +// +// Created by Nicole on 4/17/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLIAPDataSession.h" + +#import "SDLIAPSession.h" +#import "SDLLogMacros.h" +#import "SDLStreamDelegate.h" +#import "SDLGlobals.h" + +NS_ASSUME_NONNULL_BEGIN + +NSString *const LegacyProtocolString = @"com.ford.sync.prot0"; + +@interface SDLIAPDataSession () + +@property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; +@property (nullable, strong, nonatomic) SDLIAPDataSessionRetryCompletionHandler retrySessionHandler; +@property (nullable, strong, nonatomic) SDLIAPDataSessionCreateDataReceivedHandler dataReceivedHandler; + +@end + +@implementation SDLIAPDataSession + +- (instancetype)init { + SDLLogV(@"SDLIAPDataSession Init"); + self = [super init]; + if (!self) { + return nil; + } + + _session = nil; + + return self; +} + +- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { + + self = [super init]; + if (!self) { + return nil; + } + + _session = session; + _retrySessionHandler = retrySessionHandler; + _dataReceivedHandler = dataReceivedHandler; + + if (self.session) { + SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, session.protocol); + SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; + self.session.streamDelegate = ioStreamDelegate; + ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandler]; + ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandler]; + ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandler]; + + if (![self.session start]) { + SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", session.accessory); + self.session.streamDelegate = nil; + self.session = nil; + [self sdl_shouldRetryEstablishSession:YES]; + } + } else { + SDLLogW(@"Failed to setup data session"); + [self sdl_shouldRetryEstablishSession:YES]; + } + + return self; +} + +- (void)destroySession { + if (self.session != nil) { + SDLLogD(@"Destroying data session"); + [self.session stop]; + self.session.streamDelegate = nil; + self.session = nil; + } +} + +#pragma mark Data Stream Handlers + +- (SDLStreamEndHandler)sdl_dataStreamEndedHandler { + __weak typeof(self) weakSelf = self; + return ^(NSStream *stream) { + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); + __strong typeof(weakSelf) strongSelf = weakSelf; + + SDLLogD(@"Data stream ended"); + if (strongSelf.session == nil) { + SDLLogD(@"Data session is nil"); + return; + } + // The handler will be called on the IO thread, but the session stop method must be called on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [strongSelf.session stop]; + strongSelf.session.streamDelegate = nil; + strongSelf.session = nil; + + [strongSelf sdl_shouldRetryEstablishSession:YES]; + }); + + // To prevent deadlocks the handler must return to the runloop and not block the thread + }; +} + +- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { + __weak typeof(self) weakSelf = self; + return ^(NSInputStream *istream) { + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); + __strong typeof(weakSelf) strongSelf = weakSelf; + uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; + while (istream.streamStatus == NSStreamStatusOpen && istream.hasBytesAvailable) { + // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport. + + NSInteger bytesRead = [istream read:buf maxLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; + if (bytesRead < 0) { + SDLLogE(@"Failed to read from data stream"); + break; + } + + NSData *dataIn = [NSData dataWithBytes:buf length:(NSUInteger)bytesRead]; + SDLLogBytes(dataIn, SDLLogBytesDirectionReceive); + + if (bytesRead > 0) { + [strongSelf sdl_sendData:dataIn]; + } else { + break; + } + } + }; +} + +- (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { + __weak typeof(self) weakSelf = self; + return ^(NSStream *stream) { + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); + __strong typeof(weakSelf) strongSelf = weakSelf; + SDLLogE(@"Data stream error"); + dispatch_async(dispatch_get_main_queue(), ^{ + [strongSelf.session stop]; + strongSelf.session.streamDelegate = nil; + strongSelf.session = nil; + if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { + [strongSelf sdl_shouldRetryEstablishSession:YES]; + } + }); + + // To prevent deadlocks the handler must return to the runloop and not block the thread + }; +} + +#pragma mark - Helpers +- (void)sdl_shouldRetryEstablishSession:(BOOL)retryEstablishSession { + if (self.retrySessionHandler == nil) { + return; + } + + self.retrySessionHandler(retryEstablishSession); +} + +- (void)sdl_sendData:(NSData *)data { + if (self.dataReceivedHandler == nil) { + return; + } + + self.dataReceivedHandler(data); +} + +- (NSUInteger)accessoryID { + return self.session.accessory.connectionID; +} + +#pragma mark - Lifecycle Destruction + +- (void)dealloc { + SDLLogV(@"SDLIAPDataSession Dealloc"); + _session = nil; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index ee75d1fd5..2715f9e7f 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -1,5 +1,4 @@ // SDLIAPTransport.h -// #import @@ -11,6 +10,7 @@ #import "EAAccessoryManager+SDLProtocols.h" #import "SDLGlobals.h" #import "SDLIAPControlSession.h" +#import "SDLIAPDataSession.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" @@ -20,33 +20,27 @@ NS_ASSUME_NONNULL_BEGIN -NSString *const LegacyProtocolString = @"com.ford.sync.prot0"; -// NSString *const ControlProtocolString = @"com.smartdevicelink.prot0"; -// NSString *const IndexedProtocolStringPrefix = @"com.smartdevicelink.prot"; NSString *const MultiSessionProtocolString = @"com.smartdevicelink.multisession"; NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; int const CreateSessionRetries = 3; -//int const ProtocolIndexTimeoutSeconds = 10; @interface SDLIAPTransport () { BOOL _alreadyDestructed; } -// Session for getting the index protocol string used to connect to the head unit. Legacy head units will connect with an index procol string, newer ones will connect with the multisession protocol string. Once the protocol string is received from Core, the control session is closed and a data session is established. @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; - -// Session for transporting data between the app and Core. -@property (nullable, strong, nonatomic) SDLIAPSession *session; - +@property (nullable, strong, nonatomic) SDLIAPDataSession *dataSession; @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; -@property (nonatomic, copy, nullable) SDLIAPControlSessionRetryCompletionHandler retryCompletionHandler; +@property (nonatomic, copy, nullable) SDLIAPControlSessionRetryCompletionHandler retryControlSessionHandler; @property (nonatomic, copy, nullable) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionCompletionHandler; +@property (nullable, strong, nonatomic) SDLIAPDataSessionRetryCompletionHandler retryDataSessionHandler; +@property (nullable, strong, nonatomic) SDLIAPDataSessionCreateDataReceivedHandler dataReceivedHandler; @end @@ -58,8 +52,8 @@ - (instancetype)init { if (self = [super init]) { _alreadyDestructed = NO; _sessionSetupInProgress = NO; - _session = nil; - _controlSession = [[SDLIAPControlSession alloc] init]; + _dataSession = nil; + _controlSession = nil; _retryCounter = 0; _protocolIndexTimer = nil; _accessoryConnectDuringActiveSession = NO; @@ -80,7 +74,7 @@ - (instancetype)init { */ - (void)sdl_backgroundTaskStart { if (self.backgroundTaskId != UIBackgroundTaskInvalid) { - SDLLogV(@"A background task is already running. No need to start a background task. Returning..."); + SDLLogV(@"A background task is already running. No need to start a background task."); return; } @@ -107,7 +101,6 @@ - (void)sdl_backgroundTaskEnd { } #pragma mark - Notifications -#pragma mark Subscription /** * Registers for system notifications about connected accessories and the app life cycle. @@ -151,7 +144,7 @@ - (void)sdl_stopEventListening { - (void)sdl_accessoryConnected:(NSNotification *)notification { EAAccessory *newAccessory = [notification.userInfo objectForKey:EAAccessoryKey]; - if ([self sdl_isSessionActive:self.session newAccessory:newAccessory]) { + if ([self sdl_isSessionActive:self.dataSession.session newAccessory:newAccessory]) { self.accessoryConnectDuringActiveSession = YES; return; } @@ -198,20 +191,17 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { self.accessoryConnectDuringActiveSession = NO; } - if (self.controlSession.session == nil && self.session == nil) { - // No connection has yet been established so we will not destroy the current session. The current session needs to watch for accessory connections. + if (self.controlSession.session == nil && self.dataSession == nil) { + // No connection has yet been established so we will not destroy the current session as it needs to watch for accessory connections. SDLLogV(@"Accessory (%@), disconnected, but no session is in progress", accessory.serialNumber); - SDLLogE(@"DEBUG - Will not destroy session"); } else if (accessory.connectionID == self.controlSession.accessoryID) { - // The data session has yet been established so we will not destroy the current session. The current session needs to watch for accessory connections. + // The data session has yet been established so we will only destroy the control session. SDLLogV(@"Accessory (%@) disconnected during a control session", accessory.serialNumber); - SDLLogE(@"DEBUG - Will not destroy session"); self.retryCounter = 0; self.sessionSetupInProgress = NO; - [self.controlSession destroySession]; - } else if (accessory.connectionID == self.session.accessory.connectionID) { - // The data session has been established so we will destroy the current session and let the lifecycle manager create a new session. + } else if (accessory.connectionID == self.dataSession.accessoryID) { + // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@) disconnected during a data session", accessory.serialNumber); [self sdl_destroySession]; } else { @@ -269,12 +259,12 @@ - (void)connect { * @param accessory The accessory to attempt connection with or nil to scan for accessories. */ - (void)sdl_connect:(nullable EAAccessory *)accessory { - if (!self.session && !self.sessionSetupInProgress) { + if (!self.dataSession && !self.sessionSetupInProgress) { // We don't have a session are not attempting to set one up, attempt to connect SDLLogV(@"Session not setup, starting setup"); self.sessionSetupInProgress = YES; [self sdl_establishSessionWithAccessory:accessory]; - } else if (self.session) { + } else if (self.dataSession) { // Session already established SDLLogV(@"Session already established"); } else { @@ -291,17 +281,27 @@ - (void)disconnect { [self sdl_stopEventListening]; if (self.controlSession != nil) { [self.controlSession destroySession]; - } else if (self.session != nil) { - SDLLogD(@"Disconnecting data session"); - [self.session stop]; - self.session.streamDelegate = nil; - self.session = nil; + } else if (self.dataSession != nil) { + [self.dataSession destroySession]; } } #pragma mark - Creating Session Streams ++ (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory sessionDelegate:(id)sessionDelegate { + SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; + session.delegate = sessionDelegate; + return session; +} + + ++ (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { + SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; + session.delegate = sessionDelegate; + return session; +} + /** * Attempt to connect an accessory using the control or legacy protocols, then return whether or not we've generated an IAP session. * @@ -318,41 +318,75 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { } if ([accessory supportsProtocol:MultiSessionProtocolString] && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - [self sdl_createIAPDataSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; + self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; connecting = YES; } else if ([accessory supportsProtocol:ControlProtocolString]) { - SDLIAPSession *session = [SDLIAPControlSession createSessionWithAccessory:accessory]; - [self.controlSession setSession:session delegate:self retryCompletionHandler:self.retryCompletionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory sessionDelegate:self]; + self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; connecting = YES; } else if ([accessory supportsProtocol:LegacyProtocolString]) { - [self sdl_createIAPDataSessionWithAccessory:accessory forProtocol:LegacyProtocolString]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory forProtocol:LegacyProtocolString sessionDelegate:self]; + self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; connecting = YES; } return connecting; } -- (nullable SDLIAPControlSessionRetryCompletionHandler)retryCompletionHandler { - if (!_retryCompletionHandler) { +#pragma mark - Session Handlers + +#pragma mark Control Session Handlers + +- (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandler { + if (!_retryControlSessionHandler) { __weak typeof(self) weakSelf = self; - self.retryCompletionHandler = ^(BOOL retryEstablishSession) { + self.retryControlSessionHandler = ^(BOOL retryEstablishSession) { [weakSelf sdl_retryEstablishSession]; }; } - return _retryCompletionHandler; + return _retryControlSessionHandler; } - (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { if (!_createDataSessionCompletionHandler) { __weak typeof(self) weakSelf = self; self.createDataSessionCompletionHandler = ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - [weakSelf sdl_createIAPDataSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString]; + SDLIAPSession *session = [weakSelf.class sdl_createSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString sessionDelegate:weakSelf]; + weakSelf.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:weakSelf.retryDataSessionHandler dataReceivedCompletionHandler:weakSelf.dataReceivedHandler]; }; } return _createDataSessionCompletionHandler; } + +#pragma mark Data Session Handlers + +- (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { + if (!_retryDataSessionHandler) { + __weak typeof(self) weakSelf = self; + self.retryDataSessionHandler = ^(BOOL retryEstablishSession) { + [weakSelf sdl_retryEstablishSession]; + }; + } + + return _retryDataSessionHandler; +} + +- (nullable SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { + if (!_dataReceivedHandler) { + __weak typeof(self) weakSelf = self; + self.dataReceivedHandler = ^(NSData * _Nonnull dataIn) { + [weakSelf.delegate onDataReceived:dataIn]; + }; + } + + return _dataReceivedHandler; +} + +#pragma mark - Helpers + /** Check all required protocol strings in the info.plist dictionary. @@ -406,12 +440,14 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { // Determine if we can start a multi-app session or a legacy (single-app) session if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - [self sdl_createIAPDataSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; + self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { - SDLIAPSession *session = [SDLIAPControlSession createSessionWithAccessory:sdlAccessory]; - [self.controlSession setSession:session delegate:self retryCompletionHandler:self.retryCompletionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory sessionDelegate:self]; + self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { - [self sdl_createIAPDataSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; + self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; } else { // No compatible accessory SDLLogV(@"No accessory supporting SDL was found, dismissing setup"); @@ -424,52 +460,63 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { } } -- (void)sdl_createIAPDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol { - SDLLogD(@"Starting data session (%@:%@)", protocol, accessory); - self.session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; - if (self.session) { - self.session.delegate = self; - - SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; - self.session.streamDelegate = ioStreamDelegate; - ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandler]; - ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandler]; - ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandler]; - - if (![self.session start]) { - SDLLogW(@"Data session failed to setup (%@)", accessory); - self.session.streamDelegate = nil; - self.session = nil; - [self sdl_retryEstablishSession]; - } - } else { - SDLLogW(@"Failed to setup data session (%@)", accessory); - [self sdl_retryEstablishSession]; - } -} - - (void)sdl_retryEstablishSession { - SDLLogE(@"DEBUG - control session ended.."); // Current strategy disallows automatic retries. self.sessionSetupInProgress = NO; - if (self.session != nil) { - [self.session stop]; - self.session.delegate = nil; - self.session = nil; - SDLLogE(@"DEBUG - setting stuff to nil.."); - } - + [self.controlSession destroySession]; + [self.dataSession destroySession]; + // Search connected accessories [self sdl_connect:nil]; } +- (double)sdl_retryDelay { + const double MinRetrySeconds = 1.5; + const double MaxRetrySeconds = 9.5; + double RetryRangeSeconds = MaxRetrySeconds - MinRetrySeconds; + + static double appDelaySeconds = 0; + + // HAX: This pull the app name and hashes it in an attempt to provide a more even distribution of retry delays. The evidence that this does so is anecdotal. A more ideal solution would be to use a list of known, installed SDL apps on the phone to try and deterministically generate an even delay. + if (appDelaySeconds == 0) { + NSString *appName = [[NSProcessInfo processInfo] processName]; + if (appName == nil) { + appName = @"noname"; + } + + // Run the app name through an md5 hasher + const char *ptr = [appName UTF8String]; + unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH]; + CC_MD5(ptr, (unsigned int)strlen(ptr), md5Buffer); + + // Generate a string of the hex hash + NSMutableString *output = [NSMutableString stringWithString:@"0x"]; + for (int i = 0; i < 8; i++) { + [output appendFormat:@"%02X", md5Buffer[i]]; + } + + // Transform the string into a number between 0 and 1 + unsigned long long firstHalf; + NSScanner *pScanner = [NSScanner scannerWithString:output]; + [pScanner scanHexLongLong:&firstHalf]; + double hashBasedValueInRange0to1 = ((double)firstHalf) / 0xffffffffffffffff; + + // Transform the number into a number between min and max + appDelaySeconds = ((RetryRangeSeconds * hashBasedValueInRange0to1) + MinRetrySeconds); + } + + return appDelaySeconds; +} + +#pragma mark - SDLIAPSessionDelegate + // This gets called after both I/O streams of the session have opened. - (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { // Control Session Opened if ([ControlProtocolString isEqualToString:session.protocol]) { SDLLogD(@"Control Session Established"); - if (!self.session) { + if (!self.dataSession) { [self.protocolIndexTimer start]; } } @@ -482,145 +529,25 @@ - (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { } } - -#pragma mark - Session End - // Retry establishSession on Stream End events only if it was the control session and we haven't already connected on non-control protocol - (void)onSessionStreamsEnded:(SDLIAPSession *)session { SDLLogV(@"Session streams ended (%@)", session.protocol); - if (!self.session && [ControlProtocolString isEqualToString:session.protocol]) { + if (!self.dataSession && [ControlProtocolString isEqualToString:session.protocol]) { [session stop]; [self sdl_retryEstablishSession]; } } - #pragma mark - Data Transmission - (void)sendData:(NSData *)data { - if (self.session == nil || !self.session.accessory.connected) { + if (self.dataSession.session == nil || !self.dataSession.session.accessory.connected) { return; } - - [self.session sendData:data]; -} - - -#pragma mark - Stream Handlers - -#pragma mark Data Stream -- (SDLStreamEndHandler)sdl_dataStreamEndedHandler { - __weak typeof(self) weakSelf = self; - return ^(NSStream *stream) { - NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - __strong typeof(weakSelf) strongSelf = weakSelf; - - SDLLogD(@"Data stream ended"); - if (strongSelf.session == nil) { - SDLLogD(@"Data session is nil"); - return; - } - // The handler will be called on the IO thread, but the session stop method must be called on the main thread - dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; - - [strongSelf sdl_retryEstablishSession]; - }); - - // To prevent deadlocks the handler must return to the runloop and not block the thread - }; + [self.dataSession.session sendData:data]; } -- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { - __weak typeof(self) weakSelf = self; - return ^(NSInputStream *istream) { - NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - __strong typeof(weakSelf) strongSelf = weakSelf; - uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; - while (istream.streamStatus == NSStreamStatusOpen && istream.hasBytesAvailable) { - // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport. - - NSInteger bytesRead = [istream read:buf maxLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; - if (bytesRead < 0) { - SDLLogE(@"Failed to read from data stream"); - break; - } - - NSData *dataIn = [NSData dataWithBytes:buf length:(NSUInteger)bytesRead]; - SDLLogBytes(dataIn, SDLLogBytesDirectionReceive); - - if (bytesRead > 0) { - [strongSelf.delegate onDataReceived:dataIn]; - } else { - break; - } - } - - [strongSelf sdl_backgroundTaskStart]; - }; -} - -- (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { - __weak typeof(self) weakSelf = self; - return ^(NSStream *stream) { - NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - __strong typeof(weakSelf) strongSelf = weakSelf; - SDLLogE(@"Data stream error"); - dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; - if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { - [strongSelf sdl_retryEstablishSession]; - } - }); - - // To prevent deadlocks the handler must return to the runloop and not block the thread - }; -} - -- (double)sdl_retryDelay { - const double MinRetrySeconds = 1.5; - const double MaxRetrySeconds = 9.5; - double RetryRangeSeconds = MaxRetrySeconds - MinRetrySeconds; - - static double appDelaySeconds = 0; - - // HAX: This pull the app name and hashes it in an attempt to provide a more even distribution of retry delays. The evidence that this does so is anecdotal. A more ideal solution would be to use a list of known, installed SDL apps on the phone to try and deterministically generate an even delay. - if (appDelaySeconds == 0) { - NSString *appName = [[NSProcessInfo processInfo] processName]; - if (appName == nil) { - appName = @"noname"; - } - - // Run the app name through an md5 hasher - const char *ptr = [appName UTF8String]; - unsigned char md5Buffer[CC_MD5_DIGEST_LENGTH]; - CC_MD5(ptr, (unsigned int)strlen(ptr), md5Buffer); - - // Generate a string of the hex hash - NSMutableString *output = [NSMutableString stringWithString:@"0x"]; - for (int i = 0; i < 8; i++) { - [output appendFormat:@"%02X", md5Buffer[i]]; - } - - // Transform the string into a number between 0 and 1 - unsigned long long firstHalf; - NSScanner *pScanner = [NSScanner scannerWithString:output]; - [pScanner scanHexLongLong:&firstHalf]; - double hashBasedValueInRange0to1 = ((double)firstHalf) / 0xffffffffffffffff; - - // Transform the number into a number between min and max - appDelaySeconds = ((RetryRangeSeconds * hashBasedValueInRange0to1) + MinRetrySeconds); - } - - return appDelaySeconds; -} - - #pragma mark - Lifecycle Destruction - (void)sdl_destructObjects { @@ -628,7 +555,7 @@ - (void)sdl_destructObjects { [self sdl_backgroundTaskEnd]; _alreadyDestructed = YES; self.controlSession = nil; - self.session = nil; + self.dataSession = nil; self.delegate = nil; self.sessionSetupInProgress = NO; self.accessoryConnectDuringActiveSession = NO; @@ -636,9 +563,9 @@ - (void)sdl_destructObjects { } - (void)dealloc { + SDLLogV(@"SDLIAPTransport dealloc"); [self disconnect]; [self sdl_destructObjects]; - SDLLogD(@"SDLIAPTransport dealloc"); } @end diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index f15c93bd0..30507f20d 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -12,11 +12,19 @@ #import "EAAccessory+OCMock.m" #import "SDLIAPControlSession.h" -#import "SDLTimer.h" #import "SDLIAPSession.h" +#import "SDLTimer.h" + +//#import "SDLIAPControlSession.h" + +//@interface SDLIAPControlSession () +//@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; +//@end -@interface SDLIAPControlSession () +@interface SDLIAPControlSession() @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; +@property (nullable, strong, nonatomic) SDLIAPControlSessionRetryCompletionHandler retrySessionHandler; +@property (nullable, strong, nonatomic) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionHandler; @end QuickSpecBegin(SDLIAPControlSessionSpec) @@ -39,33 +47,25 @@ @interface SDLIAPControlSession () }); }); - describe(@"Creating a session", ^{ - __block SDLIAPSession *session = nil; - - beforeEach(^{ - session = [SDLIAPControlSession createSessionWithAccessory:mockAccessory]; - }); - - it(@"Should init correctly", ^{ - expect(session).toNot(beNil()); - }); - }); - describe(@"Setting a session", ^{ __block SDLIAPSession *session = nil; + __block BOOL retryHandlerCalled = nil; + __block BOOL createDataSessionHandlerCalled = nil; beforeEach(^{ session = nil; + retryHandlerCalled = NO; + createDataSessionHandlerCalled = NO; }); describe(@"When a session starts successfully", ^{ beforeEach(^{ session = OCMClassMock([SDLIAPSession class]); OCMStub([session start]).andReturn(YES); - [controlSession setSession:session delegate:mockSessionDelegate retryCompletionHandler:^(BOOL retryEstablishSession) { - //TODO + [controlSession setSession:session retryCompletionHandler:^(BOOL retryEstablishSession) { + retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - //TODO + createDataSessionHandlerCalled = YES; }]; }); @@ -73,6 +73,8 @@ @interface SDLIAPControlSession () expect(controlSession.session).toNot(beNil()); expect(controlSession.accessoryID).toNot(beNil()); expect(controlSession.protocolIndexTimer).toNot(beNil()); + expect(retryHandlerCalled).to(beFalse()); + expect(createDataSessionHandlerCalled).to(beFalse()); }); }); @@ -80,10 +82,10 @@ @interface SDLIAPControlSession () beforeEach(^{ session = OCMClassMock([SDLIAPSession class]); OCMStub([session start]).andReturn(NO); - [controlSession setSession:session delegate:mockSessionDelegate retryCompletionHandler:^(BOOL retryEstablishSession) { - expect(retryEstablishSession).to(beTrue()); + [controlSession setSession:session retryCompletionHandler:^(BOOL retryEstablishSession) { + retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - //TODO + createDataSessionHandlerCalled = YES; }]; }); @@ -91,16 +93,18 @@ @interface SDLIAPControlSession () expect(controlSession.session).to(beNil()); expect(controlSession.accessoryID).to(equal(0)); expect(controlSession.protocolIndexTimer).to(beNil()); + expect(retryHandlerCalled).to(beTrue()); + expect(createDataSessionHandlerCalled).to(beFalse()); }); }); describe(@"When a session is nil", ^{ beforeEach(^{ session = nil; - [controlSession setSession:session delegate:mockSessionDelegate retryCompletionHandler:^(BOOL retryEstablishSession) { - expect(retryEstablishSession).to(beTrue()); + [controlSession setSession:session retryCompletionHandler:^(BOOL retryEstablishSession) { + retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - //TODO + createDataSessionHandlerCalled = YES; }]; }); @@ -108,6 +112,8 @@ @interface SDLIAPControlSession () expect(controlSession.session).to(beNil()); expect(controlSession.accessoryID).to(equal(0)); expect(controlSession.protocolIndexTimer).to(beNil()); + expect(retryHandlerCalled).to(beTrue()); + expect(createDataSessionHandlerCalled).to(beFalse()); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index 41e809a5b..b250fe9c5 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -19,7 +19,7 @@ @interface SDLIAPTransport () @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; -@property (nullable, strong, nonatomic) SDLIAPSession *session; +@property (nullable, strong, nonatomic) SDLIAPSession *dataSession; @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; @@ -47,9 +47,9 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * it(@"Should init correctly", ^{ expect(transport.delegate).toNot(beNil()); expect(transport.controlSession.session).to(beNil()); - expect(transport.session).to(beNil()); + expect(transport.dataSession).to(beNil()); expect(transport.sessionSetupInProgress).to(beFalse()); - expect(transport.session).to(beNil()); + expect(transport.dataSession).to(beNil()); expect(transport.controlSession.session).to(beNil()); expect(transport.retryCounter).to(equal(0)); expect(transport.protocolIndexTimer).to(beNil()); @@ -60,22 +60,22 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * describe(@"When an accessory connects while a session is not open", ^{ beforeEach(^{ expect(transport.controlSession.session).to(beNil()); - expect(transport.session).to(beNil()); + expect(transport.dataSession).to(beNil()); }); it(@"should return that a session is not active", ^{ - BOOL sessionInProgress = [transport sdl_isSessionActive:transport.session newAccessory:mockAccessory]; + BOOL sessionInProgress = [transport sdl_isSessionActive:transport.dataSession newAccessory:mockAccessory]; expect(sessionInProgress).to(beFalse()); }); }); describe(@"When an accessory connects when a session is already open", ^{ beforeEach(^{ - transport.session = OCMClassMock([SDLIAPSession class]); + transport.dataSession = OCMClassMock([SDLIAPSession class]); }); it(@"should return that a session is active", ^{ - BOOL sessionInProgress = [transport sdl_isSessionActive:transport.session newAccessory:mockAccessory]; + BOOL sessionInProgress = [transport sdl_isSessionActive:transport.dataSession newAccessory:mockAccessory]; expect(sessionInProgress).to(beTrue()); }); }); @@ -83,14 +83,14 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * describe(@"When an accessory disconnects while a data session is open", ^{ beforeEach(^{ transport.controlSession = nil; - transport.session = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.multisession"]; + transport.dataSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.multisession"]; transport.accessoryConnectDuringActiveSession = YES; NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; }); it(@"It should close the open data session", ^{ - expect(transport.session).to(beNil()); + expect(transport.dataSession).to(beNil()); expect(transport.controlSession.session).to(beNil()); expect(transport.retryCounter).to(equal(0)); expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); @@ -98,9 +98,9 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * }); }); -// describe(@"When an accessory disconnects while a control session is open", ^{ + describe(@"When an accessory disconnects while a control session is open", ^{ // beforeEach(^{ -//// transport.controlSession = [SDLIAPControlSession new]; +// transport.controlSession = [SDLIAPControlSession new]; // transport.controlSession.session = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.prot0"];; // transport.session = nil; // transport.accessoryConnectDuringActiveSession = NO; @@ -117,7 +117,7 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * // expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); // expect(transport.sessionSetupInProgress).to(beFalse()); // }); -// }); + }); }); QuickSpecEnd From ad886851e8faae45723d3c9a226189e8c8fe41f3 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 18 Apr 2019 10:30:46 -0400 Subject: [PATCH 003/179] Fixed control/data sessions not reconnecting --- Example Apps/Example ObjC/ProxyManager.m | 5 -- Example Apps/Example Swift/ProxyManager.swift | 6 -- Example Apps/Shared/AppConstants.h | 1 - Example Apps/Shared/AppConstants.m | 1 - SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 8 ++ SmartDeviceLink/SDLIAPConstants.h | 16 ++++ SmartDeviceLink/SDLIAPConstants.m | 14 +++ SmartDeviceLink/SDLIAPControlSession.h | 17 ++-- SmartDeviceLink/SDLIAPControlSession.m | 41 +++++---- SmartDeviceLink/SDLIAPDataSession.h | 11 ++- SmartDeviceLink/SDLIAPDataSession.m | 32 +++---- SmartDeviceLink/SDLIAPSession.m | 2 +- SmartDeviceLink/SDLIAPTransport.m | 86 ++++++++++--------- 13 files changed, 139 insertions(+), 101 deletions(-) create mode 100644 SmartDeviceLink/SDLIAPConstants.h create mode 100644 SmartDeviceLink/SDLIAPConstants.m diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m index a510c79ee..7a80de34b 100644 --- a/Example Apps/Example ObjC/ProxyManager.m +++ b/Example Apps/Example ObjC/ProxyManager.m @@ -227,11 +227,6 @@ - (BOOL)sdlex_imageFieldSupported:(SDLImageFieldName)imageFieldName { - (void)managerDidDisconnect { [self sdlex_updateProxyState:ProxyStateStopped]; self.firstHMILevel = SDLHMILevelNone; - - // If desired, automatically start searching for a new connection to Core - if (ExampleAppShouldRestartSDLManagerOnDisconnect) { - [self startManager]; - } } - (void)hmiLevel:(SDLHMILevel)oldLevel didChangeToLevel:(SDLHMILevel)newLevel { diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift index 3b0ca25a4..485b90138 100644 --- a/Example Apps/Example Swift/ProxyManager.swift +++ b/Example Apps/Example Swift/ProxyManager.swift @@ -119,7 +119,6 @@ private extension ProxyManager { sdlManager.start(readyHandler: { [unowned self] (success, error) in guard success else { SDLLog.e("There was an error while starting up: \(String(describing: error))") - self.resetConnection() return } @@ -143,11 +142,6 @@ extension ProxyManager: SDLManagerDelegate { func managerDidDisconnect() { delegate?.didChangeProxyState(ProxyState.stopped) firstHMILevelState = .none - - // If desired, automatically start searching for a new connection to Core - if ExampleAppShouldRestartSDLManagerOnDisconnect.boolValue { - startManager() - } } /// Called when the state of the SDL app has changed. The state limits the type of RPC that can be sent. Refer to the class documentation for each RPC to determine what state(s) the RPC can be sent. diff --git a/Example Apps/Shared/AppConstants.h b/Example Apps/Shared/AppConstants.h index 1c557c969..e8b1aaaf1 100644 --- a/Example Apps/Shared/AppConstants.h +++ b/Example Apps/Shared/AppConstants.h @@ -15,7 +15,6 @@ extern NSString * const ExampleAppName; extern NSString * const ExampleAppNameShort; extern NSString * const ExampleAppNameTTS; extern NSString * const ExampleFullAppId; -extern BOOL const ExampleAppShouldRestartSDLManagerOnDisconnect; #pragma mark - SDL Textfields extern NSString * const SmartDeviceLinkText; diff --git a/Example Apps/Shared/AppConstants.m b/Example Apps/Shared/AppConstants.m index c96464d63..7e81eba13 100644 --- a/Example Apps/Shared/AppConstants.m +++ b/Example Apps/Shared/AppConstants.m @@ -13,7 +13,6 @@ NSString * const ExampleAppNameShort = @"SDL"; NSString * const ExampleAppNameTTS = @"S D L Example App"; NSString * const ExampleFullAppId = @"123e4567-e89b-12d3-a456-426655440000"; // Dummy App Id -BOOL const ExampleAppShouldRestartSDLManagerOnDisconnect = NO; #pragma mark - SDL Textfields NSString * const SmartDeviceLinkText = @"SmartDeviceLink (SDL)"; diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 37b1e073c..89d7c79ff 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1229,6 +1229,8 @@ 880E35B42088F75A00181259 /* SDLSystemCapabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 880E35B22088F75A00181259 /* SDLSystemCapabilityManager.m */; }; 880E35B52088F75A00181259 /* SDLSystemCapabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 880E35B32088F75A00181259 /* SDLSystemCapabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 880E35B82088F78E00181259 /* SDLSystemCapabilityManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 880E35B72088F78E00181259 /* SDLSystemCapabilityManagerSpec.m */; }; + 880FE6272267AE5300723732 /* SDLIAPConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 880FE6252267AE5300723732 /* SDLIAPConstants.h */; }; + 880FE6282267AE5300723732 /* SDLIAPConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 880FE6262267AE5300723732 /* SDLIAPConstants.m */; }; 8815D0EF22330753000F24E6 /* SDLRPCRequestNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D6F17E22319FE000D4BFB3 /* SDLRPCRequestNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8815D0F022330765000F24E6 /* SDLRPCRequestNotificationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C23E8522297BD500EA171F /* SDLRPCRequestNotificationSpec.m */; }; 8815D0F122330781000F24E6 /* SDLRPCRequestNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D6F17D22319FE000D4BFB3 /* SDLRPCRequestNotification.m */; }; @@ -2863,6 +2865,8 @@ 880E35B22088F75A00181259 /* SDLSystemCapabilityManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityManager.m; sourceTree = ""; }; 880E35B32088F75A00181259 /* SDLSystemCapabilityManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLSystemCapabilityManager.h; sourceTree = ""; }; 880E35B72088F78E00181259 /* SDLSystemCapabilityManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityManagerSpec.m; sourceTree = ""; }; + 880FE6252267AE5300723732 /* SDLIAPConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPConstants.h; sourceTree = ""; }; + 880FE6262267AE5300723732 /* SDLIAPConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPConstants.m; sourceTree = ""; }; 8816772822208B82001FACFF /* SDLNavigationInstructionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLNavigationInstructionSpec.m; sourceTree = ""; }; 8816772A222097C3001FACFF /* SDLNavigationServiceData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLNavigationServiceData.h; sourceTree = ""; }; 8816772B222097C3001FACFF /* SDLNavigationServiceData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLNavigationServiceData.m; sourceTree = ""; }; @@ -5363,6 +5367,8 @@ 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */, 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */, 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */, + 880FE6252267AE5300723732 /* SDLIAPConstants.h */, + 880FE6262267AE5300723732 /* SDLIAPConstants.m */, ); name = IAP; sourceTree = ""; @@ -6151,6 +6157,7 @@ E9C32B911AB20BA200F283AF /* SDLIAPSession.h in Headers */, 5D61FCD71A84238C00846EE7 /* SDLInteractionMode.h in Headers */, 8881AFBE2225E9BB00EA870B /* SDLGetCloudAppPropertiesResponse.h in Headers */, + 880FE6272267AE5300723732 /* SDLIAPConstants.h in Headers */, 5D61FC391A84238C00846EE7 /* SDLAlertManeuver.h in Headers */, 5D61FC861A84238C00846EE7 /* SDLDeviceStatus.h in Headers */, DA0C46AF1DCD41E30001F2A8 /* SDLMacros.h in Headers */, @@ -7009,6 +7016,7 @@ 5D61FD3C1A84238C00846EE7 /* SDLPresetBankCapabilities.m in Sources */, 5D4631151F2136B60092EFDC /* SDLControlFramePayloadNak.m in Sources */, 5D61FDB81A84238C00846EE7 /* SDLSyncPData.m in Sources */, + 880FE6282267AE5300723732 /* SDLIAPConstants.m in Sources */, 5D61FD221A84238C00846EE7 /* SDLOnVehicleData.m in Sources */, 5D61FCD41A84238C00846EE7 /* SDLImageResolution.m in Sources */, 5D61FDF41A84238C00846EE7 /* SDLUpdateTurnListResponse.m in Sources */, diff --git a/SmartDeviceLink/SDLIAPConstants.h b/SmartDeviceLink/SDLIAPConstants.h new file mode 100644 index 000000000..54c5d9eae --- /dev/null +++ b/SmartDeviceLink/SDLIAPConstants.h @@ -0,0 +1,16 @@ +// +// SDLIAPConstants.h +// SmartDeviceLink +// +// Created by Nicole on 4/17/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +extern NSString *const ControlProtocolString; +extern NSString *const IndexedProtocolStringPrefix; +extern NSString *const LegacyProtocolString; +extern NSString *const MultiSessionProtocolString; + + diff --git a/SmartDeviceLink/SDLIAPConstants.m b/SmartDeviceLink/SDLIAPConstants.m new file mode 100644 index 000000000..3990d7686 --- /dev/null +++ b/SmartDeviceLink/SDLIAPConstants.m @@ -0,0 +1,14 @@ +// +// SDLIAPConstants.m +// SmartDeviceLink +// +// Created by Nicole on 4/17/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLIAPConstants.h" + +NSString *const ControlProtocolString = @"com.smartdevicelink.prot0"; +NSString *const IndexedProtocolStringPrefix = @"com.smartdevicelink.prot"; +NSString *const LegacyProtocolString = @"com.ford.sync.prot0"; +NSString *const MultiSessionProtocolString = @"com.smartdevicelink.multisession"; diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 2322ca5d1..77ceefb4a 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -17,9 +17,6 @@ NS_ASSUME_NONNULL_BEGIN typedef void (^SDLIAPControlSessionRetryCompletionHandler)(BOOL retryEstablishSession); typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccessory *connectedaccessory, NSString *indexedProtocolString); -extern NSString *const ControlProtocolString; -extern NSString *const IndexedProtocolStringPrefix; - /** * A control session is used by to get the unique protocol string needed to create a session with Core. The control session is only used on legacy head units that do not support the multisession protocol which allows multiple apps to connect over the same protocol string. When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core. */ @@ -35,6 +32,11 @@ extern NSString *const IndexedProtocolStringPrefix; */ @property (assign, nonatomic, readonly) NSUInteger accessoryID; +/** + * Returns whether the session has open I/O streams. + */ +@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress; + - (instancetype)init NS_UNAVAILABLE; /** @@ -47,9 +49,14 @@ extern NSString *const IndexedProtocolStringPrefix; - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler; /** - * Destroys a current session. + * Stops a current session. + */ +- (void)stopSession; + +/** + * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed. */ -- (void)destroySession; +- (void)startSessionTimer; @end diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 00776d172..2dc68e779 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -10,6 +10,7 @@ #import "EAAccessory+SDLProtocols.h" #import "EAAccessoryManager+SDLProtocols.h" +#import "SDLIAPConstants.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" @@ -18,9 +19,6 @@ NS_ASSUME_NONNULL_BEGIN -NSString *const ControlProtocolString = @"com.smartdevicelink.prot0"; -NSString *const IndexedProtocolStringPrefix = @"com.smartdevicelink.prot"; - int const ProtocolIndexTimeoutSeconds = 10; @interface SDLIAPControlSession () @@ -69,8 +67,7 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo if (![self.session start]) { SDLLogW(@"Control session failed to setup with accessory: %@. Retrying...", accessory); - self.session.streamDelegate = nil; - self.session = nil; + [self stopSession]; [self sdl_shouldRetryEstablishSession:YES]; } else { SDLLogW(@"Control session started"); @@ -90,15 +87,22 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo return self; } -- (void)destroySession { +- (void)stopSession { if (self.session != nil) { - SDLLogD(@"Destroying control session"); + SDLLogD(@"Stopping the control session"); [self.session stop]; self.session.streamDelegate = nil; - self.session = nil; + + // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. } } +- (void)startSessionTimer { + if (!self.protocolIndexTimer) { return; } + + [self.protocolIndexTimer start]; +} + #pragma mark - Control Stream Handlers - (SDLStreamEndHandler)sdl_controlStreamEndedHandler { @@ -111,9 +115,7 @@ - (SDLStreamEndHandler)sdl_controlStreamEndedHandler { // End events come in pairs, only perform this once per set. if (strongSelf.session != nil) { [strongSelf.protocolIndexTimer cancel]; - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; + [strongSelf stopSession]; [strongSelf sdl_shouldRetryEstablishSession:YES]; } }; @@ -140,9 +142,7 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce // Destroy the control session as it is no longer needed, and then create the data session. dispatch_sync(dispatch_get_main_queue(), ^{ - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; + [strongSelf stopSession]; }); if (accessory.isConnected) { @@ -164,9 +164,7 @@ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandler { SDLLogE(@"Control stream error"); [strongSelf.protocolIndexTimer cancel]; - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; + [strongSelf stopSession]; [strongSelf sdl_shouldRetryEstablishSession:YES]; }; } @@ -180,9 +178,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { void (^elapsedBlock)(void) = ^{ __strong typeof(weakSelf) strongSelf = weakSelf; SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds); - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; + [strongSelf stopSession]; [strongSelf sdl_shouldRetryEstablishSession:YES]; }; protocolIndexTimer.elapsedBlock = elapsedBlock; @@ -210,12 +206,15 @@ - (NSUInteger)accessoryID { return self.session.accessory.connectionID; } +- (BOOL)isSessionInProgress { + return (self.session != nil && !self.session.isStopped); +} + #pragma mark - Lifecycle Destruction - (void)dealloc { SDLLogV(@"SDLIAPControlSession Dealloc"); _session = nil; - [_protocolIndexTimer cancel]; _protocolIndexTimer = nil; } diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index 0ff3c9870..b615e8281 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -15,8 +15,6 @@ NS_ASSUME_NONNULL_BEGIN typedef void (^SDLIAPDataSessionRetryCompletionHandler)(BOOL retryEstablishSession); typedef void (^SDLIAPDataSessionCreateDataReceivedHandler)(NSData *dataIn); -extern NSString *const LegacyProtocolString; - @interface SDLIAPDataSession : NSObject /** @@ -29,13 +27,18 @@ extern NSString *const LegacyProtocolString; */ @property (assign, nonatomic, readonly) NSUInteger accessoryID; +/** + * Returns whether the session has open I/O streams. + */ +@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress; + - (instancetype)init NS_UNAVAILABLE; - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler; /** - * Destroys a current session. + * Stops a current session. */ -- (void)destroySession; +- (void)stopSession; @end diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 8d8266ee4..dedbf540c 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -8,14 +8,14 @@ #import "SDLIAPDataSession.h" +#import "SDLGlobals.h" +#import "SDLIAPConstants.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" -#import "SDLGlobals.h" -NS_ASSUME_NONNULL_BEGIN -NSString *const LegacyProtocolString = @"com.ford.sync.prot0"; +NS_ASSUME_NONNULL_BEGIN @interface SDLIAPDataSession () @@ -60,8 +60,7 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo if (![self.session start]) { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", session.accessory); - self.session.streamDelegate = nil; - self.session = nil; + [self stopSession]; [self sdl_shouldRetryEstablishSession:YES]; } } else { @@ -72,16 +71,17 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo return self; } -- (void)destroySession { +- (void)stopSession { if (self.session != nil) { - SDLLogD(@"Destroying data session"); + SDLLogD(@"Stopping the data session"); [self.session stop]; self.session.streamDelegate = nil; - self.session = nil; + + // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. } } -#pragma mark Data Stream Handlers +#pragma mark - Data Stream Handlers - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { __weak typeof(self) weakSelf = self; @@ -96,10 +96,7 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { } // The handler will be called on the IO thread, but the session stop method must be called on the main thread dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; - + [strongSelf stopSession]; [strongSelf sdl_shouldRetryEstablishSession:YES]; }); @@ -141,9 +138,7 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { __strong typeof(weakSelf) strongSelf = weakSelf; SDLLogE(@"Data stream error"); dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf.session stop]; - strongSelf.session.streamDelegate = nil; - strongSelf.session = nil; + [strongSelf stopSession]; if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { [strongSelf sdl_shouldRetryEstablishSession:YES]; } @@ -154,6 +149,7 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { } #pragma mark - Helpers + - (void)sdl_shouldRetryEstablishSession:(BOOL)retryEstablishSession { if (self.retrySessionHandler == nil) { return; @@ -174,6 +170,10 @@ - (NSUInteger)accessoryID { return self.session.accessory.connectionID; } +- (BOOL)isSessionInProgress { + return (self.session != nil && !self.session.isStopped); +} + #pragma mark - Lifecycle Destruction - (void)dealloc { diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 6fc39be9a..b6ddc7d3e 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -30,7 +30,7 @@ @implementation SDLIAPSession #pragma mark - Lifecycle - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol { - SDLLogD(@"SDLIAPSession initWithAccessory:%@ forProtocol:%@", accessory, protocol); + SDLLogD(@"SDLIAPSession init with accessory:%@ for protocol:%@", accessory.name, protocol); self = [super init]; if (self) { diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 2715f9e7f..0fc4f0014 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -9,6 +9,7 @@ #import "EAAccessory+SDLProtocols.h" #import "EAAccessoryManager+SDLProtocols.h" #import "SDLGlobals.h" +#import "SDLIAPConstants.h" #import "SDLIAPControlSession.h" #import "SDLIAPDataSession.h" #import "SDLIAPSession.h" @@ -20,7 +21,6 @@ NS_ASSUME_NONNULL_BEGIN -NSString *const MultiSessionProtocolString = @"com.smartdevicelink.multisession"; NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; int const CreateSessionRetries = 3; @@ -34,7 +34,6 @@ @interface SDLIAPTransport () { @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; -@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; @property (nonatomic, copy, nullable) SDLIAPControlSessionRetryCompletionHandler retryControlSessionHandler; @@ -55,7 +54,6 @@ - (instancetype)init { _dataSession = nil; _controlSession = nil; _retryCounter = 0; - _protocolIndexTimer = nil; _accessoryConnectDuringActiveSession = NO; // Get notifications if an accessory connects in future @@ -144,7 +142,7 @@ - (void)sdl_stopEventListening { - (void)sdl_accessoryConnected:(NSNotification *)notification { EAAccessory *newAccessory = [notification.userInfo objectForKey:EAAccessoryKey]; - if ([self sdl_isSessionActive:self.dataSession.session newAccessory:newAccessory]) { + if ([self sdl_isDataSessionActive:self.dataSession newAccessory:newAccessory]) { self.accessoryConnectDuringActiveSession = YES; return; } @@ -164,12 +162,16 @@ - (void)sdl_accessoryConnected:(NSNotification *)notification { /** * Checks if the newly connected accessory connected while a data session is already opened. This can happen when a session is established over bluetooth and then the user connects to the same head unit with a USB cord. * - * @param session The current data session, which may be nil + * @param dataSession The current data session * @param newAccessory The newly connected accessory * @return True if the accessory connected while a data session is already in progress; false if not */ -- (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory *)newAccessory { - if ((session != nil) && (session.accessory.connectionID != newAccessory.connectionID)) { +- (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAccessory:(EAAccessory *)newAccessory { + if (dataSession == nil || !dataSession.isSessionInProgress) { + return NO; + } + + if ((!dataSession.isSessionInProgress) && (dataSession.accessoryID != newAccessory.connectionID)) { SDLLogD(@"Switching transports from Bluetooth to USB. Waiting for disconnect notification."); return YES; } @@ -191,7 +193,7 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { self.accessoryConnectDuringActiveSession = NO; } - if (self.controlSession.session == nil && self.dataSession == nil) { + if (self.controlSession.session == nil && self.dataSession.session == nil) { // No connection has yet been established so we will not destroy the current session as it needs to watch for accessory connections. SDLLogV(@"Accessory (%@), disconnected, but no session is in progress", accessory.serialNumber); } else if (accessory.connectionID == self.controlSession.accessoryID) { @@ -199,7 +201,8 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { SDLLogV(@"Accessory (%@) disconnected during a control session", accessory.serialNumber); self.retryCounter = 0; self.sessionSetupInProgress = NO; - [self.controlSession destroySession]; + [self.controlSession stopSession]; + [self.dataSession stopSession]; } else if (accessory.connectionID == self.dataSession.accessoryID) { // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@) disconnected during a data session", accessory.serialNumber); @@ -259,17 +262,15 @@ - (void)connect { * @param accessory The accessory to attempt connection with or nil to scan for accessories. */ - (void)sdl_connect:(nullable EAAccessory *)accessory { - if (!self.dataSession && !self.sessionSetupInProgress) { + if ((self.dataSession == nil || !self.dataSession.isSessionInProgress) && !self.sessionSetupInProgress) { // We don't have a session are not attempting to set one up, attempt to connect - SDLLogV(@"Session not setup, starting setup"); + SDLLogV(@"Data session I/O streams not opened. Starting setup."); self.sessionSetupInProgress = YES; [self sdl_establishSessionWithAccessory:accessory]; - } else if (self.dataSession) { - // Session already established - SDLLogV(@"Session already established"); + } else if (self.dataSession.isSessionInProgress) { + SDLLogV(@"Data session I/O streams already opened. Ignoring attempt to create session."); } else { - // Session attempting to be established - SDLLogV(@"Session setup already in progress"); + SDLLogV(@"Data session I/O streams are currently being opened. Ignoring attempt to create session."); } } @@ -280,9 +281,9 @@ - (void)disconnect { // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications [self sdl_stopEventListening]; if (self.controlSession != nil) { - [self.controlSession destroySession]; + [self.controlSession stopSession]; } else if (self.dataSession != nil) { - [self.dataSession destroySession]; + [self.dataSession stopSession]; } } @@ -310,10 +311,8 @@ + (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)access */ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { BOOL connecting = NO; - if ([self.class sdl_supportsRequiredProtocolStrings] != nil) { - NSString *failedString = [self.class sdl_supportsRequiredProtocolStrings]; - SDLLogE(@"A required External Accessory protocol string is missing from the info.plist: %@", failedString); - NSAssert(NO, @"Some SDL protocol strings are not supported, check the README for all strings that must be included in your info.plist file. Missing string: %@", failedString); + + if (![self.class sdl_plistContainsAllSupportedProtocolStrings]) { return connecting; } @@ -413,6 +412,16 @@ + (nullable NSString *)sdl_supportsRequiredProtocolStrings { return nil; } ++ (BOOL)sdl_plistContainsAllSupportedProtocolStrings { + if ([self.class sdl_supportsRequiredProtocolStrings] != nil) { + NSString *failedString = [self.class sdl_supportsRequiredProtocolStrings]; + SDLLogE(@"A required External Accessory protocol string is missing from the info.plist: %@", failedString); + NSAssert(NO, @"Some SDL protocol strings are not supported, check the README for all strings that must be included in your info.plist file. Missing string: %@", failedString); + return NO; + } + return YES; +} + /** * Attempt to establish a session with an accessory, or if nil is passed, to scan for one. * @@ -424,23 +433,20 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { self.retryCounter++; EAAccessory *sdlAccessory = accessory; - // If we are being called from sdl_connectAccessory, the EAAccessoryDidConnectNotification will contain the SDL accessory to connect to and we can connect without searching the accessory manager's connected accessory list. Otherwise, we fall through to a search. + // If called from sdl_connectAccessory, the notification will contain the SDL accessory to connect to and we can connect without searching the accessory manager's connected accessory list. Otherwise, we fall through to a search. if (sdlAccessory != nil && [self sdl_connectAccessory:sdlAccessory]) { // Connection underway, exit SDLLogV(@"Connection already underway"); return; } - if ([self.class sdl_supportsRequiredProtocolStrings] != nil) { - NSString *failedString = [self.class sdl_supportsRequiredProtocolStrings]; - SDLLogE(@"A required External Accessory protocol string is missing from the info.plist: %@", failedString); - NSAssert(NO, @"Some SDL protocol strings are not supported, check the README for all strings that must be included in your info.plist file. Missing string: %@", failedString); + if (![self.class sdl_plistContainsAllSupportedProtocolStrings]) { return; } - + // Determine if we can start a multi-app session or a legacy (single-app) session if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:multi forProtocol:MultiSessionProtocolString sessionDelegate:self]; self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory sessionDelegate:self]; @@ -463,8 +469,8 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { - (void)sdl_retryEstablishSession { // Current strategy disallows automatic retries. self.sessionSetupInProgress = NO; - [self.controlSession destroySession]; - [self.dataSession destroySession]; + [self.controlSession stopSession]; + [self.dataSession stopSession]; // Search connected accessories [self sdl_connect:nil]; @@ -510,29 +516,27 @@ - (double)sdl_retryDelay { #pragma mark - SDLIAPSessionDelegate -// This gets called after both I/O streams of the session have opened. +// Gets called after both the input and output streams of the session have opened. - (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { - // Control Session Opened + SDLLogV(@"%@ I/O streams opened for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); + if ([ControlProtocolString isEqualToString:session.protocol]) { - SDLLogD(@"Control Session Established"); - - if (!self.dataSession) { - [self.protocolIndexTimer start]; + if (!self.dataSession.session) { + [self.controlSession startSessionTimer]; } } - // Data Session Opened if (![ControlProtocolString isEqualToString:session.protocol]) { self.sessionSetupInProgress = NO; - SDLLogD(@"Data Session Established"); [self.delegate onTransportConnected]; } } // Retry establishSession on Stream End events only if it was the control session and we haven't already connected on non-control protocol - (void)onSessionStreamsEnded:(SDLIAPSession *)session { - SDLLogV(@"Session streams ended (%@)", session.protocol); - if (!self.dataSession && [ControlProtocolString isEqualToString:session.protocol]) { + SDLLogV(@"%@ session I/O streams closed for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); + + if (!self.dataSession.session && [ControlProtocolString isEqualToString:session.protocol]) { [session stop]; [self sdl_retryEstablishSession]; } From 0c493c0b443c16e693f10039f52c0c6f2766aef0 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 18 Apr 2019 10:47:30 -0400 Subject: [PATCH 004/179] Added documentation to SDLIAPTransport class --- SmartDeviceLink/SDLIAPTransport.m | 46 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 0fc4f0014..54ae6ec3f 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -275,7 +275,7 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { } /** - * Cleans up after a disconnected accessory by closing any open input streams. + * Cleans up after a disconnected accessory by closing any open I/O streams. */ - (void)disconnect { // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications @@ -290,13 +290,6 @@ - (void)disconnect { #pragma mark - Creating Session Streams -+ (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory sessionDelegate:(id)sessionDelegate { - SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; - session.delegate = sessionDelegate; - return session; -} - - + (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; session.delegate = sessionDelegate; @@ -321,7 +314,7 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; connecting = YES; } else if ([accessory supportsProtocol:ControlProtocolString]) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory sessionDelegate:self]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory forProtocol:ControlProtocolString sessionDelegate:self]; self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; connecting = YES; } else if ([accessory supportsProtocol:LegacyProtocolString]) { @@ -387,9 +380,24 @@ - (nullable SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { #pragma mark - Helpers /** - Check all required protocol strings in the info.plist dictionary. + * Checks if the app's info.plist contains all the required protocol strings. + * + * @return True if the app's info.plist has all required protocol strings; false if not. + */ ++ (BOOL)sdl_plistContainsAllSupportedProtocolStrings { + if ([self.class sdl_supportsRequiredProtocolStrings] != nil) { + NSString *failedString = [self.class sdl_supportsRequiredProtocolStrings]; + SDLLogE(@"A required External Accessory protocol string is missing from the info.plist: %@", failedString); + NSAssert(NO, @"Some SDL protocol strings are not supported, check the README for all strings that must be included in your info.plist file. Missing string: %@", failedString); + return NO; + } + return YES; +} - @return A missing protocol string or nil if all strings are supported. +/** + * Compares all required protocol strings against the protocol strings in the info.plist dictionary. + * + * @return A missing protocol string or nil if all strings are supported. */ + (nullable NSString *)sdl_supportsRequiredProtocolStrings { NSArray *protocolStrings = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UISupportedExternalAccessoryProtocols"]; @@ -412,18 +420,8 @@ + (nullable NSString *)sdl_supportsRequiredProtocolStrings { return nil; } -+ (BOOL)sdl_plistContainsAllSupportedProtocolStrings { - if ([self.class sdl_supportsRequiredProtocolStrings] != nil) { - NSString *failedString = [self.class sdl_supportsRequiredProtocolStrings]; - SDLLogE(@"A required External Accessory protocol string is missing from the info.plist: %@", failedString); - NSAssert(NO, @"Some SDL protocol strings are not supported, check the README for all strings that must be included in your info.plist file. Missing string: %@", failedString); - return NO; - } - return YES; -} - /** - * Attempt to establish a session with an accessory, or if nil is passed, to scan for one. + * Attempts to establish a session with the passed accessory. If nil is passed the accessory manager is checked for connected SDL enabled accessories. * * @param accessory The accessory to try to establish a session with, or nil to scan all connected accessories. */ @@ -446,10 +444,10 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { // Determine if we can start a multi-app session or a legacy (single-app) session if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:multi forProtocol:MultiSessionProtocolString sessionDelegate:self]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory sessionDelegate:self]; + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:ControlProtocolString sessionDelegate:self]; self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; From c26231c0513c7693f88f8c1feaa2093725ff5340 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 18 Apr 2019 11:44:46 -0400 Subject: [PATCH 005/179] Fixed broken BT/USB transport switch check --- SmartDeviceLink/SDLIAPTransport.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 54ae6ec3f..e83dcb397 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -171,7 +171,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc return NO; } - if ((!dataSession.isSessionInProgress) && (dataSession.accessoryID != newAccessory.connectionID)) { + if (dataSession.isSessionInProgress && (dataSession.accessoryID != newAccessory.connectionID)) { SDLLogD(@"Switching transports from Bluetooth to USB. Waiting for disconnect notification."); return YES; } From e06733f2b8ba1252ffe036aab21bddbf1973e11f Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 18 Apr 2019 14:06:33 -0400 Subject: [PATCH 006/179] Fixed test cases for SDLIAPControlSession class --- SmartDeviceLink/SDLIAPControlSession.h | 7 +- SmartDeviceLink/SDLIAPControlSession.m | 90 +++++++++++-------- .../iAP/SDLIAPControlSessionSpec.m | 83 +++++++++-------- 3 files changed, 96 insertions(+), 84 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 77ceefb4a..8b5e1b4fb 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -42,9 +42,10 @@ typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccesso /** * Sets a new control session. * - * @param session The new control session - * @param retrySessionCompletionHandler A handler called when the control session failed to be established and a new session should be attempted. - * @param createDataSessionCompletionHandler A handler called when control session is successful and a new session must be established with the recevied protocol string. + * @param session The new control session + * @param retrySessionHandler A handler called when the control session failed to be established and a new session should be attempted. + * @param createDataSessionHandler A handler called when control session is successful and a new session must be established with the recevied protocol string. + * @return A SDLIAPControlSession object */ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler; diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 2dc68e779..88778028b 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -19,14 +19,12 @@ NS_ASSUME_NONNULL_BEGIN -int const ProtocolIndexTimeoutSeconds = 10; +int const ProtocolIndexTimeoutSeconds = 5; @interface SDLIAPControlSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; -@property (nullable, strong, nonatomic) SDLIAPControlSessionRetryCompletionHandler retrySessionHandler; -@property (nullable, strong, nonatomic) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionHandler; @end @@ -53,22 +51,22 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo } self.session = session; - self.retrySessionHandler = retrySessionHandler; - self.createDataSessionHandler = createDataSessionHandler; if (self.session) { SDLLogD(@"Starting control session with accessory (%@)", self.session.accessory.name); EAAccessory *accessory = session.accessory; SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; - controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory]; - controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandler]; - controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamErroredHandler]; + controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory createDataSessionCompletionHandler:createDataSessionHandler]; + controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandlerWithShouldRetrySessionHandler:retrySessionHandler]; + controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamEndedHandlerWithShouldRetrySessionHandler:retrySessionHandler]; self.session.streamDelegate = controlStreamDelegate; if (![self.session start]) { SDLLogW(@"Control session failed to setup with accessory: %@. Retrying...", accessory); [self stopSession]; - [self sdl_shouldRetryEstablishSession:YES]; + if (retrySessionHandler != nil) { + retrySessionHandler(YES); + } } else { SDLLogW(@"Control session started"); if (self.protocolIndexTimer != nil) { @@ -77,11 +75,13 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo } SDLLogD(@"Waiting for the protocol string from Core, setting timer for %d seconds", ProtocolIndexTimeoutSeconds); - self.protocolIndexTimer = [self sdl_createProtocolIndexTimer]; + self.protocolIndexTimer = [self sdl_createProtocolIndexTimerWithShouldRetrySessionHandler:retrySessionHandler]; } } else { SDLLogW(@"Failed to setup control session"); - [self sdl_shouldRetryEstablishSession:YES]; + if (retrySessionHandler != nil) { + retrySessionHandler(YES); + } } return self; @@ -99,13 +99,17 @@ - (void)stopSession { - (void)startSessionTimer { if (!self.protocolIndexTimer) { return; } - [self.protocolIndexTimer start]; } #pragma mark - Control Stream Handlers -- (SDLStreamEndHandler)sdl_controlStreamEndedHandler { +/** + * Handler called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. + * + * @return A SDLStreamEndHandler handler + */ +- (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithShouldRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -116,12 +120,20 @@ - (SDLStreamEndHandler)sdl_controlStreamEndedHandler { if (strongSelf.session != nil) { [strongSelf.protocolIndexTimer cancel]; [strongSelf stopSession]; - [strongSelf sdl_shouldRetryEstablishSession:YES]; + + if (retrySessionHandler == nil) { return; } + retrySessionHandler(YES); } }; } -- (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory { +/** + * Handler called when the session gets a `NSStreamEventHasBytesAvailable` event code. A protocol string is created from the received data. Since a new session needs to be established with the protocol string, the current session is closed and a new session is created. + * + * @param accessory The connected accessory + * @return A SDLStreamHasBytesHandler handler + */ +- (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler { __weak typeof(self) weakSelf = self; return ^(NSInputStream *istream) { @@ -132,7 +144,7 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce uint8_t buf[1]; NSInteger len = [istream read:buf maxLength:1]; if (len <= 0) { - SDLLogV(@"No data received from the control stream"); + SDLLogV(@"No data in the control stream"); return; } @@ -147,16 +159,21 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce if (accessory.isConnected) { dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf sdl_createDataSessionWithIndexProtocolString:indexedProtocolString connectedAccessory:accessory]; + if (createDataSessionHandler != nil) { + createDataSessionHandler(accessory, indexedProtocolString); + } [strongSelf.protocolIndexTimer cancel]; }); - } else { - SDLLogE(@"Accessory is not connected"); } }; } -- (SDLStreamErrorHandler)sdl_controlStreamErroredHandler { +/** + * Handler called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. + * + * @return A SDLStreamErrorHandler handler + */ +- (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithShouldRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -165,13 +182,20 @@ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandler { [strongSelf.protocolIndexTimer cancel]; [strongSelf stopSession]; - [strongSelf sdl_shouldRetryEstablishSession:YES]; + + if (retrySessionHandler == nil) { return; } + retrySessionHandler(YES); }; } -#pragma mark - Helpers +#pragma mark - Timer -- (SDLTimer *)sdl_createProtocolIndexTimer { +/** + * Creates a timer for the session. Core has ~10 seconds to send the protocol string, otherwise when the timer's elapsed block is called, the current session is closed and a new session is attempted. + * + * @return A timer + */ +- (SDLTimer *)sdl_createProtocolIndexTimerWithShouldRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { SDLTimer *protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO]; __weak typeof(self) weakSelf = self; @@ -179,28 +203,16 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { __strong typeof(weakSelf) strongSelf = weakSelf; SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds); [strongSelf stopSession]; - [strongSelf sdl_shouldRetryEstablishSession:YES]; + + if (retrySessionHandler == nil) { return; } + retrySessionHandler(YES); }; protocolIndexTimer.elapsedBlock = elapsedBlock; return protocolIndexTimer; } -- (void)sdl_shouldRetryEstablishSession:(BOOL)retryEstablishSession { - if (self.retrySessionHandler == nil) { - return; - } - - self.retrySessionHandler(retryEstablishSession); -} - -- (void)sdl_createDataSessionWithIndexProtocolString:(NSString *)indexProtocolString connectedAccessory:(EAAccessory *)accessory { - if (self.createDataSessionHandler == nil) { - return; - } - - self.createDataSessionHandler(accessory, indexProtocolString); -} +#pragma mark - Getters - (NSUInteger)accessoryID { return self.session.accessory.connectionID; diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 30507f20d..9c17ae5dc 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -11,20 +11,14 @@ #import #import "EAAccessory+OCMock.m" +#import "SDLIAPConstants.h" #import "SDLIAPControlSession.h" #import "SDLIAPSession.h" #import "SDLTimer.h" -//#import "SDLIAPControlSession.h" - -//@interface SDLIAPControlSession () -//@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; -//@end @interface SDLIAPControlSession() @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; -@property (nullable, strong, nonatomic) SDLIAPControlSessionRetryCompletionHandler retrySessionHandler; -@property (nullable, strong, nonatomic) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionHandler; @end QuickSpecBegin(SDLIAPControlSessionSpec) @@ -32,66 +26,64 @@ @interface SDLIAPControlSession() describe(@"SDLIAPControlSession", ^{ __block SDLIAPControlSession *controlSession = nil; __block EAAccessory *mockAccessory = nil; - __block id mockSessionDelegate = nil; + __block SDLIAPSession *mockSession = nil; + __block BOOL retryHandlerCalled = nil; + __block BOOL createDataSessionHandlerCalled = nil; beforeEach(^{ - controlSession = [SDLIAPControlSession new]; - mockAccessory = [EAAccessory.class sdlCoreMock]; - mockSessionDelegate = OCMProtocolMock(@protocol(SDLIAPSessionDelegate)); - }); + retryHandlerCalled = NO; + createDataSessionHandlerCalled = NO; - describe(@"Initialization", ^{ - it(@"Should init correctly", ^{ - expect(controlSession.session).to(beNil()); - expect(controlSession.protocolIndexTimer).to(beNil()); - }); + mockAccessory = [EAAccessory.class sdlCoreMock]; + mockSession = OCMClassMock([SDLIAPSession class]); + OCMStub([mockSession accessory]).andReturn(mockAccessory); }); - describe(@"Setting a session", ^{ - __block SDLIAPSession *session = nil; - __block BOOL retryHandlerCalled = nil; - __block BOOL createDataSessionHandlerCalled = nil; - - beforeEach(^{ - session = nil; - retryHandlerCalled = NO; - createDataSessionHandlerCalled = NO; - }); - + describe(@"Session init", ^{ describe(@"When a session starts successfully", ^{ beforeEach(^{ - session = OCMClassMock([SDLIAPSession class]); - OCMStub([session start]).andReturn(YES); - [controlSession setSession:session retryCompletionHandler:^(BOOL retryEstablishSession) { + OCMStub([mockSession start]).andReturn(YES); + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { createDataSessionHandlerCalled = YES; }]; }); - it(@"Should create a session", ^{ + it(@"Should create a timer", ^{ expect(controlSession.session).toNot(beNil()); - expect(controlSession.accessoryID).toNot(beNil()); + expect(controlSession.accessoryID).to(equal(5)); expect(controlSession.protocolIndexTimer).toNot(beNil()); expect(retryHandlerCalled).to(beFalse()); expect(createDataSessionHandlerCalled).to(beFalse()); }); + + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is stopped", ^{ + OCMStub([mockSession isStopped]).andReturn(NO); + expect(controlSession.isSessionInProgress).to(beTrue()); + }); + + it(@"Should be in progress if the session is running", ^{ + OCMStub([mockSession isStopped]).andReturn(YES); + expect(controlSession.isSessionInProgress).to(beFalse()); + }); + }); }); describe(@"When a session does not start successfully", ^{ beforeEach(^{ - session = OCMClassMock([SDLIAPSession class]); - OCMStub([session start]).andReturn(NO); - [controlSession setSession:session retryCompletionHandler:^(BOOL retryEstablishSession) { + OCMStub([mockSession start]).andReturn(NO); + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { createDataSessionHandlerCalled = YES; }]; }); - it(@"Should not create a session", ^{ - expect(controlSession.session).to(beNil()); - expect(controlSession.accessoryID).to(equal(0)); + it(@"Should not create a timer", ^{ + expect(controlSession.session).toNot(beNil()); + expect(controlSession.accessoryID).to(equal(5)); expect(controlSession.protocolIndexTimer).to(beNil()); expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); @@ -100,21 +92,28 @@ @interface SDLIAPControlSession() describe(@"When a session is nil", ^{ beforeEach(^{ - session = nil; - [controlSession setSession:session retryCompletionHandler:^(BOOL retryEstablishSession) { + mockSession = nil; + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { createDataSessionHandlerCalled = YES; }]; }); - it(@"Should not create a session", ^{ + it(@"Should not create a timer", ^{ expect(controlSession.session).to(beNil()); + expect(controlSession.isSessionInProgress).to(beFalse()); expect(controlSession.accessoryID).to(equal(0)); expect(controlSession.protocolIndexTimer).to(beNil()); expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); }); + + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is nil", ^{ + expect(controlSession.isSessionInProgress).to(beFalse()); + }); + }); }); }); }); From f77bd7132db3df516ddb623b3c77036fc4d4da35 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 18 Apr 2019 14:07:00 -0400 Subject: [PATCH 007/179] Fixed protocol timer constant --- SmartDeviceLink/SDLIAPControlSession.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 88778028b..c1a348562 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN -int const ProtocolIndexTimeoutSeconds = 5; +int const ProtocolIndexTimeoutSeconds = 10; @interface SDLIAPControlSession () From 87247ba69dccfde63054110f788b8fbb1b9f7143 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 23 Apr 2019 09:33:09 -0400 Subject: [PATCH 008/179] Refactoring SDLIAPTransport code --- SmartDeviceLink/SDLIAPControlSession.m | 12 +- SmartDeviceLink/SDLIAPTransport.m | 316 +++++++++--------- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 63 ++-- 3 files changed, 193 insertions(+), 198 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index c1a348562..55d522f4c 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -57,8 +57,8 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo EAAccessory *accessory = session.accessory; SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory createDataSessionCompletionHandler:createDataSessionHandler]; - controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandlerWithShouldRetrySessionHandler:retrySessionHandler]; - controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamEndedHandlerWithShouldRetrySessionHandler:retrySessionHandler]; + controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandlerWithRetrySessionHandler:retrySessionHandler]; + controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamEndedHandlerWithRetrySessionHandler:retrySessionHandler]; self.session.streamDelegate = controlStreamDelegate; if (![self.session start]) { @@ -75,7 +75,7 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo } SDLLogD(@"Waiting for the protocol string from Core, setting timer for %d seconds", ProtocolIndexTimeoutSeconds); - self.protocolIndexTimer = [self sdl_createProtocolIndexTimerWithShouldRetrySessionHandler:retrySessionHandler]; + self.protocolIndexTimer = [self sdl_createProtocolIndexTimerWithRetrySessionHandler:retrySessionHandler]; } } else { SDLLogW(@"Failed to setup control session"); @@ -109,7 +109,7 @@ - (void)startSessionTimer { * * @return A SDLStreamEndHandler handler */ -- (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithShouldRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { +- (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -173,7 +173,7 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce * * @return A SDLStreamErrorHandler handler */ -- (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithShouldRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { +- (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -195,7 +195,7 @@ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithShouldRetrySessionHa * * @return A timer */ -- (SDLTimer *)sdl_createProtocolIndexTimerWithShouldRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { +- (SDLTimer *)sdl_createProtocolIndexTimerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { SDLTimer *protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO]; __weak typeof(self) weakSelf = self; diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index e83dcb397..a9e832929 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -22,12 +22,9 @@ NS_ASSUME_NONNULL_BEGIN NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; - int const CreateSessionRetries = 3; -@interface SDLIAPTransport () { - BOOL _alreadyDestructed; -} +@interface SDLIAPTransport () @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; @property (nullable, strong, nonatomic) SDLIAPDataSession *dataSession; @@ -36,20 +33,14 @@ @interface SDLIAPTransport () { @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; -@property (nonatomic, copy, nullable) SDLIAPControlSessionRetryCompletionHandler retryControlSessionHandler; -@property (nonatomic, copy, nullable) SDLIAPControlSessionCreateDataSessionCompletionHandler createDataSessionCompletionHandler; -@property (nullable, strong, nonatomic) SDLIAPDataSessionRetryCompletionHandler retryDataSessionHandler; -@property (nullable, strong, nonatomic) SDLIAPDataSessionCreateDataReceivedHandler dataReceivedHandler; - @end @implementation SDLIAPTransport - (instancetype)init { - SDLLogV(@"SDLIAPTransport Init"); + SDLLogV(@"SDLIAPTransport init"); if (self = [super init]) { - _alreadyDestructed = NO; _sessionSetupInProgress = NO; _dataSession = nil; _controlSession = nil; @@ -246,6 +237,24 @@ - (void)sdl_applicationDidEnterBackground:(NSNotification *)notification { #pragma mark - Stream Lifecycle +#pragma mark SDLTransportType Protocol + +/** + * Sends data to Core + * + * @param data The data to be sent to Core + */ +- (void)sendData:(NSData *)data { + if (self.dataSession.session == nil || !self.dataSession.session.accessory.connected) { + return; + } + + [self.dataSession.session sendData:data]; +} + +/** + * Attempts to connect to an accessory. + */ - (void)connect { UIApplicationState state = [UIApplication sharedApplication].applicationState; if (state != UIApplicationStateActive) { @@ -256,6 +265,24 @@ - (void)connect { [self sdl_connect:nil]; } +/** + * Cleans up after a disconnected accessory by closing any open I/O streams. + */ +- (void)disconnect { + // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications + [self sdl_stopEventListening]; + if (self.controlSession != nil) { + [self.controlSession stopSession]; + } + if (self.dataSession != nil) { + [self.dataSession stopSession]; + } +} + + + +#pragma mark Helpers + /** * Starts the process to connect to an accessory. If no accessory specified, scans for a valid accessory. * @@ -274,22 +301,6 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { } } -/** - * Cleans up after a disconnected accessory by closing any open I/O streams. - */ -- (void)disconnect { - // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications - [self sdl_stopEventListening]; - if (self.controlSession != nil) { - [self.controlSession stopSession]; - } else if (self.dataSession != nil) { - [self.dataSession stopSession]; - } -} - - -#pragma mark - Creating Session Streams - + (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; session.delegate = sessionDelegate; @@ -325,56 +336,135 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { return connecting; } +/** + * Attempts to establish a session with the passed accessory. If nil is passed the accessory manager is checked for connected SDL enabled accessories. + * + * @param accessory The accessory to try to establish a session with, or nil to scan all connected accessories. + */ +- (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { + SDLLogD(@"Attempting to connect accessory: %@", accessory.name); + if (self.retryCounter < CreateSessionRetries) { + self.retryCounter++; + + EAAccessory *sdlAccessory = accessory; + // If called from sdl_connectAccessory, the notification will contain the SDL accessory to connect to and we can connect without searching the accessory manager's connected accessory list. Otherwise, we fall through to a search. + if (sdlAccessory != nil && [self sdl_connectAccessory:sdlAccessory]) { + // Connection underway, exit + SDLLogV(@"Connection already underway"); + return; + } + + if (![self.class sdl_plistContainsAllSupportedProtocolStrings]) { + return; + } + + // Determine if we can start a multi-app session or a legacy (single-app) session + if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; + self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:ControlProtocolString sessionDelegate:self]; + self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; + } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { + SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; + self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + } else { + // No compatible accessory + SDLLogV(@"No accessory supporting SDL was found, dismissing setup"); + self.sessionSetupInProgress = NO; + } + } else { + // We have surpassed the number of retries allowed + SDLLogW(@"Surpassed allowed retry attempts (%d), dismissing setup", CreateSessionRetries); + self.sessionSetupInProgress = NO; + } +} + +/** + * Stops any ongoing sessions if necessary and tries to find an accessory which which to create a session. + */ +- (void)sdl_retryEstablishSession { + // Current strategy disallows automatic retries. + self.sessionSetupInProgress = NO; + [self.controlSession stopSession]; + [self.dataSession stopSession]; + + // Search connected accessories + [self sdl_connect:nil]; +} + + #pragma mark - Session Handlers #pragma mark Control Session Handlers - (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandler { - if (!_retryControlSessionHandler) { - __weak typeof(self) weakSelf = self; - self.retryControlSessionHandler = ^(BOOL retryEstablishSession) { - [weakSelf sdl_retryEstablishSession]; - }; - } - - return _retryControlSessionHandler; + __weak typeof(self) weakSelf = self; + return ^(BOOL retryEstablishSession) { + [weakSelf sdl_retryEstablishSession]; + }; } - (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { - if (!_createDataSessionCompletionHandler) { - __weak typeof(self) weakSelf = self; - self.createDataSessionCompletionHandler = ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - SDLIAPSession *session = [weakSelf.class sdl_createSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString sessionDelegate:weakSelf]; - weakSelf.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:weakSelf.retryDataSessionHandler dataReceivedCompletionHandler:weakSelf.dataReceivedHandler]; - }; - } - - return _createDataSessionCompletionHandler; + __weak typeof(self) weakSelf = self; + return ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { + SDLIAPSession *session = [weakSelf.class sdl_createSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString sessionDelegate:weakSelf]; + weakSelf.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:weakSelf.retryDataSessionHandler dataReceivedCompletionHandler:weakSelf.dataReceivedHandler]; + }; } #pragma mark Data Session Handlers - (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { - if (!_retryDataSessionHandler) { - __weak typeof(self) weakSelf = self; - self.retryDataSessionHandler = ^(BOOL retryEstablishSession) { - [weakSelf sdl_retryEstablishSession]; - }; - } - - return _retryDataSessionHandler; + __weak typeof(self) weakSelf = self; + return ^(BOOL retryEstablishSession) { + [weakSelf sdl_retryEstablishSession]; + }; } - (nullable SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { - if (!_dataReceivedHandler) { - __weak typeof(self) weakSelf = self; - self.dataReceivedHandler = ^(NSData * _Nonnull dataIn) { - [weakSelf.delegate onDataReceived:dataIn]; - }; + __weak typeof(self) weakSelf = self; + return ^(NSData * _Nonnull dataIn) { + [weakSelf.delegate onDataReceived:dataIn]; + }; +} + +#pragma mark - SDLIAPSessionDelegate + +/** + * Called after both the input and output streams of the session have opened. + * + * @param session The current session + */ +- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { + SDLLogV(@"%@ I/O streams opened for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); + + if ([ControlProtocolString isEqualToString:session.protocol]) { + if (!self.dataSession.session) { + [self.controlSession startSessionTimer]; + } } - return _dataReceivedHandler; + if (![ControlProtocolString isEqualToString:session.protocol]) { + self.sessionSetupInProgress = NO; + [self.delegate onTransportConnected]; + } +} + +/** + * Called when either the input and output streams of the session have errored. If the control session errored, a new control session is attempted. + * + * @param session The current session + */ +- (void)onSessionStreamsEnded:(SDLIAPSession *)session { + SDLLogV(@"%@ session I/O streams errored for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); + + if (!self.dataSession.session && [ControlProtocolString isEqualToString:session.protocol]) { + SDLLogV(@"Retrying control session for protocol: %@", session.protocol); + [session stop]; + [self sdl_retryEstablishSession]; + } } #pragma mark - Helpers @@ -421,59 +511,10 @@ + (nullable NSString *)sdl_supportsRequiredProtocolStrings { } /** - * Attempts to establish a session with the passed accessory. If nil is passed the accessory manager is checked for connected SDL enabled accessories. + * Generates a random number of seconds between 1.5 and 9.5 used to delay the retry control and data session attempts. * - * @param accessory The accessory to try to establish a session with, or nil to scan all connected accessories. + * @return A random number of seconds. */ -- (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { - SDLLogD(@"Attempting to connect accessory: %@", accessory.name); - if (self.retryCounter < CreateSessionRetries) { - self.retryCounter++; - - EAAccessory *sdlAccessory = accessory; - // If called from sdl_connectAccessory, the notification will contain the SDL accessory to connect to and we can connect without searching the accessory manager's connected accessory list. Otherwise, we fall through to a search. - if (sdlAccessory != nil && [self sdl_connectAccessory:sdlAccessory]) { - // Connection underway, exit - SDLLogV(@"Connection already underway"); - return; - } - - if (![self.class sdl_plistContainsAllSupportedProtocolStrings]) { - return; - } - - // Determine if we can start a multi-app session or a legacy (single-app) session - if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; - self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; - } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:ControlProtocolString sessionDelegate:self]; - self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; - } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; - self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; - } else { - // No compatible accessory - SDLLogV(@"No accessory supporting SDL was found, dismissing setup"); - self.sessionSetupInProgress = NO; - } - } else { - // We have surpassed the number of retries allowed - SDLLogW(@"Surpassed allowed retry attempts (%d), dismissing setup", CreateSessionRetries); - self.sessionSetupInProgress = NO; - } -} - -- (void)sdl_retryEstablishSession { - // Current strategy disallows automatic retries. - self.sessionSetupInProgress = NO; - [self.controlSession stopSession]; - [self.dataSession stopSession]; - - // Search connected accessories - [self sdl_connect:nil]; -} - - (double)sdl_retryDelay { const double MinRetrySeconds = 1.5; const double MaxRetrySeconds = 9.5; @@ -512,62 +553,17 @@ - (double)sdl_retryDelay { return appDelaySeconds; } -#pragma mark - SDLIAPSessionDelegate - -// Gets called after both the input and output streams of the session have opened. -- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { - SDLLogV(@"%@ I/O streams opened for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); - - if ([ControlProtocolString isEqualToString:session.protocol]) { - if (!self.dataSession.session) { - [self.controlSession startSessionTimer]; - } - } - - if (![ControlProtocolString isEqualToString:session.protocol]) { - self.sessionSetupInProgress = NO; - [self.delegate onTransportConnected]; - } -} - -// Retry establishSession on Stream End events only if it was the control session and we haven't already connected on non-control protocol -- (void)onSessionStreamsEnded:(SDLIAPSession *)session { - SDLLogV(@"%@ session I/O streams closed for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); - - if (!self.dataSession.session && [ControlProtocolString isEqualToString:session.protocol]) { - [session stop]; - [self sdl_retryEstablishSession]; - } -} - -#pragma mark - Data Transmission - -- (void)sendData:(NSData *)data { - if (self.dataSession.session == nil || !self.dataSession.session.accessory.connected) { - return; - } - - [self.dataSession.session sendData:data]; -} - #pragma mark - Lifecycle Destruction -- (void)sdl_destructObjects { - if (!_alreadyDestructed) { - [self sdl_backgroundTaskEnd]; - _alreadyDestructed = YES; - self.controlSession = nil; - self.dataSession = nil; - self.delegate = nil; - self.sessionSetupInProgress = NO; - self.accessoryConnectDuringActiveSession = NO; - } -} - - (void)dealloc { SDLLogV(@"SDLIAPTransport dealloc"); [self disconnect]; - [self sdl_destructObjects]; + [self sdl_backgroundTaskEnd]; + self.controlSession = nil; + self.dataSession = nil; + self.delegate = nil; + self.sessionSetupInProgress = NO; + self.accessoryConnectDuringActiveSession = NO; } @end diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index b250fe9c5..81b9055de 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -16,15 +16,15 @@ #import "SDLIAPSession.h" #import "SDLTimer.h" #import "SDLIAPControlSession.h" +#import "SDLIAPDataSession.h" @interface SDLIAPTransport () @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; -@property (nullable, strong, nonatomic) SDLIAPSession *dataSession; +@property (nullable, strong, nonatomic) SDLIAPDataSession *dataSession; @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; -@property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory *)newAccessory; @end @@ -52,7 +52,6 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * expect(transport.dataSession).to(beNil()); expect(transport.controlSession.session).to(beNil()); expect(transport.retryCounter).to(equal(0)); - expect(transport.protocolIndexTimer).to(beNil()); expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); }); }); @@ -60,7 +59,7 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * describe(@"When an accessory connects while a session is not open", ^{ beforeEach(^{ expect(transport.controlSession.session).to(beNil()); - expect(transport.dataSession).to(beNil()); + expect(transport.dataSession.session).to(beNil()); }); it(@"should return that a session is not active", ^{ @@ -68,35 +67,35 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * expect(sessionInProgress).to(beFalse()); }); }); +// +// describe(@"When an accessory connects when a session is already open", ^{ +// beforeEach(^{ +// transport.dataSession = OCMClassMock([SDLIAPSession class]); +// }); +// +// it(@"should return that a session is active", ^{ +// BOOL sessionInProgress = [transport sdl_isSessionActive:transport.dataSession newAccessory:mockAccessory]; +// expect(sessionInProgress).to(beTrue()); +// }); +// }); - describe(@"When an accessory connects when a session is already open", ^{ - beforeEach(^{ - transport.dataSession = OCMClassMock([SDLIAPSession class]); - }); - - it(@"should return that a session is active", ^{ - BOOL sessionInProgress = [transport sdl_isSessionActive:transport.dataSession newAccessory:mockAccessory]; - expect(sessionInProgress).to(beTrue()); - }); - }); - - describe(@"When an accessory disconnects while a data session is open", ^{ - beforeEach(^{ - transport.controlSession = nil; - transport.dataSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.multisession"]; - transport.accessoryConnectDuringActiveSession = YES; - NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; - [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; - }); - - it(@"It should close the open data session", ^{ - expect(transport.dataSession).to(beNil()); - expect(transport.controlSession.session).to(beNil()); - expect(transport.retryCounter).to(equal(0)); - expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); - expect(transport.sessionSetupInProgress).to(beFalse()); - }); - }); +// describe(@"When an accessory disconnects while a data session is open", ^{ +// beforeEach(^{ +// transport.controlSession = nil; +// transport.dataSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.multisession"]; +// transport.accessoryConnectDuringActiveSession = YES; +// NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; +// [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; +// }); +// +// it(@"It should close the open data session", ^{ +// expect(transport.dataSession).to(beNil()); +// expect(transport.controlSession.session).to(beNil()); +// expect(transport.retryCounter).to(equal(0)); +// expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); +// expect(transport.sessionSetupInProgress).to(beFalse()); +// }); +// }); describe(@"When an accessory disconnects while a control session is open", ^{ // beforeEach(^{ From c678c241e59e9f9a5db25865ebad2af466037e6d Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 23 Apr 2019 13:23:03 -0400 Subject: [PATCH 009/179] Renamed connectionID from accessoryID --- SmartDeviceLink/SDLIAPControlSession.h | 2 +- SmartDeviceLink/SDLIAPControlSession.m | 2 +- SmartDeviceLink/SDLIAPDataSession.h | 2 +- SmartDeviceLink/SDLIAPDataSession.m | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 8b5e1b4fb..f5b5770d9 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -30,7 +30,7 @@ typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccesso /** * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. */ -@property (assign, nonatomic, readonly) NSUInteger accessoryID; +@property (assign, nonatomic, readonly) NSUInteger connectionID; /** * Returns whether the session has open I/O streams. diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 55d522f4c..5ad115f21 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -214,7 +214,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimerWithRetrySessionHandler:(SDLIAPControl #pragma mark - Getters -- (NSUInteger)accessoryID { +- (NSUInteger)connectionID { return self.session.accessory.connectionID; } diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index b615e8281..908e24a45 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -25,7 +25,7 @@ typedef void (^SDLIAPDataSessionCreateDataReceivedHandler)(NSData *dataIn); /** * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. */ -@property (assign, nonatomic, readonly) NSUInteger accessoryID; +@property (assign, nonatomic, readonly) NSUInteger connectionID; /** * Returns whether the session has open I/O streams. diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index dedbf540c..dc665879c 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -166,7 +166,7 @@ - (void)sdl_sendData:(NSData *)data { self.dataReceivedHandler(data); } -- (NSUInteger)accessoryID { +- (NSUInteger)connectionID { return self.session.accessory.connectionID; } From 4adb933373f6e83af7db8d3b98e447dbec278d95 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 23 Apr 2019 13:23:44 -0400 Subject: [PATCH 010/179] Fixed SDLIAPTransport test cases --- SmartDeviceLink/SDLIAPTransport.m | 14 +- .../iAP/SDLIAPControlSessionSpec.m | 6 +- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 220 +++++++++++++----- 3 files changed, 175 insertions(+), 65 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index a9e832929..c30b485f5 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -162,7 +162,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc return NO; } - if (dataSession.isSessionInProgress && (dataSession.accessoryID != newAccessory.connectionID)) { + if (dataSession.isSessionInProgress && (dataSession.connectionID != newAccessory.connectionID)) { SDLLogD(@"Switching transports from Bluetooth to USB. Waiting for disconnect notification."); return YES; } @@ -184,17 +184,19 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { self.accessoryConnectDuringActiveSession = NO; } - if (self.controlSession.session == nil && self.dataSession.session == nil) { + if (!self.controlSession.isSessionInProgress && !self.dataSession.isSessionInProgress) { // No connection has yet been established so we will not destroy the current session as it needs to watch for accessory connections. - SDLLogV(@"Accessory (%@), disconnected, but no session is in progress", accessory.serialNumber); - } else if (accessory.connectionID == self.controlSession.accessoryID) { - // The data session has yet been established so we will only destroy the control session. + self.retryCounter = 0; + self.sessionSetupInProgress = NO; + SDLLogV(@"Accessory (%@), disconnected, but no session is in progress.", accessory.serialNumber); + } else if (accessory.connectionID == self.controlSession.connectionID) { + // The data session has yet to be established so we will only destroy the control session. SDLLogV(@"Accessory (%@) disconnected during a control session", accessory.serialNumber); self.retryCounter = 0; self.sessionSetupInProgress = NO; [self.controlSession stopSession]; [self.dataSession stopSession]; - } else if (accessory.connectionID == self.dataSession.accessoryID) { + } else if (accessory.connectionID == self.dataSession.connectionID) { // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@) disconnected during a data session", accessory.serialNumber); [self sdl_destroySession]; diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 9c17ae5dc..2320cbedc 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -52,7 +52,7 @@ @interface SDLIAPControlSession() it(@"Should create a timer", ^{ expect(controlSession.session).toNot(beNil()); - expect(controlSession.accessoryID).to(equal(5)); + expect(controlSession.connectionID).to(equal(5)); expect(controlSession.protocolIndexTimer).toNot(beNil()); expect(retryHandlerCalled).to(beFalse()); expect(createDataSessionHandlerCalled).to(beFalse()); @@ -83,7 +83,7 @@ @interface SDLIAPControlSession() it(@"Should not create a timer", ^{ expect(controlSession.session).toNot(beNil()); - expect(controlSession.accessoryID).to(equal(5)); + expect(controlSession.connectionID).to(equal(5)); expect(controlSession.protocolIndexTimer).to(beNil()); expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); @@ -103,7 +103,7 @@ @interface SDLIAPControlSession() it(@"Should not create a timer", ^{ expect(controlSession.session).to(beNil()); expect(controlSession.isSessionInProgress).to(beFalse()); - expect(controlSession.accessoryID).to(equal(0)); + expect(controlSession.connectionID).to(equal(0)); expect(controlSession.protocolIndexTimer).to(beNil()); expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index 81b9055de..c96f4ba70 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -19,6 +19,7 @@ #import "SDLIAPDataSession.h" @interface SDLIAPTransport () + @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; @property (nullable, strong, nonatomic) SDLIAPDataSession *dataSession; @@ -26,7 +27,8 @@ @interface SDLIAPTransport () @property (assign, nonatomic) BOOL sessionSetupInProgress; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; -- (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory *)newAccessory; +- (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAccessory:(EAAccessory *)newAccessory; + @end QuickSpecBegin(SDLIAPTransportSpec) @@ -46,76 +48,182 @@ - (BOOL)sdl_isSessionActive:(SDLIAPSession *)session newAccessory:(EAAccessory * describe(@"Initialization", ^{ it(@"Should init correctly", ^{ expect(transport.delegate).toNot(beNil()); - expect(transport.controlSession.session).to(beNil()); + expect(transport.controlSession).to(beNil()); expect(transport.dataSession).to(beNil()); expect(transport.sessionSetupInProgress).to(beFalse()); - expect(transport.dataSession).to(beNil()); - expect(transport.controlSession.session).to(beNil()); expect(transport.retryCounter).to(equal(0)); expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); }); }); - describe(@"When an accessory connects while a session is not open", ^{ + describe(@"When an accessory connects while a data session has been created but not open", ^{ beforeEach(^{ + transport.dataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([transport.dataSession isSessionInProgress]).andReturn(NO); + expect(transport.controlSession.session).to(beNil()); - expect(transport.dataSession.session).to(beNil()); }); it(@"should return that a session is not active", ^{ - BOOL sessionInProgress = [transport sdl_isSessionActive:transport.dataSession newAccessory:mockAccessory]; + BOOL sessionInProgress = [transport sdl_isDataSessionActive:transport.dataSession newAccessory:mockAccessory]; expect(sessionInProgress).to(beFalse()); }); }); -// -// describe(@"When an accessory connects when a session is already open", ^{ -// beforeEach(^{ -// transport.dataSession = OCMClassMock([SDLIAPSession class]); -// }); -// -// it(@"should return that a session is active", ^{ -// BOOL sessionInProgress = [transport sdl_isSessionActive:transport.dataSession newAccessory:mockAccessory]; -// expect(sessionInProgress).to(beTrue()); -// }); -// }); - -// describe(@"When an accessory disconnects while a data session is open", ^{ -// beforeEach(^{ -// transport.controlSession = nil; -// transport.dataSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.multisession"]; -// transport.accessoryConnectDuringActiveSession = YES; -// NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; -// [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; -// }); -// -// it(@"It should close the open data session", ^{ -// expect(transport.dataSession).to(beNil()); -// expect(transport.controlSession.session).to(beNil()); -// expect(transport.retryCounter).to(equal(0)); -// expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); -// expect(transport.sessionSetupInProgress).to(beFalse()); -// }); -// }); - - describe(@"When an accessory disconnects while a control session is open", ^{ -// beforeEach(^{ -// transport.controlSession = [SDLIAPControlSession new]; -// transport.controlSession.session = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:@"com.smartdevicelink.prot0"];; -// transport.session = nil; -// transport.accessoryConnectDuringActiveSession = NO; -// transport.sessionSetupInProgress = YES; -// transport.retryCounter = 1; -// NSNotification *accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; -// [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; -// }); -// -// it(@"It should close the open control session", ^{ -// expect(transport.session).to(beNil()); -// expect(transport.controlSession).to(beNil()); -// expect(transport.retryCounter).to(equal(0)); -// expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); -// expect(transport.sessionSetupInProgress).to(beFalse()); -// }); + + describe(@"When an accessory connects when a data session is already open", ^{ + beforeEach(^{ + transport.dataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([transport.dataSession isSessionInProgress]).andReturn(YES); + + expect(transport.controlSession.session).to(beNil()); + }); + + it(@"should return that a session is active", ^{ + BOOL sessionInProgress = [transport sdl_isDataSessionActive:transport.dataSession newAccessory:mockAccessory]; + expect(sessionInProgress).to(beTrue()); + }); + }); + + describe(@"When an accessory connects when a data session has not been created", ^{ + beforeEach(^{ + transport.dataSession = nil; + + expect(transport.controlSession.session).to(beNil()); + }); + + it(@"should return that a session is active", ^{ + BOOL sessionInProgress = [transport sdl_isDataSessionActive:transport.dataSession newAccessory:mockAccessory]; + expect(sessionInProgress).to(beFalse()); + }); + }); + + describe(@"When an accessory disconnects", ^{ + __block SDLIAPSession *mockSession = nil; + __block NSNotification *accessoryDisconnectedNotification = nil; + + beforeEach(^{ + transport.controlSession = nil; + mockSession = OCMClassMock([SDLIAPSession class]); + OCMStub([mockSession accessory]).andReturn(mockAccessory); + transport.dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { + }]; + + accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; + }); + + describe(@"If an accessory connected during an active session", ^{ + beforeEach(^{ + transport.accessoryConnectDuringActiveSession = YES; + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + }); + + it(@"should set accessoryConnectDuringActiveSession to NO when the accessory disconnects", ^{ + expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); + }); + }); + + describe(@"If no accessory connected during an active session", ^{ + beforeEach(^{ + transport.accessoryConnectDuringActiveSession = NO; + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + }); + + it(@"should leave accessoryConnectDuringActiveSession at NO when the accessory disconnects", ^{ + expect(transport.accessoryConnectDuringActiveSession).to(beFalse()); + }); + }); + + describe(@"When a data session is open", ^{ + beforeEach(^{ + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + }); + + it(@"It should close, but not destroy, the open data session", ^{ + expect(transport.dataSession).toNot(beNil()); + expect(transport.dataSession.session).toNot(beNil()); + expect(transport.dataSession.session.delegate).to(beNil()); + + expect(transport.sessionSetupInProgress).to(beFalse()); + expect(transport.retryCounter).to(equal(0)); + expect(transport.controlSession).to(beNil()); + + OCMVerify([mockTransportDelegate onTransportDisconnected]); + OCMVerify([mockSession stop]); + }); + }); + + describe(@"When a control session is open", ^{ + __block SDLIAPSession *mockControlSession = nil; + __block NSNotification *accessoryDisconnectedNotification = nil; + + beforeEach(^{ + mockControlSession = OCMClassMock([SDLIAPSession class]); + OCMStub([mockControlSession accessory]).andReturn(mockAccessory); + transport.controlSession = [[SDLIAPControlSession alloc] initWithSession:mockControlSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { + }]; + + transport.dataSession = nil; + transport.sessionSetupInProgress = YES; + transport.retryCounter = 1; + accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; + }); + + it(@"Should not tell the delegate that the transport closed", ^{ + OCMReject([mockTransportDelegate onTransportDisconnected]); + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + }); + + it(@"It should reset the setup helpers", ^{ + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + + expect(transport.retryCounter).to(equal(0)); + expect(transport.sessionSetupInProgress).to(beFalse()); + }); + + it(@"It should close the open control session", ^{ + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + + OCMVerify([mockControlSession stop]); + + expect(transport.controlSession).toNot(beNil()); + expect(transport.controlSession.session).toNot(beNil()); + expect(transport.dataSession).to(beNil()); + }); + }); + + describe(@"When neither a control or data session has been established/opened", ^{ + __block NSNotification *accessoryDisconnectedNotification = nil; + __block SDLIAPControlSession *mockControlSession; + __block SDLIAPDataSession *mockDataSession; + + beforeEach(^{ + mockControlSession = OCMClassMock([SDLIAPControlSession class]); + OCMStub([mockControlSession isSessionInProgress]).andReturn(NO); + transport.controlSession = mockControlSession; + + mockDataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([mockDataSession isSessionInProgress]).andReturn(NO); + transport.dataSession = mockDataSession; + + transport.sessionSetupInProgress = YES; + transport.retryCounter = 1; + accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; + }); + + it(@"Should not tell the delegate that the transport closed", ^{ + OCMReject([mockTransportDelegate onTransportDisconnected]); + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + }); + + it(@"It should reset the setup helpers", ^{ + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; + + expect(transport.retryCounter).to(equal(0)); + expect(transport.sessionSetupInProgress).to(beFalse()); + }); + }); }); }); From f0ba35d2cf3dbfca8c8a5d1abbbba7c7d128af9c Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 23 Apr 2019 13:35:01 -0400 Subject: [PATCH 011/179] Added documentation to SDLIAPTransport --- SmartDeviceLink/SDLIAPTransport.m | 38 +++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index c30b485f5..8227109aa 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -205,6 +205,9 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { } } +/** + * Tells the lifecycle manager that the data session has been closed. + */ - (void)sdl_destroySession { self.retryCounter = 0; self.sessionSetupInProgress = NO; @@ -282,7 +285,6 @@ - (void)disconnect { } - #pragma mark Helpers /** @@ -303,6 +305,14 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { } } +/** + * Helper method for creating a session. + * + * @param accessory The SDL enabled accessory + * @param protocol The protocol string needed to open the session + * @param sessionDelegate The stream delegate + * @return A SDLIAPSession object + */ + (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; session.delegate = sessionDelegate; @@ -310,10 +320,10 @@ + (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)access } /** - * Attempt to connect an accessory using the control or legacy protocols, then return whether or not we've generated an IAP session. + * Attempts to connect an accessory using the control or legacy protocols, then returns whether or not a session was created. * - * @param accessory The accessory to attempt a connection with - * @return Whether or not we succesfully created a session. + * @param accessory The accessory to attempt a connection with + * @return Whether or not we succesfully created a session. */ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { BOOL connecting = NO; @@ -400,6 +410,11 @@ - (void)sdl_retryEstablishSession { #pragma mark Control Session Handlers +/** + * Called when the control session should be retried. + * + * @return A SDLIAPControlSessionRetryCompletionHandler handler + */ - (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandler { __weak typeof(self) weakSelf = self; return ^(BOOL retryEstablishSession) { @@ -407,6 +422,11 @@ - (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandle }; } +/** + * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. + * + * @return A SDLIAPControlSessionCreateDataSessionCompletionHandler handler + */ - (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { __weak typeof(self) weakSelf = self; return ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { @@ -418,6 +438,11 @@ - (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSes #pragma mark Data Session Handlers +/** + * Called when the data session should be retried. + * + * @return A SDLIAPDataSessionRetryCompletionHandler handler + */ - (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { __weak typeof(self) weakSelf = self; return ^(BOOL retryEstablishSession) { @@ -425,6 +450,11 @@ - (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { }; } +/** + * Called when data is received during the data session. The data is passed to the listeners. + * + * @return A SDLIAPDataSessionCreateDataReceivedHandler handler + */ - (nullable SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { __weak typeof(self) weakSelf = self; return ^(NSData * _Nonnull dataIn) { From dc68fbb76b32f5a6b0bfcb0330d5cff8d2f6297c Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 23 Apr 2019 14:02:26 -0400 Subject: [PATCH 012/179] Fixed handler formatting in SDLIAPTransport classes --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 4 ++ SmartDeviceLink/SDLIAPControlSession.h | 4 +- SmartDeviceLink/SDLIAPControlSession.m | 10 ++-- SmartDeviceLink/SDLIAPDataSession.h | 15 ++++-- SmartDeviceLink/SDLIAPDataSession.m | 54 +++++++------------ SmartDeviceLink/SDLIAPTransport.m | 6 +-- .../iAP/SDLIAPControlSessionSpec.m | 9 ++-- .../iAP/SDLIAPDataSessionSpec.m | 33 ++++++++++++ .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 7 ++- 9 files changed, 87 insertions(+), 55 deletions(-) create mode 100644 SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 89d7c79ff..2889b01c7 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1388,6 +1388,7 @@ 88EED83B1F33BECB00E6C42E /* SDLHapticRectSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88EED83A1F33BECB00E6C42E /* SDLHapticRectSpec.m */; }; 88EED83E1F33C5A400E6C42E /* SDLSendHapticData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88EED83C1F33C5A400E6C42E /* SDLSendHapticData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 88EED83F1F33C5A400E6C42E /* SDLSendHapticData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88EED83D1F33C5A400E6C42E /* SDLSendHapticData.m */; }; + 88F37A4D226F84BE00DF119B /* SDLIAPDataSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F37A4C226F84BE00DF119B /* SDLIAPDataSessionSpec.m */; }; 88F50D5F220B720E00F34648 /* SDLPerformAppServiceInteractionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F50D5E220B720E00F34648 /* SDLPerformAppServiceInteractionSpec.m */; }; 88F65133220C6DC300CAF321 /* SDLWeatherAlertSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88F65132220C6DC300CAF321 /* SDLWeatherAlertSpec.m */; }; 88F65136220C74FD00CAF321 /* SDLWeatherData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88F65134220C74FD00CAF321 /* SDLWeatherData.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -3019,6 +3020,7 @@ 88EED83A1F33BECB00E6C42E /* SDLHapticRectSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLHapticRectSpec.m; sourceTree = ""; }; 88EED83C1F33C5A400E6C42E /* SDLSendHapticData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLSendHapticData.h; sourceTree = ""; }; 88EED83D1F33C5A400E6C42E /* SDLSendHapticData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSendHapticData.m; sourceTree = ""; }; + 88F37A4C226F84BE00DF119B /* SDLIAPDataSessionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPDataSessionSpec.m; sourceTree = ""; }; 88F50D5E220B720E00F34648 /* SDLPerformAppServiceInteractionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLPerformAppServiceInteractionSpec.m; sourceTree = ""; }; 88F65132220C6DC300CAF321 /* SDLWeatherAlertSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherAlertSpec.m; sourceTree = ""; }; 88F65134220C74FD00CAF321 /* SDLWeatherData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLWeatherData.h; sourceTree = ""; }; @@ -5919,6 +5921,7 @@ 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */, 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */, 88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */, + 88F37A4C226F84BE00DF119B /* SDLIAPDataSessionSpec.m */, ); path = iAP; sourceTree = ""; @@ -7347,6 +7350,7 @@ 88DF999122035D5A00477AC1 /* SDLIAPTransportSpec.m in Sources */, 162E838A1A9BDE8B00906325 /* SDLSingleTireStatusSpec.m in Sources */, 5D6EB4CC1BF28DC600693731 /* NSMapTable+SubscriptingSpec.m in Sources */, + 88F37A4D226F84BE00DF119B /* SDLIAPDataSessionSpec.m in Sources */, 162E83051A9BDE8B00906325 /* SDLVehicleDataActiveStatusSpec.m in Sources */, 162E82E61A9BDE8B00906325 /* SDLInteractionModeSpec.m in Sources */, 888F8700221DF4880052FE4C /* SDLAsynchronousRPCOperationSpec.m in Sources */, diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index f5b5770d9..c2a39ecdf 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN -typedef void (^SDLIAPControlSessionRetryCompletionHandler)(BOOL retryEstablishSession); +typedef void (^SDLIAPControlSessionRetryCompletionHandler)(void); typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccessory *connectedaccessory, NSString *indexedProtocolString); /** @@ -43,7 +43,7 @@ typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccesso * Sets a new control session. * * @param session The new control session - * @param retrySessionHandler A handler called when the control session failed to be established and a new session should be attempted. + * @param retrySessionHandler A handler called when the control session fails to be established and a new session should be attempted. * @param createDataSessionHandler A handler called when control session is successful and a new session must be established with the recevied protocol string. * @return A SDLIAPControlSession object */ diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 5ad115f21..347525963 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -65,7 +65,7 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo SDLLogW(@"Control session failed to setup with accessory: %@. Retrying...", accessory); [self stopSession]; if (retrySessionHandler != nil) { - retrySessionHandler(YES); + retrySessionHandler(); } } else { SDLLogW(@"Control session started"); @@ -80,7 +80,7 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo } else { SDLLogW(@"Failed to setup control session"); if (retrySessionHandler != nil) { - retrySessionHandler(YES); + retrySessionHandler(); } } @@ -122,7 +122,7 @@ - (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDL [strongSelf stopSession]; if (retrySessionHandler == nil) { return; } - retrySessionHandler(YES); + retrySessionHandler(); } }; } @@ -184,7 +184,7 @@ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithRetrySessionHandler: [strongSelf stopSession]; if (retrySessionHandler == nil) { return; } - retrySessionHandler(YES); + retrySessionHandler(); }; } @@ -205,7 +205,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimerWithRetrySessionHandler:(SDLIAPControl [strongSelf stopSession]; if (retrySessionHandler == nil) { return; } - retrySessionHandler(YES); + retrySessionHandler(); }; protocolIndexTimer.elapsedBlock = elapsedBlock; diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index 908e24a45..638dbc20d 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -12,8 +12,8 @@ NS_ASSUME_NONNULL_BEGIN -typedef void (^SDLIAPDataSessionRetryCompletionHandler)(BOOL retryEstablishSession); -typedef void (^SDLIAPDataSessionCreateDataReceivedHandler)(NSData *dataIn); +typedef void (^SDLIAPDataSessionRetryCompletionHandler)(void); +typedef void (^SDLIAPDataSessionDataReceivedHandler)(NSData *dataIn); @interface SDLIAPDataSession : NSObject @@ -33,7 +33,16 @@ typedef void (^SDLIAPDataSessionCreateDataReceivedHandler)(NSData *dataIn); @property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress; - (instancetype)init NS_UNAVAILABLE; -- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler; + +/** + * Sets a new data session. + * + * @param session The new data session. + * @param retrySessionHandler A handler called when the data session fails to be established and a new session should be attempted. + * @param dataReceivedHandler A handler called when data is received from Core + * @return A SDLIAPSession object + */ +- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler; /** * Stops a current session. diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index dc665879c..0b70d9edf 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -20,8 +20,6 @@ @interface SDLIAPDataSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; -@property (nullable, strong, nonatomic) SDLIAPDataSessionRetryCompletionHandler retrySessionHandler; -@property (nullable, strong, nonatomic) SDLIAPDataSessionCreateDataReceivedHandler dataReceivedHandler; @end @@ -39,7 +37,7 @@ - (instancetype)init { return self; } -- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { +- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { self = [super init]; if (!self) { @@ -47,25 +45,27 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo } _session = session; - _retrySessionHandler = retrySessionHandler; - _dataReceivedHandler = dataReceivedHandler; if (self.session) { SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, session.protocol); SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; self.session.streamDelegate = ioStreamDelegate; - ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandler]; - ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandler]; - ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandler]; + ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandlerWithDataReceivedHandler:dataReceivedHandler]; + ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandlerWithRetrySessionHandler:retrySessionHandler]; + ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandlerWithRetrySessionHandler:retrySessionHandler]; if (![self.session start]) { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", session.accessory); [self stopSession]; - [self sdl_shouldRetryEstablishSession:YES]; + if (retrySessionHandler != nil) { + retrySessionHandler(); + } } } else { SDLLogW(@"Failed to setup data session"); - [self sdl_shouldRetryEstablishSession:YES]; + if (retrySessionHandler != nil) { + retrySessionHandler(); + } } return self; @@ -83,7 +83,7 @@ - (void)stopSession { #pragma mark - Data Stream Handlers -- (SDLStreamEndHandler)sdl_dataStreamEndedHandler { +- (SDLStreamEndHandler)sdl_dataStreamEndedHandlerWithRetrySessionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); @@ -97,18 +97,18 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { // The handler will be called on the IO thread, but the session stop method must be called on the main thread dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; - [strongSelf sdl_shouldRetryEstablishSession:YES]; + + if (retrySessionHandler == nil) { return; } + retrySessionHandler(); }); // To prevent deadlocks the handler must return to the runloop and not block the thread }; } -- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { - __weak typeof(self) weakSelf = self; +- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandlerWithDataReceivedHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { return ^(NSInputStream *istream) { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - __strong typeof(weakSelf) strongSelf = weakSelf; uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; while (istream.streamStatus == NSStreamStatusOpen && istream.hasBytesAvailable) { // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport. @@ -123,7 +123,8 @@ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { SDLLogBytes(dataIn, SDLLogBytesDirectionReceive); if (bytesRead > 0) { - [strongSelf sdl_sendData:dataIn]; + if (dataReceivedHandler == nil) { return; } + dataReceivedHandler(dataIn); } else { break; } @@ -131,7 +132,7 @@ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { }; } -- (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { +- (SDLStreamErrorHandler)sdl_dataStreamErroredHandlerWithRetrySessionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); @@ -140,7 +141,8 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { - [strongSelf sdl_shouldRetryEstablishSession:YES]; + if (retrySessionHandler == nil) { return; } + retrySessionHandler(); } }); @@ -150,22 +152,6 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { #pragma mark - Helpers -- (void)sdl_shouldRetryEstablishSession:(BOOL)retryEstablishSession { - if (self.retrySessionHandler == nil) { - return; - } - - self.retrySessionHandler(retryEstablishSession); -} - -- (void)sdl_sendData:(NSData *)data { - if (self.dataReceivedHandler == nil) { - return; - } - - self.dataReceivedHandler(data); -} - - (NSUInteger)connectionID { return self.session.accessory.connectionID; } diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 8227109aa..c4755e176 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -417,7 +417,7 @@ - (void)sdl_retryEstablishSession { */ - (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandler { __weak typeof(self) weakSelf = self; - return ^(BOOL retryEstablishSession) { + return ^{ [weakSelf sdl_retryEstablishSession]; }; } @@ -445,7 +445,7 @@ - (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSes */ - (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { __weak typeof(self) weakSelf = self; - return ^(BOOL retryEstablishSession) { + return ^{ [weakSelf sdl_retryEstablishSession]; }; } @@ -455,7 +455,7 @@ - (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { * * @return A SDLIAPDataSessionCreateDataReceivedHandler handler */ -- (nullable SDLIAPDataSessionCreateDataReceivedHandler)dataReceivedHandler { +- (nullable SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { __weak typeof(self) weakSelf = self; return ^(NSData * _Nonnull dataIn) { [weakSelf.delegate onDataReceived:dataIn]; diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 2320cbedc..2e3bd919c 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -10,9 +10,10 @@ #import #import +#import "SDLIAPControlSession.h" + #import "EAAccessory+OCMock.m" #import "SDLIAPConstants.h" -#import "SDLIAPControlSession.h" #import "SDLIAPSession.h" #import "SDLTimer.h" @@ -43,7 +44,7 @@ @interface SDLIAPControlSession() describe(@"When a session starts successfully", ^{ beforeEach(^{ OCMStub([mockSession start]).andReturn(YES); - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { createDataSessionHandlerCalled = YES; @@ -74,7 +75,7 @@ @interface SDLIAPControlSession() describe(@"When a session does not start successfully", ^{ beforeEach(^{ OCMStub([mockSession start]).andReturn(NO); - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { createDataSessionHandlerCalled = YES; @@ -93,7 +94,7 @@ @interface SDLIAPControlSession() describe(@"When a session is nil", ^{ beforeEach(^{ mockSession = nil; - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ retryHandlerCalled = YES; } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { createDataSessionHandlerCalled = YES; diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m new file mode 100644 index 000000000..1fd6e31f0 --- /dev/null +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -0,0 +1,33 @@ +// +// SDLIAPDataSessionSpec.m +// SmartDeviceLinkTests +// +// Created by Nicole on 4/23/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import +#import +#import + +#import "SDLIAPDataSession.h" + +#import "EAAccessory+OCMock.m" +#import "SDLIAPConstants.h" +#import "SDLIAPSession.h" + +QuickSpecBegin(SDLIAPDataSessionSpec) + +describe(@"SDLIAPDataSession", ^{ + __block SDLIAPDataSession *dataSession = nil; + __block BOOL retryHandlerCalled = nil; + __block BOOL createDataSessionHandlerCalled = nil; + + beforeEach(^{ + + }); +}); + +QuickSpecEnd + + diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index c96f4ba70..5e29baf57 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -6,7 +6,6 @@ // Copyright © 2019 smartdevicelink. All rights reserved. // -#import #import #import #import @@ -87,7 +86,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc describe(@"When an accessory connects when a data session has not been created", ^{ beforeEach(^{ transport.dataSession = nil; - + expect(transport.controlSession.session).to(beNil()); }); @@ -105,7 +104,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc transport.controlSession = nil; mockSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockSession accessory]).andReturn(mockAccessory); - transport.dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + transport.dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { }]; @@ -160,7 +159,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc beforeEach(^{ mockControlSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockControlSession accessory]).andReturn(mockAccessory); - transport.controlSession = [[SDLIAPControlSession alloc] initWithSession:mockControlSession retrySessionCompletionHandler:^(BOOL retryEstablishSession) { + transport.controlSession = [[SDLIAPControlSession alloc] initWithSession:mockControlSession retrySessionCompletionHandler:^{ } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { }]; From c90704d514f5805ccf58a7a6f06907b04465137c Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 24 Apr 2019 08:33:37 -0400 Subject: [PATCH 013/179] Added SDLIAPDataSession test cases --- .../iAP/SDLIAPControlSessionSpec.m | 2 +- .../iAP/SDLIAPDataSessionSpec.m | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 2e3bd919c..e503f466f 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -51,7 +51,7 @@ @interface SDLIAPControlSession() }]; }); - it(@"Should create a timer", ^{ + it(@"Should set the session and create a timer", ^{ expect(controlSession.session).toNot(beNil()); expect(controlSession.connectionID).to(equal(5)); expect(controlSession.protocolIndexTimer).toNot(beNil()); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m index 1fd6e31f0..8bb458726 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -20,11 +20,66 @@ describe(@"SDLIAPDataSession", ^{ __block SDLIAPDataSession *dataSession = nil; + __block EAAccessory *mockAccessory = nil; + __block SDLIAPSession *mockSession = nil; __block BOOL retryHandlerCalled = nil; __block BOOL createDataSessionHandlerCalled = nil; beforeEach(^{ + retryHandlerCalled = NO; + createDataSessionHandlerCalled = NO; + mockAccessory = [EAAccessory.class sdlCoreMock]; + mockSession = OCMClassMock([SDLIAPSession class]); + OCMStub([mockSession accessory]).andReturn(mockAccessory); + }); + + describe(@"When a session starts successfully", ^{ + beforeEach(^{ + OCMStub([mockSession start]).andReturn(YES); + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ + retryHandlerCalled = YES; + } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { + createDataSessionHandlerCalled = YES; + }]; + }); + + it(@"Should set the sesion", ^{ + expect(dataSession.session).toNot(beNil()); + expect(dataSession.connectionID).to(equal(5)); + expect(retryHandlerCalled).to(beFalse()); + expect(createDataSessionHandlerCalled).to(beFalse()); + }); + + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is stopped", ^{ + OCMStub([mockSession isStopped]).andReturn(NO); + expect(dataSession.isSessionInProgress).to(beTrue()); + }); + + it(@"Should be in progress if the session is running", ^{ + OCMStub([mockSession isStopped]).andReturn(YES); + expect(dataSession.isSessionInProgress).to(beFalse()); + }); + }); + }); + + describe(@"When a session does not start successfully", ^{ + beforeEach(^{ + OCMStub([mockSession start]).andReturn(NO); + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ + retryHandlerCalled = YES; + } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { + createDataSessionHandlerCalled = YES; + }]; + }); + + it(@"Should attempt to create a new session", ^{ + expect(dataSession.session).toNot(beNil()); + expect(dataSession.connectionID).to(equal(5)); + expect(retryHandlerCalled).to(beTrue()); + expect(createDataSessionHandlerCalled).to(beFalse()); + }); }); }); From bd0058e82e814388c70f6b8a2f677b62cccf81cd Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 24 Apr 2019 10:56:00 -0400 Subject: [PATCH 014/179] Finished up SDLIAPDataSession test cases --- SmartDeviceLink/SDLIAPControlSession.m | 19 ++------- SmartDeviceLink/SDLIAPDataSession.m | 15 +------ .../iAP/SDLIAPControlSessionSpec.m | 36 ++++++++++++---- .../iAP/SDLIAPDataSessionSpec.m | 41 ++++++++++++++++++- 4 files changed, 75 insertions(+), 36 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 347525963..d1e9a770d 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -30,27 +30,16 @@ @interface SDLIAPControlSession () @implementation SDLIAPControlSession -- (instancetype)init { - SDLLogV(@"SDLIAPControlSession Init"); - self = [super init]; - if (!self) { - return nil; - } - - _session = nil; - _protocolIndexTimer = nil; - - return self; -} - - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler { + SDLLogV(@"SDLIAPControlSession init"); self = [super init]; if (!self) { return nil; } - self.session = session; + _session = session; + _protocolIndexTimer = nil; if (self.session) { SDLLogD(@"Starting control session with accessory (%@)", self.session.accessory.name); @@ -225,7 +214,7 @@ - (BOOL)isSessionInProgress { #pragma mark - Lifecycle Destruction - (void)dealloc { - SDLLogV(@"SDLIAPControlSession Dealloc"); + SDLLogV(@"SDLIAPControlSession dealloc"); _session = nil; _protocolIndexTimer = nil; } diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 0b70d9edf..0009cbde9 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -25,19 +25,8 @@ @interface SDLIAPDataSession () @implementation SDLIAPDataSession -- (instancetype)init { - SDLLogV(@"SDLIAPDataSession Init"); - self = [super init]; - if (!self) { - return nil; - } - - _session = nil; - - return self; -} - - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { + SDLLogV(@"SDLIAPDataSession init"); self = [super init]; if (!self) { @@ -163,7 +152,7 @@ - (BOOL)isSessionInProgress { #pragma mark - Lifecycle Destruction - (void)dealloc { - SDLLogV(@"SDLIAPDataSession Dealloc"); + SDLLogV(@"SDLIAPDataSession dealloc"); _session = nil; } diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index e503f466f..d9736461a 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -40,7 +40,7 @@ @interface SDLIAPControlSession() OCMStub([mockSession accessory]).andReturn(mockAccessory); }); - describe(@"Session init", ^{ + describe(@"init", ^{ describe(@"When a session starts successfully", ^{ beforeEach(^{ OCMStub([mockSession start]).andReturn(YES); @@ -51,10 +51,16 @@ @interface SDLIAPControlSession() }]; }); - it(@"Should set the session and create a timer", ^{ + it(@"Should set the session", ^{ expect(controlSession.session).toNot(beNil()); expect(controlSession.connectionID).to(equal(5)); + }); + + it(@"Should create a timer", ^{ expect(controlSession.protocolIndexTimer).toNot(beNil()); + }); + + it(@"Should not try to establish a new session", ^{ expect(retryHandlerCalled).to(beFalse()); expect(createDataSessionHandlerCalled).to(beFalse()); }); @@ -83,12 +89,20 @@ @interface SDLIAPControlSession() }); it(@"Should not create a timer", ^{ - expect(controlSession.session).toNot(beNil()); - expect(controlSession.connectionID).to(equal(5)); expect(controlSession.protocolIndexTimer).to(beNil()); + }); + + it(@"Should try to establish a new session", ^{ expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); }); + + it(@"Should should stop but not destroy the session", ^{ + expect(controlSession.session).toNot(beNil()); + expect(controlSession.connectionID).to(equal(5)); + + OCMVerify([mockSession stop]); + }); }); describe(@"When a session is nil", ^{ @@ -101,11 +115,19 @@ @interface SDLIAPControlSession() }]; }); - it(@"Should not create a timer", ^{ + it(@"Should not set the session", ^{ expect(controlSession.session).to(beNil()); - expect(controlSession.isSessionInProgress).to(beFalse()); - expect(controlSession.connectionID).to(equal(0)); + }); + + it(@"Should not create a timer", ^{ expect(controlSession.protocolIndexTimer).to(beNil()); + }); + + it(@"Should return a connectionID of zero", ^{ + expect(controlSession.connectionID).to(equal(0)); + }); + + it(@"Should try to establish a new session", ^{ expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m index 8bb458726..c7c89584e 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -47,6 +47,9 @@ it(@"Should set the sesion", ^{ expect(dataSession.session).toNot(beNil()); expect(dataSession.connectionID).to(equal(5)); + }); + + it(@"Should not try to establish a new session", ^{ expect(retryHandlerCalled).to(beFalse()); expect(createDataSessionHandlerCalled).to(beFalse()); }); @@ -74,12 +77,48 @@ }]; }); - it(@"Should attempt to create a new session", ^{ + it(@"Should try to establish a new session", ^{ + expect(retryHandlerCalled).to(beTrue()); + expect(createDataSessionHandlerCalled).to(beFalse()); + }); + + it(@"Should should stop but not destroy the session", ^{ expect(dataSession.session).toNot(beNil()); expect(dataSession.connectionID).to(equal(5)); + + OCMVerify([mockSession stop]); + }); + }); + + describe(@"When a session is nil", ^{ + beforeEach(^{ + mockSession = nil; + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ + retryHandlerCalled = YES; + } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { + createDataSessionHandlerCalled = YES; + }]; + }); + + it(@"Should not set the session", ^{ + expect(dataSession).toNot(beNil()); + expect(dataSession.session).to(beNil()); + }); + + it(@"Should return a connectionID of zero", ^{ + expect(dataSession.connectionID).to(equal(0)); + }); + + it(@"Should try to establish a new session", ^{ expect(retryHandlerCalled).to(beTrue()); expect(createDataSessionHandlerCalled).to(beFalse()); }); + + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is nil", ^{ + expect(dataSession.isSessionInProgress).to(beFalse()); + }); + }); }); }); From d39b773b1ce843b0e6b48bcd445a5308efe3bf7d Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 24 Apr 2019 11:39:58 -0400 Subject: [PATCH 015/179] Refactored session init in SDLIAPTransport --- SmartDeviceLink/SDLIAPTransport.m | 49 ++++++++++++++++++------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index c4755e176..a57bd19da 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -306,17 +306,30 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { } /** - * Helper method for creating a session. + * Helper method for creating a Control session * - * @param accessory The SDL enabled accessory - * @param protocol The protocol string needed to open the session - * @param sessionDelegate The stream delegate - * @return A SDLIAPSession object + * @param accessory The SDL enabled accessory + * @param sessionDelegate The stream delegate + * @return A SDLIAPControlSession object */ -+ (nullable SDLIAPSession *)sdl_createSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { +- (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)accessory sessionDelegate:(id)sessionDelegate { + SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; + session.delegate = sessionDelegate; + return [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryControlSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; +} + +/** + * Helper method for creating a Data session + * + * @param accessory The SDL enabled accessory + * @param protocol The protocol string needed to open the session + * @param sessionDelegate The stream delegate + * @return A SDLIAPDataSession object + */ +- (SDLIAPDataSession *)sdl_createDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; session.delegate = sessionDelegate; - return session; + return [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; } /** @@ -333,18 +346,16 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { } if ([accessory supportsProtocol:MultiSessionProtocolString] && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; - self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; connecting = YES; } else if ([accessory supportsProtocol:ControlProtocolString]) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory forProtocol:ControlProtocolString sessionDelegate:self]; - self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; + self.controlSession = [self sdl_createControlSessionWithAccessory:accessory sessionDelegate:self]; connecting = YES; } else if ([accessory supportsProtocol:LegacyProtocolString]) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:accessory forProtocol:LegacyProtocolString sessionDelegate:self]; - self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:LegacyProtocolString sessionDelegate:self]; connecting = YES; } + return connecting; } @@ -372,14 +383,11 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { // Determine if we can start a multi-app session or a legacy (single-app) session if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; - self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + self.dataSession = [self sdl_createDataSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:ControlProtocolString sessionDelegate:self]; - self.controlSession = [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; + self.controlSession = [self sdl_createControlSessionWithAccessory:sdlAccessory sessionDelegate:self]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { - SDLIAPSession *session = [self.class sdl_createSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; - self.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + self.dataSession = [self sdl_createDataSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; } else { // No compatible accessory SDLLogV(@"No accessory supporting SDL was found, dismissing setup"); @@ -430,8 +438,7 @@ - (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandle - (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { __weak typeof(self) weakSelf = self; return ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - SDLIAPSession *session = [weakSelf.class sdl_createSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString sessionDelegate:weakSelf]; - weakSelf.dataSession = [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:weakSelf.retryDataSessionHandler dataReceivedCompletionHandler:weakSelf.dataReceivedHandler]; + weakSelf.dataSession = [weakSelf sdl_createDataSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString sessionDelegate:weakSelf]; }; } From 73c7aee7452801473f64cb3459aba6966786bafa Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 24 Apr 2019 11:49:29 -0400 Subject: [PATCH 016/179] Added documentation to SDLIAPTransport handlers --- SmartDeviceLink/SDLIAPControlSession.m | 7 +++++-- SmartDeviceLink/SDLIAPDataSession.m | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index d1e9a770d..df8d6c3b6 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -96,6 +96,7 @@ - (void)startSessionTimer { /** * Handler called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. * + * @param retrySessionHandler A handler called when a new session should be attempted * @return A SDLStreamEndHandler handler */ - (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { @@ -119,8 +120,9 @@ - (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDL /** * Handler called when the session gets a `NSStreamEventHasBytesAvailable` event code. A protocol string is created from the received data. Since a new session needs to be established with the protocol string, the current session is closed and a new session is created. * - * @param accessory The connected accessory - * @return A SDLStreamHasBytesHandler handler + * @param accessory The connected accessory + * @param createDataSessionHandler A handler called when the data session is established successfully with Core + * @return A SDLStreamHasBytesHandler handler */ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler { __weak typeof(self) weakSelf = self; @@ -160,6 +162,7 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce /** * Handler called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. * + * @param retrySessionHandler A handler called when a new session should be attempted * @return A SDLStreamErrorHandler handler */ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 0009cbde9..d3911f183 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -72,6 +72,12 @@ - (void)stopSession { #pragma mark - Data Stream Handlers +/** + * Handler called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. + * + * @param retrySessionHandler A handler called when a new session should be attempted + * @return A SDLStreamEndHandler handler + */ - (SDLStreamEndHandler)sdl_dataStreamEndedHandlerWithRetrySessionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -95,6 +101,12 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandlerWithRetrySessionHandler:(SDLIAP }; } +/** + * Handler called when the session gets a `NSStreamEventHasBytesAvailable` event code. The data is passed to the listener. + * + * @param dataReceivedHandler A handler called when data is received from Core + * @return A SDLStreamHasBytesHandler handler + */ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandlerWithDataReceivedHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { return ^(NSInputStream *istream) { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); @@ -121,6 +133,12 @@ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandlerWithDataReceivedHandler }; } +/** + * Handler called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. + * + * @param retrySessionHandler A handler called when a new session should be attempted + * @return A SDLStreamErrorHandler handler + */ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandlerWithRetrySessionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -139,7 +157,7 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandlerWithRetrySessionHandler:(SD }; } -#pragma mark - Helpers +#pragma mark - Getters - (NSUInteger)connectionID { return self.session.accessory.connectionID; From d523ceab105318d60993dbf893599344112201e5 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 24 Apr 2019 14:41:40 -0400 Subject: [PATCH 017/179] Fixed USB/BT not working if control session opened Fixed switching transports between USB and BT not working if a control session was opened before the data session. --- SmartDeviceLink/SDLIAPControlSession.m | 13 ++++++++++++- SmartDeviceLink/SDLIAPTransport.m | 12 ++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index df8d6c3b6..a26691a30 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -86,6 +86,16 @@ - (void)stopSession { } } +- (void)destroySession { + if (self.session == nil || self.isSessionInProgress) { + SDLLogW(@"Control session in progress. Can not destroy"); + return; + } + + SDLLogV(@"Destroying control session"); + self.session = nil; +} + - (void)startSessionTimer { if (!self.protocolIndexTimer) { return; } [self.protocolIndexTimer start]; @@ -146,6 +156,7 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce // Destroy the control session as it is no longer needed, and then create the data session. dispatch_sync(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; + [strongSelf destroySession]; }); if (accessory.isConnected) { @@ -194,7 +205,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimerWithRetrySessionHandler:(SDLIAPControl void (^elapsedBlock)(void) = ^{ __strong typeof(weakSelf) strongSelf = weakSelf; SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds); - [strongSelf stopSession]; + [strongSelf.session stop]; if (retrySessionHandler == nil) { return; } retrySessionHandler(); diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index a57bd19da..8cb6e537b 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -188,20 +188,24 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { // No connection has yet been established so we will not destroy the current session as it needs to watch for accessory connections. self.retryCounter = 0; self.sessionSetupInProgress = NO; - SDLLogV(@"Accessory (%@), disconnected, but no session is in progress.", accessory.serialNumber); + SDLLogV(@"Accessory (%@, %@), disconnected, but no session is in progress.", accessory.name, accessory.serialNumber); + } else if (accessory.connectionID == self.dataSession.connectionID) { + // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. + SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); + [self sdl_destroySession]; } else if (accessory.connectionID == self.controlSession.connectionID) { // The data session has yet to be established so we will only destroy the control session. - SDLLogV(@"Accessory (%@) disconnected during a control session", accessory.serialNumber); + SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber); self.retryCounter = 0; self.sessionSetupInProgress = NO; [self.controlSession stopSession]; [self.dataSession stopSession]; } else if (accessory.connectionID == self.dataSession.connectionID) { // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. - SDLLogV(@"Accessory (%@) disconnected during a data session", accessory.serialNumber); + SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); [self sdl_destroySession]; } else { - SDLLogV(@"Accessory (%@) disconnecting during an unknown session", accessory.serialNumber); + SDLLogV(@"Accessory (%@, %@) disconnecting during an unknown session", accessory.name, accessory.serialNumber); } } From b9305860578e44eec86dd0882549ccc57dda8ad0 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 25 Apr 2019 11:57:21 -0400 Subject: [PATCH 018/179] Keep background task alive --- SmartDeviceLink/SDLIAPTransport.m | 1 + 1 file changed, 1 insertion(+) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 8cb6e537b..37750b5f7 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -470,6 +470,7 @@ - (nullable SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { __weak typeof(self) weakSelf = self; return ^(NSData * _Nonnull dataIn) { [weakSelf.delegate onDataReceived:dataIn]; + [weakSelf sdl_backgroundTaskStart]; }; } From 9e4090122a81e91c3cb445aaa271c23041638453 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 25 Apr 2019 16:50:02 -0400 Subject: [PATCH 019/179] Initial work on re-doing the soft button manager --- Example Apps/Example ObjC/ButtonManager.m | 3 + SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 42 ++- SmartDeviceLink/SDLChoiceSetManager.m | 2 +- SmartDeviceLink/SDLSoftButtonManager.h | 7 - SmartDeviceLink/SDLSoftButtonManager.m | 295 ++++-------------- .../SDLSoftButtonReplaceOperation.h | 27 ++ .../SDLSoftButtonReplaceOperation.m | 293 +++++++++++++++++ .../SDLSoftButtonTransitionOperation.h | 28 ++ .../SDLSoftButtonTransitionOperation.m | 78 +++++ 9 files changed, 525 insertions(+), 250 deletions(-) create mode 100644 SmartDeviceLink/SDLSoftButtonReplaceOperation.h create mode 100644 SmartDeviceLink/SDLSoftButtonReplaceOperation.m create mode 100644 SmartDeviceLink/SDLSoftButtonTransitionOperation.h create mode 100644 SmartDeviceLink/SDLSoftButtonTransitionOperation.m diff --git a/Example Apps/Example ObjC/ButtonManager.m b/Example Apps/Example ObjC/ButtonManager.m index 786d5027b..4befdf726 100644 --- a/Example Apps/Example ObjC/ButtonManager.m +++ b/Example Apps/Example ObjC/ButtonManager.m @@ -135,6 +135,9 @@ - (SDLSoftButtonObject *)sdlex_softButtonImagesVisibleWithManager:(SDLManager *) SDLSoftButtonObject *object = [weakself.sdlManager.screenManager softButtonObjectNamed:ImagesVisibleSoftButton]; [object transitionToNextState]; + SDLSoftButtonObject *textButton = [weakself.sdlManager.screenManager softButtonObjectNamed:TextVisibleSoftButton]; + [textButton transitionToNextState]; + SDLLogD(@"Image visibility soft button press fired %d", weakself.imagesEnabled); }]; diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 795fb035c..252651f01 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1088,6 +1088,10 @@ 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 */; }; + 5DA150C72271FDC20032928D /* SDLSoftButtonTransitionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA150C52271FDC20032928D /* SDLSoftButtonTransitionOperation.h */; }; + 5DA150C82271FDC20032928D /* SDLSoftButtonTransitionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA150C62271FDC20032928D /* SDLSoftButtonTransitionOperation.m */; }; + 5DA150CD2271FE180032928D /* SDLSoftButtonReplaceOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA150CB2271FE180032928D /* SDLSoftButtonReplaceOperation.h */; }; + 5DA150CE2271FE180032928D /* SDLSoftButtonReplaceOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA150CC2271FE180032928D /* SDLSoftButtonReplaceOperation.m */; }; 5DA22CB71D075CF200245F5F /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB31D075CF200245F5F /* Nimble.framework */; }; 5DA22CB81D075CF200245F5F /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB41D075CF200245F5F /* OCMock.framework */; }; 5DA22CBA1D075CF200245F5F /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB61D075CF200245F5F /* Quick.framework */; }; @@ -2717,6 +2721,10 @@ 5DA0268F1AD44EE700019F86 /* SDLDialNumberResponseSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDialNumberResponseSpec.m; sourceTree = ""; }; 5DA102A21D4122C700C15826 /* NSMutableDictionary+SafeRemove.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableDictionary+SafeRemove.h"; sourceTree = ""; }; 5DA102A31D4122C700C15826 /* NSMutableDictionary+SafeRemove.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableDictionary+SafeRemove.m"; sourceTree = ""; }; + 5DA150C52271FDC20032928D /* SDLSoftButtonTransitionOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSoftButtonTransitionOperation.h; sourceTree = ""; }; + 5DA150C62271FDC20032928D /* SDLSoftButtonTransitionOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSoftButtonTransitionOperation.m; sourceTree = ""; }; + 5DA150CB2271FE180032928D /* SDLSoftButtonReplaceOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSoftButtonReplaceOperation.h; sourceTree = ""; }; + 5DA150CC2271FE180032928D /* SDLSoftButtonReplaceOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSoftButtonReplaceOperation.m; sourceTree = ""; }; 5DA22CB31D075CF200245F5F /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = sdl_ios/Carthage/Build/iOS/Nimble.framework; sourceTree = ""; }; 5DA22CB41D075CF200245F5F /* OCMock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCMock.framework; path = sdl_ios/Carthage/Build/iOS/OCMock.framework; sourceTree = ""; }; 5DA22CB61D075CF200245F5F /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = sdl_ios/Carthage/Build/iOS/Quick.framework; sourceTree = ""; }; @@ -3726,10 +3734,8 @@ children = ( 5D0A7380203F23F30001595D /* SDLSoftButtonManager.h */, 5D0A7381203F23F30001595D /* SDLSoftButtonManager.m */, - 5D0A7384203F24060001595D /* SDLSoftButtonState.h */, - 5D0A7385203F24060001595D /* SDLSoftButtonState.m */, - 5D0A7388203F24320001595D /* SDLSoftButtonObject.h */, - 5D0A7389203F24320001595D /* SDLSoftButtonObject.m */, + 5DA150CA2271FE030032928D /* Buttons */, + 5DA150C92271FDF90032928D /* Operations */, ); name = "Soft Button"; sourceTree = ""; @@ -5214,6 +5220,28 @@ name = Permissions; sourceTree = ""; }; + 5DA150C92271FDF90032928D /* Operations */ = { + isa = PBXGroup; + children = ( + 5DA150C52271FDC20032928D /* SDLSoftButtonTransitionOperation.h */, + 5DA150C62271FDC20032928D /* SDLSoftButtonTransitionOperation.m */, + 5DA150CB2271FE180032928D /* SDLSoftButtonReplaceOperation.h */, + 5DA150CC2271FE180032928D /* SDLSoftButtonReplaceOperation.m */, + ); + name = Operations; + sourceTree = ""; + }; + 5DA150CA2271FE030032928D /* Buttons */ = { + isa = PBXGroup; + children = ( + 5D0A7384203F24060001595D /* SDLSoftButtonState.h */, + 5D0A7385203F24060001595D /* SDLSoftButtonState.m */, + 5D0A7388203F24320001595D /* SDLSoftButtonObject.h */, + 5D0A7389203F24320001595D /* SDLSoftButtonObject.m */, + ); + name = Buttons; + sourceTree = ""; + }; 5DA23FF11F2FA32A009C0313 /* Audio Service */ = { isa = PBXGroup; children = ( @@ -6212,6 +6240,7 @@ 5D61FC451A84238C00846EE7 /* SDLAudioPassThruCapabilities.h in Headers */, 5D61FDC71A84238C00846EE7 /* SDLTextAlignment.h in Headers */, 5D61FD051A84238C00846EE7 /* SDLOnButtonPress.h in Headers */, + 5DA150C72271FDC20032928D /* SDLSoftButtonTransitionOperation.h in Headers */, 5D61FCC51A84238C00846EE7 /* SDLHMIZoneCapabilities.h in Headers */, 884AF94F220B488900E22928 /* SDLOnSystemCapabilityUpdated.h in Headers */, 880D267D220DE5DF00B3F496 /* SDLWeatherServiceManifest.h in Headers */, @@ -6400,6 +6429,7 @@ 5D61FDE31A84238C00846EE7 /* SDLUnregisterAppInterface.h in Headers */, 5D61FD331A84238C00846EE7 /* SDLPowerModeQualificationStatus.h in Headers */, 5D92937020B5E0E500FCC775 /* SDLDeleteChoicesOperation.h in Headers */, + 5DA150CD2271FE180032928D /* SDLSoftButtonReplaceOperation.h in Headers */, 5D61FE011A84238C00846EE7 /* SDLVehicleDataNotificationStatus.h in Headers */, 5D61FDC91A84238C00846EE7 /* SDLTextField.h in Headers */, 5D6F7A351BC5B9B60070BF37 /* SDLLockScreenViewController.h in Headers */, @@ -6683,7 +6713,7 @@ }; 5D61FA1B1A84237100846EE7 = { CreatedOnToolsVersion = 6.1.1; - LastSwiftMigration = 0940; + LastSwiftMigration = 1020; }; 5D61FA251A84237100846EE7 = { CreatedOnToolsVersion = 6.1.1; @@ -7035,6 +7065,7 @@ 5D61FD461A84238C00846EE7 /* SDLProtocolHeader.m in Sources */, 5DD8406320FCD6C10082CE04 /* SDLElectronicParkBrakeStatus.m in Sources */, 8BBEA6071F324165003EEA26 /* SDLMetadataType.m in Sources */, + 5DA150C82271FDC20032928D /* SDLSoftButtonTransitionOperation.m in Sources */, 5D61FDBC1A84238C00846EE7 /* SDLSystemAction.m in Sources */, 5D61FC381A84238C00846EE7 /* SDLAlert.m in Sources */, 88AAD4BD2211B76800F1E6D7 /* SDLMediaServiceManifest.m in Sources */, @@ -7097,6 +7128,7 @@ 1E5AD0651F207DD50029B8AF /* SDLTemperature.m in Sources */, DA9F7E901DCC04C000ACAE48 /* SDLUnsubscribeWayPointsResponse.m in Sources */, 88F65137220C74FD00CAF321 /* SDLWeatherData.m in Sources */, + 5DA150CE2271FE180032928D /* SDLSoftButtonReplaceOperation.m in Sources */, 5DE372A21ACB2ED300849FAA /* SDLHMICapabilities.m in Sources */, 5D61FDD41A84238C00846EE7 /* SDLTouchEvent.m in Sources */, 5D61FD881A84238C00846EE7 /* SDLSetGlobalProperties.m in Sources */, diff --git a/SmartDeviceLink/SDLChoiceSetManager.m b/SmartDeviceLink/SDLChoiceSetManager.m index 21dff1cc5..36914d553 100644 --- a/SmartDeviceLink/SDLChoiceSetManager.m +++ b/SmartDeviceLink/SDLChoiceSetManager.m @@ -372,7 +372,7 @@ - (void)sdl_findIdsOnChoices:(NSSet *)choices { } } -#pragma mark - Setters +#pragma mark - Keyboard Configuration - (void)setKeyboardConfiguration:(nullable SDLKeyboardProperties *)keyboardConfiguration { if (keyboardConfiguration == nil) { diff --git a/SmartDeviceLink/SDLSoftButtonManager.h b/SmartDeviceLink/SDLSoftButtonManager.h index b163fe599..8a20b50f6 100644 --- a/SmartDeviceLink/SDLSoftButtonManager.h +++ b/SmartDeviceLink/SDLSoftButtonManager.h @@ -53,13 +53,6 @@ typedef void(^SDLSoftButtonUpdateCompletionHandler)(NSError *__nullable error); */ - (void)stop; -/** - Cause all transitions in between `beginUpdates` and this method call to occur in one RPC update. - - @param handler The handler called once the update is completed. - */ -- (void)updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler; - /** Returns a soft button object associated with the manager that is named the specified name or nil if nothing corresponds. diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m index 3f19ff1e1..826c363dd 100644 --- a/SmartDeviceLink/SDLSoftButtonManager.m +++ b/SmartDeviceLink/SDLSoftButtonManager.m @@ -22,7 +22,9 @@ #import "SDLSoftButton.h" #import "SDLSoftButtonCapabilities.h" #import "SDLSoftButtonObject.h" +#import "SDLSoftButtonReplaceOperation.h" #import "SDLSoftButtonState.h" +#import "SDLSoftButtonTransitionOperation.h" NS_ASSUME_NONNULL_BEGIN @@ -35,24 +37,15 @@ @interface SDLSoftButtonObject() @interface SDLSoftButtonManager() -@property (strong, nonatomic) NSArray *currentSoftButtons; - @property (weak, nonatomic) id connectionManager; @property (weak, nonatomic) SDLFileManager *fileManager; -@property (strong, nonatomic, nullable) SDLShow *inProgressUpdate; -@property (copy, nonatomic, nullable) SDLSoftButtonUpdateCompletionHandler inProgressHandler; - -@property (assign, nonatomic) BOOL hasQueuedUpdate; -@property (copy, nonatomic, nullable) SDLSoftButtonUpdateCompletionHandler queuedUpdateHandler; +@property (strong, nonatomic) NSOperationQueue *transactionQueue; @property (copy, nonatomic, nullable) SDLHMILevel currentLevel; @property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities; @property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities; -@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToUpdate; -@property (assign, nonatomic) BOOL isDirty; - @end @implementation SDLSoftButtonManager @@ -66,8 +59,7 @@ - (instancetype)initWithConnectionManager:(id)connecti _softButtonObjects = @[]; _currentLevel = nil; - _waitingOnHMILevelUpdateToUpdate = NO; - _isDirty = NO; + _transactionQueue = [self sdl_newTransactionQueue]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_displayLayoutResponse:) name:SDLDidReceiveSetDisplayLayoutResponse object:nil]; @@ -79,35 +71,31 @@ - (instancetype)initWithConnectionManager:(id)connecti - (void)stop { _softButtonObjects = @[]; _currentMainField1 = nil; - - _inProgressUpdate = nil; - _inProgressHandler = nil; - _hasQueuedUpdate = NO; - _queuedUpdateHandler = nil; _currentLevel = nil; _displayCapabilities = nil; _softButtonCapabilities = nil; - _waitingOnHMILevelUpdateToUpdate = NO; - _isDirty = NO; + + [_transactionQueue cancelAllOperations]; + self.transactionQueue = [self sdl_newTransactionQueue]; } +- (NSOperationQueue *)sdl_newTransactionQueue { + NSOperationQueue *queue = [[NSOperationQueue alloc] init]; + queue.name = @"SDLSoftButtonManager Transaction Queue"; + queue.maxConcurrentOperationCount = 1; + queue.qualityOfService = NSQualityOfServiceUserInitiated; + queue.suspended = YES; + + return queue; +} + + +#pragma mark - Sending Soft Buttons + - (void)setSoftButtonObjects:(NSArray *)softButtonObjects { // Only update if something changed. This prevents, for example, an empty array being reset if (_softButtonObjects == softButtonObjects) { return; - } else { - self.isDirty = YES; - } - - self.inProgressUpdate = nil; - if (self.inProgressHandler != nil) { - self.inProgressHandler([NSError sdl_softButtonManager_pendingUpdateSuperseded]); - self.inProgressHandler = nil; - } - self.hasQueuedUpdate = NO; - if (self.queuedUpdateHandler != nil) { - self.queuedUpdateHandler([NSError sdl_softButtonManager_pendingUpdateSuperseded]); - self.queuedUpdateHandler = nil; } // Set the soft button ids. Check to make sure no two soft buttons have the same name, there aren't many soft buttons, so n^2 isn't going to be bad @@ -129,231 +117,60 @@ - (void)setSoftButtonObjects:(NSArray *)softButtonObjects _softButtonObjects = softButtonObjects; - [self updateWithCompletionHandler:nil]; -} - -- (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name { - for (SDLSoftButtonObject *object in self.softButtonObjects) { - if ([object.name isEqualToString:name]) { - return object; - } - } - - return nil; + SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:_softButtonObjects mainField1:self.currentMainField1]; + [self.transactionQueue cancelAllOperations]; + [self.transactionQueue addOperation:op]; } - (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton { - self.isDirty = YES; - [self updateWithCompletionHandler:nil]; -} - -- (void)updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler { - // Don't send if we're batching - if (self.isBatchingUpdates || !self.isDirty) { return; } - - // Don't send if we're in HMI NONE - if (self.currentLevel == nil || [self.currentLevel isEqualToString:SDLHMILevelNone]) { - self.waitingOnHMILevelUpdateToUpdate = YES; - return; - } else { - self.waitingOnHMILevelUpdateToUpdate = NO; - } - - [self sdl_updateWithCompletionHandler:handler]; + SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.softButtonCapabilities softButtons:[self sdl_softButtonsForCurrentState] mainField1:self.currentMainField1]; + [self.transactionQueue addOperation:op]; } -- (void)sdl_updateWithCompletionHandler:(nullable SDLSoftButtonUpdateCompletionHandler)handler { - SDLLogD(@"Updating soft buttons"); - self.isDirty = NO; - - if (self.inProgressUpdate != nil) { - SDLLogV(@"In progress update exists, queueing update"); - // If we already have a pending update, we're going to tell the old handler that it was superseded by a new update and then return - if (self.queuedUpdateHandler != nil) { - SDLLogV(@"Queued update already exists, superseding previous queued update"); - self.queuedUpdateHandler([NSError sdl_softButtonManager_pendingUpdateSuperseded]); - self.queuedUpdateHandler = nil; - } - - if (handler != nil) { - self.queuedUpdateHandler = handler; - } else { - self.hasQueuedUpdate = YES; - } - - return; - } - - self.inProgressHandler = [handler copy]; - self.inProgressUpdate = [[SDLShow alloc] init]; - self.inProgressUpdate.mainField1 = self.currentMainField1 ?: @""; - - if ([self sdl_supportsSoftButtonImages]) { - [self sdl_uploadInitialStateImages]; - [self sdl_uploadOtherStateImages]; - } - - if (self.softButtonObjects == nil) { - SDLLogV(@"Soft button objects are nil, sending an empty array"); - self.inProgressUpdate.softButtons = @[]; - } else if (([self sdl_currentStateHasImages] && ![self sdl_allCurrentStateImagesAreUploaded]) - || ![self sdl_supportsSoftButtonImages]) { - // The images don't yet exist on the head unit, or we cannot use images, send a text update, if possible. Otherwise, don't send anything yet. - NSArray *textOnlyButtons = [self sdl_textButtonsForCurrentState]; - if (textOnlyButtons != nil) { - SDLLogV(@"Soft button images unavailable, sending text buttons"); - self.inProgressUpdate.softButtons = textOnlyButtons; - } else { - SDLLogV(@"Soft button images unavailable, text buttons unavailable"); - self.inProgressUpdate = nil; - return; - } - } else { - SDLLogV(@"Sending soft buttons with images"); - self.inProgressUpdate.softButtons = [self sdl_softButtonsForCurrentState]; - } - - __weak typeof(self) weakSelf = self; - [self.connectionManager sendConnectionRequest:self.inProgressUpdate withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { - __strong typeof(weakSelf) strongSelf = weakSelf; - - SDLLogD(@"Soft button update completed"); - - strongSelf.inProgressUpdate = nil; - if (strongSelf.inProgressHandler != nil) { - strongSelf.inProgressHandler(error); - strongSelf.inProgressHandler = nil; - } - - if (strongSelf.hasQueuedUpdate) { - SDLLogV(@"Queued update exists, sending another update"); - [strongSelf updateWithCompletionHandler:[strongSelf.queuedUpdateHandler copy]]; - strongSelf.queuedUpdateHandler = nil; - strongSelf.hasQueuedUpdate = NO; - } - }]; -} -#pragma mark - Images +#pragma mark - Getting Soft Buttons -- (BOOL)sdl_currentStateHasImages { +- (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name { for (SDLSoftButtonObject *object in self.softButtonObjects) { - if (object.currentState.artwork != nil) { - return YES; + if ([object.name isEqualToString:name]) { + return object; } } - return NO; + return nil; } -- (BOOL)sdl_allCurrentStateImagesAreUploaded { +- (NSArray *)sdl_softButtonsForCurrentState { + NSMutableArray *softButtons = [NSMutableArray arrayWithCapacity:self.softButtonObjects.count]; for (SDLSoftButtonObject *button in self.softButtonObjects) { - SDLArtwork *artwork = button.currentState.artwork; - if (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && !artwork.isStaticIcon) { - return NO; - } + [softButtons addObject:button.currentStateSoftButton]; } - return YES; + return [softButtons copy]; } -- (BOOL)sdl_supportsSoftButtonImages { - BOOL supportsGraphics = self.displayCapabilities ? self.displayCapabilities.graphicSupported.boolValue : YES; - BOOL supportsSoftButtonImages = self.softButtonCapabilities ? self.softButtonCapabilities.imageSupported.boolValue : NO; +#pragma mark - Getters / Setters - return (supportsGraphics && supportsSoftButtonImages); -} +- (void)setBatchUpdates:(BOOL)batchUpdates { + _batchUpdates = batchUpdates; -- (void)sdl_uploadInitialStateImages { - NSMutableArray *initialStatesToBeUploaded = [NSMutableArray array]; - // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready. - for (SDLSoftButtonObject *object in self.softButtonObjects) { - if ([self sdl_artworkNeedsUpload:object.currentState.artwork]) { - [initialStatesToBeUploaded addObject:object.currentState.artwork]; - } - } - - // Upload initial images, then other state images - if (initialStatesToBeUploaded.count > 0) { - SDLLogD(@"Uploading soft button initial artworks"); - [self.fileManager uploadArtworks:[initialStatesToBeUploaded copy] completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { - if (error != nil) { - SDLLogE(@"Error uploading soft button artworks: %@", error); - } - - SDLLogD(@"Soft button initial artworks uploaded"); - [self sdl_updateWithCompletionHandler:nil]; - }]; - } + _transactionQueue.suspended = batchUpdates; } -- (void)sdl_uploadOtherStateImages { - NSMutableArray *otherStatesToBeUploaded = [NSMutableArray array]; - // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready. - for (SDLSoftButtonObject *object in self.softButtonObjects) { - for (SDLSoftButtonState *state in object.states) { - if ([state.name isEqualToString:object.currentState.name]) { continue; } - if ([self sdl_artworkNeedsUpload:state.artwork]) { - [otherStatesToBeUploaded addObject:state.artwork]; - } - } - } - - if (otherStatesToBeUploaded.count > 0) { - SDLLogD(@"Uploading soft button other state artworks"); - [self.fileManager uploadArtworks:[otherStatesToBeUploaded copy] completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { - if (error != nil) { - SDLLogE(@"Error uploading soft button artworks: %@", error); - } +- (void)setCurrentMainField1:(nullable NSString *)currentMainField1 { + _currentMainField1 = currentMainField1; - SDLLogD(@"Soft button other state artworks uploaded"); - // In case our soft button states have changed in the meantime - [self sdl_updateWithCompletionHandler:nil]; - }]; - } -} - -- (BOOL)sdl_artworkNeedsUpload:(SDLArtwork *)artwork { - return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && !artwork.isStaticIcon); -} - -#pragma mark - Creating Soft Buttons - -/** - Returns text soft buttons representing the initial states of the button objects, or nil if _any_ of the buttons' current states are image only buttons. - - @return The text soft buttons - */ -- (nullable NSArray *)sdl_textButtonsForCurrentState { - NSMutableArray *textButtons = [NSMutableArray arrayWithCapacity:self.softButtonObjects.count]; - for (SDLSoftButtonObject *buttonObject in self.softButtonObjects) { - SDLSoftButton *button = buttonObject.currentStateSoftButton; - if (button.text == nil) { - return nil; + for (NSUInteger i = 0; i < self.transactionQueue.operations.count; i++) { + if ([self.transactionQueue.operations[i] isMemberOfClass:[SDLSoftButtonReplaceOperation class]]) { + SDLSoftButtonReplaceOperation *op = self.transactionQueue.operations[i]; + op.mainField1 = currentMainField1; + } else if ([self.transactionQueue.operations[i] isMemberOfClass:[SDLSoftButtonTransitionOperation class]]) { + SDLSoftButtonTransitionOperation *op = self.transactionQueue.operations[i]; + op.mainField1 = currentMainField1; } - - button.image = nil; - button.type = SDLSoftButtonTypeText; - [textButtons addObject:button]; - } - - return [textButtons copy]; -} - -- (NSArray *)sdl_softButtonsForCurrentState { - NSMutableArray *softButtons = [NSMutableArray arrayWithCapacity:self.softButtonObjects.count]; - for (SDLSoftButtonObject *button in self.softButtonObjects) { - [softButtons addObject:button.currentStateSoftButton]; } - - return [softButtons copy]; } -#pragma mark - Getters - -- (BOOL)hasQueuedUpdate { - return (_queuedUpdateHandler != nil ?: _hasQueuedUpdate); -} #pragma mark - RPC Responses @@ -382,9 +199,10 @@ - (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification { self.softButtonCapabilities = response.softButtonCapabilities ? response.softButtonCapabilities.firstObject : nil; self.displayCapabilities = response.displayCapabilities; - // Auto-send an updated Show + // Auto-send an updated Show to account for changes to the capabilities if (self.softButtonObjects.count > 0) { - [self updateWithCompletionHandler:nil]; + SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:self.softButtonObjects mainField1:self.currentMainField1]; + [self.transactionQueue addOperation:op]; } } @@ -392,12 +210,15 @@ - (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification; SDLHMILevel oldHMILevel = self.currentLevel; - self.currentLevel = hmiStatus.hmiLevel; - - // Auto-send an updated show if we were in NONE and now we are not - if ([oldHMILevel isEqualToString:SDLHMILevelNone] && ![self.currentLevel isEqualToString:SDLHMILevelNone] && self.waitingOnHMILevelUpdateToUpdate) { - [self updateWithCompletionHandler:nil]; + if (![oldHMILevel isEqualToEnum:hmiStatus.hmiLevel]) { + if ([hmiStatus.hmiLevel isEqualToEnum:SDLHMILevelNone]) { + self.transactionQueue.suspended = YES; + } else { + self.transactionQueue.suspended = NO; + } } + + self.currentLevel = hmiStatus.hmiLevel; } @end diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.h b/SmartDeviceLink/SDLSoftButtonReplaceOperation.h new file mode 100644 index 000000000..1d46db59a --- /dev/null +++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.h @@ -0,0 +1,27 @@ +// +// SDLSoftButtonReplaceOperation.h +// SmartDeviceLink +// +// Created by Joel Fischer on 4/25/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +#import "SDLAsynchronousOperation.h" + +@class SDLSoftButtonCapabilities; +@class SDLFileManager; +@class SDLSoftButtonObject; + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLSoftButtonReplaceOperation : SDLAsynchronousOperation + +@property (strong, nonatomic) NSString *mainField1; + +- (instancetype)initWithConnectionManager:(id)connectionManager fileManager:(SDLFileManager *)fileManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtonObjects:(NSArray *)softButtonObjects mainField1:(NSString *)mainField1; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m new file mode 100644 index 000000000..f54e2eddf --- /dev/null +++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m @@ -0,0 +1,293 @@ +// +// SDLSoftButtonReplaceOperation.m +// SmartDeviceLink +// +// Created by Joel Fischer on 4/25/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLSoftButtonReplaceOperation.h" + +#import "SDLArtwork.h" +#import "SDLConnectionManagerType.h" +#import "SDLDisplayCapabilities+ShowManagerExtensions.h" +#import "SDLFileManager.h" +#import "SDLLogMacros.h" +#import "SDLShow.h" +#import "SDLSoftButton.h" +#import "SDLSoftButtonCapabilities.h" +#import "SDLSoftButtonObject.h" +#import "SDLSoftButtonState.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLSoftButtonReplaceOperation () + +@property (strong, nonatomic) SDLSoftButtonCapabilities *softButtonCapabilities; +@property (strong, nonatomic) NSArray *softButtonObjects; + +@property (weak, nonatomic) id connectionManager; +@property (weak, nonatomic) SDLFileManager *fileManager; +@property (copy, nonatomic, nullable) NSError *internalError; + +@end + +@implementation SDLSoftButtonReplaceOperation + +- (instancetype)initWithConnectionManager:(id)connectionManager fileManager:(SDLFileManager *)fileManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtonObjects:(NSArray *)softButtonObjects mainField1:(NSString *)mainField1 { + self = [super init]; + if (!self) { return nil; } + + _connectionManager = connectionManager; + _softButtonCapabilities = capabilities; + _softButtonObjects = softButtonObjects; + _mainField1 = mainField1; + + return self; +} + +- (void)start { + [super start]; + + // Check the state of our images + if (![self sdl_supportsSoftButtonImages]) { + // We don't support images at all + SDLLogW(@"Soft button images are not supported. Attempting to send text-only soft buttons. If any button does not contain text, no buttons will be sent."); + + // Send text buttons if all the soft buttons have text + [self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^{}]; + } else if ([self sdl_currentStateHasImages] && ![self sdl_allCurrentStateImagesAreUploaded]) { + // If there are images that aren't uploaded + // Send text buttons if all the soft buttons have text + [self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^{}]; + + // Upload initial images + __weak typeof(self) weakself = self; + [self sdl_uploadInitialStateImagesWithCompletionHandler:^{ + // Send initial soft buttons w/ images + [weakself sdl_sendCurrentStateSoftButtonsWithCompletionHandler:^{ + // Upload other images + [weakself sdl_uploadOtherStateImagesWithCompletionHandler:^{ + __strong typeof(weakself) strongself = weakself; + SDLLogV(@"Finished sending other images for soft buttons"); + [strongself finishOperation]; + }]; + }]; + }]; + } else { + // All the images are already uploaded. Send initial soft buttons w/ images. + __weak typeof(self) weakself = self; + [self sdl_sendCurrentStateSoftButtonsWithCompletionHandler:^{ + __strong typeof(weakself) strongself = weakself; + SDLLogV(@"Finished sending soft buttons with images"); + [strongself finishOperation]; + }]; + } +} + + +#pragma mark - Uploading Images + +- (void)sdl_uploadInitialStateImagesWithCompletionHandler:(void (^)(void))handler { + NSMutableArray *initialStatesToBeUploaded = [NSMutableArray array]; + // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready. + for (SDLSoftButtonObject *object in self.softButtonObjects) { + if ([self sdl_artworkNeedsUpload:object.currentState.artwork]) { + [initialStatesToBeUploaded addObject:object.currentState.artwork]; + } + } + + if (initialStatesToBeUploaded.count == 0) { + SDLLogV(@"No initial state artworks to upload"); + handler(); + return; + } + + SDLLogD(@"Uploading soft button initial artworks"); + NSMutableArray *failedArtworkNames = [NSMutableArray array]; + __weak typeof(self) weakself = self; + [self.fileManager uploadArtworks:[initialStatesToBeUploaded copy] progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) { + SDLLogV(@"Uploaded initial state artwork: %@, error: %@, percent complete: %f.2%%", artworkName, error, uploadPercentage * 100); + if (error != nil) { + [failedArtworkNames addObject:artworkName]; + } + + if (weakself.isCancelled) { + [weakself finishOperation]; + return NO; + } + + return YES; + } completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { + if (error != nil) { + SDLLogE(@"Error uploading soft button artworks: %@", error); + } else { + SDLLogD(@"Soft button initial state artworks uploaded"); + } + + handler(); + }]; +} + +- (void)sdl_uploadOtherStateImagesWithCompletionHandler:(void (^)(void))handler { + NSMutableArray *otherStatesToBeUploaded = [NSMutableArray array]; + // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready. + for (SDLSoftButtonObject *object in self.softButtonObjects) { + for (SDLSoftButtonState *state in object.states) { + if ([state.name isEqualToString:object.currentState.name]) { continue; } + if ([self sdl_artworkNeedsUpload:state.artwork]) { + [otherStatesToBeUploaded addObject:state.artwork]; + } + } + } + + if (otherStatesToBeUploaded.count == 0) { + SDLLogV(@"No other state artworks to upload"); + handler(); + return; + } + + SDLLogD(@"Uploading soft button other state artworks"); + NSMutableArray *failedArtworkNames = [NSMutableArray array]; + __weak typeof(self) weakself = self; + [self.fileManager uploadArtworks:[otherStatesToBeUploaded copy] progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) { + SDLLogV(@"Uploaded other state artwork: %@, error: %@, percent complete: %f.2%%", artworkName, error, uploadPercentage * 100); + if (error != nil) { + [failedArtworkNames addObject:artworkName]; + } + + if (weakself.isCancelled) { + [weakself finishOperation]; + return NO; + } + + return YES; + } completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { + if (error != nil) { + SDLLogE(@"Error uploading soft button artworks: %@", error); + } else { + SDLLogD(@"Soft button other state artworks uploaded"); + } + + handler(); + }]; +} + + +#pragma mark - Sending the Soft Buttons + +- (void)sdl_sendCurrentStateSoftButtonsWithCompletionHandler:(void (^)(void))handler { + if (self.isCancelled) { + [self finishOperation]; + } + + SDLLogV(@"Preparing to send full soft buttons"); + NSMutableArray *softButtons = [NSMutableArray arrayWithCapacity:self.softButtonObjects.count]; + for (SDLSoftButtonObject *buttonObject in self.softButtonObjects) { + [softButtons addObject:buttonObject.currentStateSoftButton]; + } + + SDLShow *show = [[SDLShow alloc] init]; + show.mainField1 = self.mainField1; + show.softButtons = [softButtons copy]; + + [self.connectionManager sendConnectionRequest:show withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { + if (error != nil) { + SDLLogW(@"Failed to update soft buttons with text buttons: %@", error); + } + + SDLLogD(@"Finished sending text only soft buttons"); + handler(); + }]; +} + +/** + Returns text soft buttons representing the current states of the button objects, or returns if _any_ of the buttons' current states are image only buttons. +*/ +- (void)sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:(void (^)(void))handler { + if (self.isCancelled) { + [self finishOperation]; + } + + SDLLogV(@"Preparing to send text-only soft buttons"); + NSMutableArray *textButtons = [NSMutableArray arrayWithCapacity:self.softButtonObjects.count]; + for (SDLSoftButtonObject *buttonObject in self.softButtonObjects) { + SDLSoftButton *button = buttonObject.currentStateSoftButton; + if (button.text == nil) { + SDLLogW(@"Attempted to create text buttons, but some buttons don't support text, so no text-only soft buttons will be sent"); + handler(); + return; + } + + button.image = nil; + button.type = SDLSoftButtonTypeText; + [textButtons addObject:button]; + } + + SDLShow *show = [[SDLShow alloc] init]; + show.mainField1 = self.mainField1; + show.softButtons = [textButtons copy]; + + [self.connectionManager sendConnectionRequest:show withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { + if (error != nil) { + SDLLogW(@"Failed to update soft buttons with text buttons: %@", error); + } + + SDLLogD(@"Finished sending text only soft buttons"); + handler(); + }]; +} + +#pragma mark - Images + +- (BOOL)sdl_artworkNeedsUpload:(SDLArtwork *)artwork { + return (artwork != nil && ![self.fileManager hasUploadedFile:artwork] && !artwork.isStaticIcon); +} + +- (BOOL)sdl_currentStateHasImages { + for (SDLSoftButtonObject *object in self.softButtonObjects) { + if (object.currentState.artwork != nil) { + return YES; + } + } + + return NO; +} + +- (BOOL)sdl_allCurrentStateImagesAreUploaded { + for (SDLSoftButtonObject *button in self.softButtonObjects) { + SDLArtwork *artwork = button.currentState.artwork; + if ([self sdl_artworkNeedsUpload:artwork]) { + return NO; + } + } + + return YES; +} + +- (BOOL)sdl_supportsSoftButtonImages { + return self.softButtonCapabilities ? self.softButtonCapabilities.imageSupported.boolValue : NO; +} + +#pragma mark - Property Overrides + +- (void)finishOperation { + SDLLogV(@"Finishing soft button replace operation"); + [super finishOperation]; +} + +- (nullable NSString *)name { + return @"com.sdl.softbuttonmanager.replace"; +} + +- (NSOperationQueuePriority)queuePriority { + return NSOperationQueuePriorityNormal; +} + +- (nullable NSError *)error { + return self.internalError; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h new file mode 100644 index 000000000..f167028b4 --- /dev/null +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h @@ -0,0 +1,28 @@ +// +// SDLSoftButtonTransitionOperation.h +// SmartDeviceLink +// +// Created by Joel Fischer on 4/25/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +#import "SDLAsynchronousOperation.h" + +@class SDLSoftButtonCapabilities; +@class SDLSoftButton; + +@protocol SDLConnectionManagerType; + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLSoftButtonTransitionOperation : SDLAsynchronousOperation + +@property (strong, nonatomic) NSString *mainField1; + +- (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.m b/SmartDeviceLink/SDLSoftButtonTransitionOperation.m new file mode 100644 index 000000000..9ea155e0f --- /dev/null +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.m @@ -0,0 +1,78 @@ +// +// SDLSoftButtonTransitionOperation.m +// SmartDeviceLink +// +// Created by Joel Fischer on 4/25/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLSoftButtonTransitionOperation.h" + +#import "SDLConnectionManagerType.h" +#import "SDLSoftButtonCapabilities.h" +#import "SDLShow.h" +#import "SDLSoftButton.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLSoftButtonTransitionOperation () + +@property (strong, nonatomic) SDLSoftButtonCapabilities *softButtonCapabilities; +@property (strong, nonatomic) NSArray *softButtons; + +@property (weak, nonatomic) id connectionManager; +@property (copy, nonatomic, nullable) NSError *internalError; + +@end + +@implementation SDLSoftButtonTransitionOperation + +- (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1 { + self = [super init]; + if (!self) { return nil; } + + _connectionManager = connectionManager; + _softButtonCapabilities = capabilities; + _softButtons = softButtons; + _mainField1 = mainField1; + + return self; +} + +- (void)start { + [super start]; + + [self sdl_sendNewSoftButtons]; +} + +- (void)sdl_sendNewSoftButtons { + SDLShow *newShow = [[SDLShow alloc] init]; + newShow.mainField1 = self.mainField1; + newShow.softButtons = self.softButtons; + + [self.connectionManager sendConnectionRequest:newShow withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { + if (error != nil) { + self.internalError = error; + } + + [self finishOperation]; + }]; +} + +#pragma mark - Property Overrides + +- (nullable NSString *)name { + return @"com.sdl.softbuttonmanager.transition"; +} + +- (NSOperationQueuePriority)queuePriority { + return NSOperationQueuePriorityNormal; +} + +- (nullable NSError *)error { + return self.internalError; +} + +@end + +NS_ASSUME_NONNULL_END From c939ce662ddb58a384b03a90b70995ef61e9eb25 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 26 Apr 2019 09:54:42 -0400 Subject: [PATCH 020/179] Cleanup and fixes --- SmartDeviceLink/SDLAsynchronousOperation.h | 1 + SmartDeviceLink/SDLLogFileModuleMap.m | 2 +- SmartDeviceLink/SDLScreenManager.m | 1 - SmartDeviceLink/SDLSoftButtonReplaceOperation.h | 2 ++ SmartDeviceLink/SDLSoftButtonReplaceOperation.m | 3 ++- SmartDeviceLink/SDLSoftButtonTransitionOperation.m | 2 ++ 6 files changed, 8 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLAsynchronousOperation.h b/SmartDeviceLink/SDLAsynchronousOperation.h index ad0697b2a..b7e0e0614 100644 --- a/SmartDeviceLink/SDLAsynchronousOperation.h +++ b/SmartDeviceLink/SDLAsynchronousOperation.h @@ -12,6 +12,7 @@ @property (copy, nonatomic, readonly, nullable) NSError *error; +- (void)start; - (void)finishOperation; @end diff --git a/SmartDeviceLink/SDLLogFileModuleMap.m b/SmartDeviceLink/SDLLogFileModuleMap.m index 9af182d88..2c4dfd731 100644 --- a/SmartDeviceLink/SDLLogFileModuleMap.m +++ b/SmartDeviceLink/SDLLogFileModuleMap.m @@ -87,7 +87,7 @@ + (SDLLogFileModule *)sdl_screenManagerTextAndGraphicModule { } + (SDLLogFileModule *)sdl_screenManagerSoftButtonModule { - return [SDLLogFileModule moduleWithName:@"Screen/SoftButton" files:[NSSet setWithArray:@[@"SDLSoftButtonManager", @"SDLSoftButtonObject", @"SDLSoftButtonState"]]]; + return [SDLLogFileModule moduleWithName:@"Screen/SoftButton" files:[NSSet setWithArray:@[@"SDLSoftButtonManager", @"SDLSoftButtonObject", @"SDLSoftButtonState", @"SDLSoftButtonTransitionOperation", @"SDLSoftButtonReplaceOperation"]]]; } + (SDLLogFileModule *)sdl_screenManagerMenuModule { diff --git a/SmartDeviceLink/SDLScreenManager.m b/SmartDeviceLink/SDLScreenManager.m index bfd8c9b71..6365a1efc 100644 --- a/SmartDeviceLink/SDLScreenManager.m +++ b/SmartDeviceLink/SDLScreenManager.m @@ -237,7 +237,6 @@ - (void)endUpdatesWithCompletionHandler:(nullable SDLScreenManagerUpdateCompleti self.textAndGraphicManager.batchUpdates = NO; [self.textAndGraphicManager updateWithCompletionHandler:handler]; - [self.softButtonManager updateWithCompletionHandler:handler]; } #pragma mark - Choice Sets diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.h b/SmartDeviceLink/SDLSoftButtonReplaceOperation.h index 1d46db59a..42bae5792 100644 --- a/SmartDeviceLink/SDLSoftButtonReplaceOperation.h +++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.h @@ -14,6 +14,8 @@ @class SDLFileManager; @class SDLSoftButtonObject; +@protocol SDLConnectionManagerType; + NS_ASSUME_NONNULL_BEGIN @interface SDLSoftButtonReplaceOperation : SDLAsynchronousOperation diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m index f54e2eddf..82f5b4ffe 100644 --- a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m +++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m @@ -39,6 +39,7 @@ - (instancetype)initWithConnectionManager:(id)connecti if (!self) { return nil; } _connectionManager = connectionManager; + _fileManager = fileManager; _softButtonCapabilities = capabilities; _softButtonObjects = softButtonObjects; _mainField1 = mainField1; @@ -89,8 +90,8 @@ - (void)start { #pragma mark - Uploading Images - (void)sdl_uploadInitialStateImagesWithCompletionHandler:(void (^)(void))handler { - NSMutableArray *initialStatesToBeUploaded = [NSMutableArray array]; // Upload all soft button images, the initial state images first, then the other states. We need to send updates when the initial state is ready. + NSMutableArray *initialStatesToBeUploaded = [NSMutableArray array]; for (SDLSoftButtonObject *object in self.softButtonObjects) { if ([self sdl_artworkNeedsUpload:object.currentState.artwork]) { [initialStatesToBeUploaded addObject:object.currentState.artwork]; diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.m b/SmartDeviceLink/SDLSoftButtonTransitionOperation.m index 9ea155e0f..f2f5c97e5 100644 --- a/SmartDeviceLink/SDLSoftButtonTransitionOperation.m +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.m @@ -9,6 +9,7 @@ #import "SDLSoftButtonTransitionOperation.h" #import "SDLConnectionManagerType.h" +#import "SDLLogMacros.h" #import "SDLSoftButtonCapabilities.h" #import "SDLShow.h" #import "SDLSoftButton.h" @@ -52,6 +53,7 @@ - (void)sdl_sendNewSoftButtons { [self.connectionManager sendConnectionRequest:newShow withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { if (error != nil) { + SDLLogW(@"Failed to transition soft button to new state. Error: %@, Response: %@", error, response); self.internalError = error; } From dde10d32d9e35e1202cbe5dbeedc86ae5c2d517b Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 2 May 2019 09:49:07 -0400 Subject: [PATCH 021/179] Transition operation uses the SB Objects * Working on test cases --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 16 ++ SmartDeviceLink/SDLSoftButtonManager.m | 10 +- .../SDLSoftButtonTransitionOperation.h | 2 +- .../SDLSoftButtonTransitionOperation.m | 17 +- .../DevAPISpecs/SDLSoftButtonManagerSpec.m | 199 +----------------- .../SDLSoftButtonTransitionOperationSpec.m | 63 ++++++ .../SDLSoftButtonReplaceOperationSpec.m | 6 + 7 files changed, 112 insertions(+), 201 deletions(-) create mode 100644 SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m create mode 100644 SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 252651f01..7b954d90b 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1092,6 +1092,8 @@ 5DA150C82271FDC20032928D /* SDLSoftButtonTransitionOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA150C62271FDC20032928D /* SDLSoftButtonTransitionOperation.m */; }; 5DA150CD2271FE180032928D /* SDLSoftButtonReplaceOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DA150CB2271FE180032928D /* SDLSoftButtonReplaceOperation.h */; }; 5DA150CE2271FE180032928D /* SDLSoftButtonReplaceOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA150CC2271FE180032928D /* SDLSoftButtonReplaceOperation.m */; }; + 5DA150D1227367580032928D /* SDLSoftButtonTransitionOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA150D0227367580032928D /* SDLSoftButtonTransitionOperationSpec.m */; }; + 5DA150D32273676A0032928D /* SDLSoftButtonReplaceOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DA150D22273676A0032928D /* SDLSoftButtonReplaceOperationSpec.m */; }; 5DA22CB71D075CF200245F5F /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB31D075CF200245F5F /* Nimble.framework */; }; 5DA22CB81D075CF200245F5F /* OCMock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB41D075CF200245F5F /* OCMock.framework */; }; 5DA22CBA1D075CF200245F5F /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DA22CB61D075CF200245F5F /* Quick.framework */; }; @@ -2725,6 +2727,8 @@ 5DA150C62271FDC20032928D /* SDLSoftButtonTransitionOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSoftButtonTransitionOperation.m; sourceTree = ""; }; 5DA150CB2271FE180032928D /* SDLSoftButtonReplaceOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSoftButtonReplaceOperation.h; sourceTree = ""; }; 5DA150CC2271FE180032928D /* SDLSoftButtonReplaceOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSoftButtonReplaceOperation.m; sourceTree = ""; }; + 5DA150D0227367580032928D /* SDLSoftButtonTransitionOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLSoftButtonTransitionOperationSpec.m; path = DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m; sourceTree = ""; }; + 5DA150D22273676A0032928D /* SDLSoftButtonReplaceOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSoftButtonReplaceOperationSpec.m; sourceTree = ""; }; 5DA22CB31D075CF200245F5F /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = sdl_ios/Carthage/Build/iOS/Nimble.framework; sourceTree = ""; }; 5DA22CB41D075CF200245F5F /* OCMock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OCMock.framework; path = sdl_ios/Carthage/Build/iOS/OCMock.framework; sourceTree = ""; }; 5DA22CB61D075CF200245F5F /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = sdl_ios/Carthage/Build/iOS/Quick.framework; sourceTree = ""; }; @@ -5242,6 +5246,15 @@ name = Buttons; sourceTree = ""; }; + 5DA150CF227366900032928D /* Operations */ = { + isa = PBXGroup; + children = ( + 5DA150D0227367580032928D /* SDLSoftButtonTransitionOperationSpec.m */, + 5DA150D22273676A0032928D /* SDLSoftButtonReplaceOperationSpec.m */, + ); + name = Operations; + sourceTree = ""; + }; 5DA23FF11F2FA32A009C0313 /* Audio Service */ = { isa = PBXGroup; children = ( @@ -5405,6 +5418,7 @@ 5DAD5F8220507DED0025624C /* Soft Button */ = { isa = PBXGroup; children = ( + 5DA150CF227366900032928D /* Operations */, 5DAD5F8820508F090025624C /* SDLSoftButtonStateSpec.m */, 5DAD5F8A20508F140025624C /* SDLSoftButtonObjectSpec.m */, 5DAD5F8C20508F220025624C /* SDLSoftButtonManagerSpec.m */, @@ -7488,6 +7502,7 @@ 162E83171A9BDE8B00906325 /* SDLOnHMIStatusSpec.m in Sources */, 8831FA392201E3D100B8FFB7 /* SDLAppServiceManifestSpec.m in Sources */, 5DE372A41ACB336600849FAA /* SDLHMICapabilitiesSpec.m in Sources */, + 5DA150D32273676A0032928D /* SDLSoftButtonReplaceOperationSpec.m in Sources */, 162E82F71A9BDE8B00906325 /* SDLResultSpec.m in Sources */, 1680B1141A9CD7AD00DBD79E /* SDLV1ProtocolHeaderSpec.m in Sources */, 880D2680220E038800B3F496 /* SDLWeatherServiceManifestSpec.m in Sources */, @@ -7708,6 +7723,7 @@ 5D0A9F931F15560B00CC80DD /* SDLNavigationCapabilitySpec.m in Sources */, 5D64FE7120DA9E6700792F9F /* SDLStreamingAudioLifecycleManagerSpec.m in Sources */, 162E83891A9BDE8B00906325 /* SDLScreenParamsSpec.m in Sources */, + 5DA150D1227367580032928D /* SDLSoftButtonTransitionOperationSpec.m in Sources */, 162E83441A9BDE8B00906325 /* SDLSystemRequestSpec.m in Sources */, 162E83001A9BDE8B00906325 /* SDLTextFieldNameSpec.m in Sources */, DA4353EA1D2721680099B8C4 /* SDLTouchManagerSpec.m in Sources */, diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m index 826c363dd..3b00ba985 100644 --- a/SmartDeviceLink/SDLSoftButtonManager.m +++ b/SmartDeviceLink/SDLSoftButtonManager.m @@ -123,7 +123,7 @@ - (void)setSoftButtonObjects:(NSArray *)softButtonObjects } - (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton { - SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.softButtonCapabilities softButtons:[self sdl_softButtonsForCurrentState] mainField1:self.currentMainField1]; + SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.softButtonCapabilities softButtons:self.softButtonObjects mainField1:self.currentMainField1]; [self.transactionQueue addOperation:op]; } @@ -140,14 +140,6 @@ - (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name { return nil; } -- (NSArray *)sdl_softButtonsForCurrentState { - NSMutableArray *softButtons = [NSMutableArray arrayWithCapacity:self.softButtonObjects.count]; - for (SDLSoftButtonObject *button in self.softButtonObjects) { - [softButtons addObject:button.currentStateSoftButton]; - } - - return [softButtons copy]; -} #pragma mark - Getters / Setters diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h index f167028b4..79ca1f9e6 100644 --- a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic) NSString *mainField1; -- (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1; +- (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1; @end diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.m b/SmartDeviceLink/SDLSoftButtonTransitionOperation.m index f2f5c97e5..862df6c5e 100644 --- a/SmartDeviceLink/SDLSoftButtonTransitionOperation.m +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.m @@ -9,17 +9,19 @@ #import "SDLSoftButtonTransitionOperation.h" #import "SDLConnectionManagerType.h" +#import "SDLFileManager.h" #import "SDLLogMacros.h" #import "SDLSoftButtonCapabilities.h" #import "SDLShow.h" #import "SDLSoftButton.h" +#import "SDLSoftButtonObject.h" NS_ASSUME_NONNULL_BEGIN @interface SDLSoftButtonTransitionOperation () @property (strong, nonatomic) SDLSoftButtonCapabilities *softButtonCapabilities; -@property (strong, nonatomic) NSArray *softButtons; +@property (strong, nonatomic) NSArray *softButtons; @property (weak, nonatomic) id connectionManager; @property (copy, nonatomic, nullable) NSError *internalError; @@ -28,7 +30,7 @@ @interface SDLSoftButtonTransitionOperation () @implementation SDLSoftButtonTransitionOperation -- (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1 { +- (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1 { self = [super init]; if (!self) { return nil; } @@ -49,7 +51,7 @@ - (void)start { - (void)sdl_sendNewSoftButtons { SDLShow *newShow = [[SDLShow alloc] init]; newShow.mainField1 = self.mainField1; - newShow.softButtons = self.softButtons; + newShow.softButtons = [self sdl_currentStateSoftButtonsForObjects:self.softButtons]; [self.connectionManager sendConnectionRequest:newShow withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { if (error != nil) { @@ -61,6 +63,15 @@ - (void)sdl_sendNewSoftButtons { }]; } +- (NSArray *)sdl_currentStateSoftButtonsForObjects:(NSArray *)objects { + NSMutableArray *softButtons = [NSMutableArray arrayWithCapacity:objects.count]; + for (SDLSoftButtonObject *button in objects) { + [softButtons addObject:button.currentStateSoftButton]; + } + + return [softButtons copy]; +} + #pragma mark - Property Overrides - (nullable NSString *)name { diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m index 094da3fc8..82832578c 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m @@ -29,23 +29,17 @@ @interface SDLSoftButtonManager() @property (weak, nonatomic) id connectionManager; @property (weak, nonatomic) SDLFileManager *fileManager; -@property (strong, nonatomic, nullable) SDLShow *inProgressUpdate; -@property (copy, nonatomic, nullable) SDLSoftButtonUpdateCompletionHandler inProgressHandler; - -@property (assign, nonatomic) BOOL hasQueuedUpdate; -@property (copy, nonatomic, nullable) SDLSoftButtonUpdateCompletionHandler queuedUpdateHandler; +@property (strong, nonatomic) NSOperationQueue *transactionQueue; @property (copy, nonatomic, nullable) SDLHMILevel currentLevel; @property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities; @property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities; -@property (assign, nonatomic) BOOL waitingOnHMILevelUpdateToUpdate; - @end QuickSpecBegin(SDLSoftButtonManagerSpec) -describe(@"a soft button manager", ^{ +fdescribe(@"a soft button manager", ^{ __block SDLSoftButtonManager *testManager = nil; __block SDLFileManager *testFileManager = nil; @@ -69,10 +63,6 @@ @interface SDLSoftButtonManager() __block NSString *object2State1ArtworkName = @"O2S1 Artwork"; __block SDLArtwork *object2State1Art = [[SDLArtwork alloc] initWithData:[@"TestData" dataUsingEncoding:NSUTF8StringEncoding] name:object2State1ArtworkName fileExtension:@"png" persistent:YES]; __block SDLSoftButtonState *object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State1Art]; - __block SDLSoftButtonState *object2State2 = [[SDLSoftButtonState alloc] initWithStateName:object2State2Name text:object2State2Text image:nil]; - - __block SDLArtwork *staticIconArt = [SDLArtwork artworkWithStaticIcon:SDLStaticIconNameDate]; - __block SDLSoftButtonState *staticIconState = [[SDLSoftButtonState alloc] initWithStateName:@"Static State" text:nil artwork:staticIconArt]; beforeEach(^{ testFileManager = OCMClassMock([SDLFileManager class]); @@ -90,11 +80,9 @@ @interface SDLSoftButtonManager() expect(testManager.softButtonObjects).to(beEmpty()); expect(testManager.currentMainField1).to(beNil()); - expect(testManager.inProgressUpdate).to(beNil()); - expect(testManager.hasQueuedUpdate).to(beFalse()); expect(testManager.displayCapabilities).to(beNil()); expect(testManager.softButtonCapabilities).to(beNil()); - expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beFalse()); + expect(testManager.transactionQueue).toNot(beNil()); }); context(@"when in HMI NONE", ^{ @@ -109,8 +97,7 @@ @interface SDLSoftButtonManager() it(@"should set the soft buttons, but not update", ^{ expect(testManager.softButtonObjects).toNot(beEmpty()); - expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beTrue()); - expect(testManager.inProgressUpdate).to(beNil()); + expect(testManager.transactionQueue.suspended).to(beTrue()); }); }); @@ -126,8 +113,7 @@ @interface SDLSoftButtonManager() it(@"should set the soft buttons, but not update", ^{ expect(testManager.softButtonObjects).toNot(beEmpty()); - expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beTrue()); - expect(testManager.inProgressUpdate).to(beNil()); + expect(testManager.transactionQueue.suspended).to(beTrue()); }); }); @@ -159,6 +145,8 @@ @interface SDLSoftButtonManager() expect(testObject2.buttonId).to(equal(100)); expect(testObject1.manager).to(equal(testManager)); expect(testObject2.manager).to(equal(testManager)); + + expect(testManager.transactionQueue.operationCount).to(equal(1)); }); it(@"should retrieve soft buttons correctly", ^{ @@ -168,178 +156,19 @@ @interface SDLSoftButtonManager() context(@"when the HMI level is now NONE", ^{ beforeEach(^{ testManager.currentLevel = SDLHMILevelNone; - testManager.inProgressUpdate = nil; }); it(@"should not transition buttons", ^{ [testObject1 transitionToNextState]; - expect(testManager.inProgressUpdate).to(beNil()); - }); - }); - }); - - describe(@"uploading soft buttons to a head unit that supports images", ^{ - beforeEach(^{ - SDLSoftButtonCapabilities *softButtonImagesSupported = [[SDLSoftButtonCapabilities alloc] init]; - softButtonImagesSupported.imageSupported = @YES; - testManager.softButtonCapabilities = softButtonImagesSupported; - }); - - context(@"when button artworks are static icons", ^{ - beforeEach(^{ - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name state:staticIconState handler:nil]; - testManager.softButtonObjects = @[testObject1]; - }); - - it(@"should not have attempted to upload any artworks", ^{ - OCMReject([testFileManager uploadArtwork:[OCMArg any] completionHandler:[OCMArg any]]); - }); - }); - - context(@"when button artworks are already on the file system", ^{ - beforeEach(^{ - OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES); - - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil]; - testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:nil]; - - testManager.softButtonObjects = @[testObject1, testObject2]; - }); - - it(@"should not have attempted to upload any artworks", ^{ - OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); - }); - - it(@"should set the in progress update", ^{ - NSArray *inProgressSoftButtons = testManager.inProgressUpdate.softButtons; - - expect(testManager.hasQueuedUpdate).to(beFalse()); - expect(testManager.inProgressUpdate.mainField1).to(equal(@"")); - expect(inProgressSoftButtons).to(haveCount(2)); - expect(inProgressSoftButtons[0].text).to(equal(object1State1Text)); - expect(inProgressSoftButtons[1].text).to(equal(object2State1Text)); - expect(inProgressSoftButtons[0].image).to(beNil()); - expect(inProgressSoftButtons[1].image.value).to(equal(object2State1ArtworkName)); - }); - }); - - context(@"when button artworks are not already on the file system, before upload finishes", ^{ - beforeEach(^{ - OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO); - - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil]; - testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:nil]; - - testManager.softButtonObjects = @[testObject1, testObject2]; - }); - - it(@"should attempt to upload an artwork", ^{ - OCMVerify([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); - }); - - it(@"should set the in progress update for text only buttons", ^{ - NSArray *inProgressSoftButtons = testManager.inProgressUpdate.softButtons; - - expect(testManager.hasQueuedUpdate).to(beFalse()); - expect(testManager.inProgressUpdate.mainField1).to(equal(@"")); - expect(inProgressSoftButtons).to(haveCount(2)); - expect(inProgressSoftButtons[0].text).to(equal(object1State1Text)); - expect(inProgressSoftButtons[1].text).to(equal(object2State1Text)); - expect(inProgressSoftButtons[0].image).to(beNil()); - expect(inProgressSoftButtons[1].image).to(beNil()); - }); - }); - - context(@"when button artworks are not already on the file system, after upload finishes", ^{ - beforeEach(^{ - OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO); - OCMStub([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]); - - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil]; - testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:nil]; - - testManager.softButtonObjects = @[testObject1, testObject2]; - }); - - it(@"should attempt to upload an artwork", ^{ - OCMVerify([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); - }); - - it(@"should set the in progress update for text only buttons and have a queued update", ^{ - NSArray *inProgressSoftButtons = testManager.inProgressUpdate.softButtons; - - expect(testManager.hasQueuedUpdate).to(beTrue()); - expect(testManager.inProgressUpdate.mainField1).to(equal(@"")); - expect(inProgressSoftButtons).to(haveCount(2)); - expect(inProgressSoftButtons[0].text).to(equal(object1State1Text)); - expect(inProgressSoftButtons[1].text).to(equal(object2State1Text)); - expect(inProgressSoftButtons[0].image).to(beNil()); - expect(inProgressSoftButtons[1].image).to(beNil()); - }); - }); - }); - - describe(@"uploading soft buttons to a head unit that does not support images", ^{ - beforeEach(^{ - SDLSoftButtonCapabilities *softButtonImagesSupported = [[SDLSoftButtonCapabilities alloc] init]; - softButtonImagesSupported.imageSupported = @NO; - testManager.softButtonCapabilities = softButtonImagesSupported; - }); - - context(@"when the button contains images", ^{ - beforeEach(^{ - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil]; - testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State2 handler:nil]; - testManager.softButtonObjects = @[testObject1, testObject2]; - }); - - it(@"should not have attempted to upload any artworks", ^{ - OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); - }); - - it(@"should set the in progress update to be text buttons", ^{ - NSArray *inProgressSoftButtons = testManager.inProgressUpdate.softButtons; - - expect(testManager.hasQueuedUpdate).to(beFalse()); - expect(testManager.inProgressUpdate.mainField1).to(equal(@"")); - expect(inProgressSoftButtons).to(haveCount(2)); - expect(inProgressSoftButtons[0].text).to(equal(object1State1Text)); - expect(inProgressSoftButtons[1].text).to(equal(object2State2Text)); - expect(inProgressSoftButtons[0].image).to(beNil()); - expect(inProgressSoftButtons[1].image.value).to(beNil()); - }); - }); - - context(@"when the button does not contain images", ^{ - beforeEach(^{ - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil]; - testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State2 handler:nil]; - testManager.softButtonObjects = @[testObject1, testObject2]; - }); - - it(@"should not have attempted to upload any artworks", ^{ - OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); - }); - - it(@"should set the in progress update to be text buttons", ^{ - NSArray *inProgressSoftButtons = testManager.inProgressUpdate.softButtons; - - expect(testManager.hasQueuedUpdate).to(beFalse()); - expect(testManager.inProgressUpdate.mainField1).to(equal(@"")); - expect(inProgressSoftButtons).to(haveCount(2)); - expect(inProgressSoftButtons[0].text).to(equal(object1State1Text)); - expect(inProgressSoftButtons[1].text).to(equal(object2State2Text)); - expect(inProgressSoftButtons[0].image).to(beNil()); - expect(inProgressSoftButtons[1].image.value).to(beNil()); + expect(testManager.transactionQueue.suspended).to(beTrue()); + expect(testManager.transactionQueue.operationCount).to(equal(2)); // Replace and transition }); }); }); describe(@"transitioning soft button states", ^{ beforeEach(^{ - OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES); - testObject1 = [[SDLSoftButtonObject alloc] initWithName:object1Name states:@[object1State1, object1State2] initialStateName:object1State1Name handler:nil]; testObject2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:nil]; @@ -347,13 +176,9 @@ @interface SDLSoftButtonManager() }); it(@"should queue an update", ^{ - testManager.inProgressUpdate = nil; // Reset due to setting the soft button objects [testObject1 transitionToStateNamed:object1State2Name]; - expect(testManager.inProgressUpdate).toNot(beNil()); - expect(testManager.inProgressUpdate.mainField1).to(beEmpty()); - expect(testManager.inProgressUpdate.softButtons[0].text).to(equal(object1State2Text)); - expect(testManager.inProgressUpdate.softButtons[1].text).to(equal(object2State1Text)); + expect(testManager.transactionQueue.operationCount).to(equal(2)); // Replace and transition }); }); @@ -368,12 +193,10 @@ @interface SDLSoftButtonManager() expect(testManager.softButtonObjects).to(beEmpty()); expect(testManager.currentMainField1).to(beNil()); - expect(testManager.inProgressUpdate).to(beNil()); - expect(testManager.hasQueuedUpdate).to(beFalse()); + expect(testManager.transactionQueue.operationCount).to(equal(0)); expect(testManager.currentLevel).to(beNil()); expect(testManager.displayCapabilities).to(beNil()); expect(testManager.softButtonCapabilities).to(beNil()); - expect(testManager.waitingOnHMILevelUpdateToUpdate).to(beFalse()); }); }); }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m new file mode 100644 index 000000000..3438e4678 --- /dev/null +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m @@ -0,0 +1,63 @@ +#import +#import +#import + +#import "SDLSoftButtonTransitionOperation.h" + +#import "SDLConnectionManagerType.h" +#import "SDLFileManager.h" +#import "SDLLogMacros.h" +#import "SDLSoftButtonCapabilities.h" +#import "SDLShow.h" +#import "SDLSoftButton.h" +#import "SDLSoftButtonObject.h" +#import "SDLSoftButtonState.h" +#import "TestConnectionManager.h" + +QuickSpecBegin(SDLSoftButtonTransitionOperationSpec) + +describe(@"a soft button transition operation", ^{ + __block SDLSoftButtonTransitionOperation *testOp = nil; + + __block TestConnectionManager *testConnectionManager = nil; + __block SDLFileManager *testFileManager = nil; + + __block BOOL hasCalledOperationCompletionHandler = NO; + __block NSError *resultError = nil; + + __block NSArray *testSoftButtonObjects = nil; + __block NSString *testMainField1 = @"Test 1"; + + beforeEach(^{ + resultError = nil; + hasCalledOperationCompletionHandler = NO; + + testConnectionManager = [[TestConnectionManager alloc] init]; + testFileManager = OCMClassMock([SDLFileManager class]); + + SDLSoftButtonState *object1State1 = [[SDLSoftButtonState alloc] initWithStateName:@"State 1" text:@"Test Text 1" artwork:nil]; + SDLSoftButtonObject *button1 = [[SDLSoftButtonObject alloc] initWithName:@"Button 1" state:object1State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; + + SDLSoftButtonState *object2State1 = [[SDLSoftButtonState alloc] initWithStateName:@"State 2" text:@"Test text 2" image:nil]; + SDLSoftButtonObject *button2 = [[SDLSoftButtonObject alloc] initWithName:@"Button 2" state:object2State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; + + testSoftButtonObjects = @[button1, button2]; + }); + + it(@"should have a priority of 'normal'", ^{ + testOp = [[SDLSoftButtonTransitionOperation alloc] init]; + + expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal))); + }); + + describe(@"running the operation", ^{ + beforeEach(^{ + SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init]; + capabilities.imageSupported = @YES; + + testOp = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:testConnectionManager capabilities:capabilities softButtons:testSoftButtonObjects mainField1:testMainField1]; + }); + }); +}); + +QuickSpecEnd diff --git a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m new file mode 100644 index 000000000..2efbcccf7 --- /dev/null +++ b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m @@ -0,0 +1,6 @@ +#import +#import + +QuickSpecBegin(SDLSoftButtonReplaceOperationSpec) + +QuickSpecEnd From 1b4eaef72dd9f5372d75e0917911f4ff7d1a4b95 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 3 May 2019 10:16:32 -0400 Subject: [PATCH 022/179] More test updates --- .../SDLSoftButtonTransitionOperation.h | 2 +- .../DevAPISpecs/SDLSoftButtonManagerSpec.m | 11 +- .../SDLSoftButtonTransitionOperationSpec.m | 52 +++- .../SDLSoftButtonReplaceOperationSpec.m | 243 ++++++++++++++++++ 4 files changed, 301 insertions(+), 7 deletions(-) diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h index 79ca1f9e6..ca5a84bee 100644 --- a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h @@ -11,7 +11,7 @@ #import "SDLAsynchronousOperation.h" @class SDLSoftButtonCapabilities; -@class SDLSoftButton; +@class SDLSoftButtonObject; @protocol SDLConnectionManagerType; diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m index 82832578c..2a312c7ac 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m @@ -57,9 +57,7 @@ @interface SDLSoftButtonManager() __block SDLSoftButtonObject *testObject2 = nil; __block NSString *object2Name = @"O2 Name"; __block NSString *object2State1Name = @"O2S1 Name"; - __block NSString *object2State2Name = @"O2S2 Name"; __block NSString *object2State1Text = @"O2S1 Text"; - __block NSString *object2State2Text = @"O2S2 Text"; __block NSString *object2State1ArtworkName = @"O2S1 Artwork"; __block SDLArtwork *object2State1Art = [[SDLArtwork alloc] initWithData:[@"TestData" dataUsingEncoding:NSUTF8StringEncoding] name:object2State1ArtworkName fileExtension:@"png" persistent:YES]; __block SDLSoftButtonState *object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State1Art]; @@ -149,6 +147,15 @@ @interface SDLSoftButtonManager() expect(testManager.transactionQueue.operationCount).to(equal(1)); }); + it(@"should replace earlier operations when a replace operation is entered", ^{ + [testObject1 transitionToNextState]; + testManager.softButtonObjects = @[testObject1]; + expect(testManager.transactionQueue.operationCount).to(equal(3)); + expect(testManager.transactionQueue.operations[0].isCancelled).to(beTrue()); + expect(testManager.transactionQueue.operations[1].isCancelled).to(beTrue()); + expect(testManager.transactionQueue.operations[2].isCancelled).to(beFalse()); + }); + it(@"should retrieve soft buttons correctly", ^{ expect([testManager softButtonObjectNamed:object1Name].name).to(equal(object1Name)); }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m index 3438e4678..7f18dd5a4 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonTransitionOperationSpec.m @@ -9,6 +9,7 @@ #import "SDLLogMacros.h" #import "SDLSoftButtonCapabilities.h" #import "SDLShow.h" +#import "SDLShowResponse.h" #import "SDLSoftButton.h" #import "SDLSoftButtonObject.h" #import "SDLSoftButtonState.h" @@ -20,12 +21,13 @@ __block SDLSoftButtonTransitionOperation *testOp = nil; __block TestConnectionManager *testConnectionManager = nil; - __block SDLFileManager *testFileManager = nil; __block BOOL hasCalledOperationCompletionHandler = NO; __block NSError *resultError = nil; __block NSArray *testSoftButtonObjects = nil; + __block NSString *button1Text = @"Text text 1"; + __block NSString *button2Text = @"Text text 2"; __block NSString *testMainField1 = @"Test 1"; beforeEach(^{ @@ -33,12 +35,11 @@ hasCalledOperationCompletionHandler = NO; testConnectionManager = [[TestConnectionManager alloc] init]; - testFileManager = OCMClassMock([SDLFileManager class]); - SDLSoftButtonState *object1State1 = [[SDLSoftButtonState alloc] initWithStateName:@"State 1" text:@"Test Text 1" artwork:nil]; + SDLSoftButtonState *object1State1 = [[SDLSoftButtonState alloc] initWithStateName:@"State 1" text:button1Text artwork:nil]; SDLSoftButtonObject *button1 = [[SDLSoftButtonObject alloc] initWithName:@"Button 1" state:object1State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; - SDLSoftButtonState *object2State1 = [[SDLSoftButtonState alloc] initWithStateName:@"State 2" text:@"Test text 2" image:nil]; + SDLSoftButtonState *object2State1 = [[SDLSoftButtonState alloc] initWithStateName:@"State 2" text:button2Text image:nil]; SDLSoftButtonObject *button2 = [[SDLSoftButtonObject alloc] initWithName:@"Button 2" state:object2State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; testSoftButtonObjects = @[button1, button2]; @@ -56,6 +57,49 @@ capabilities.imageSupported = @YES; testOp = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:testConnectionManager capabilities:capabilities softButtons:testSoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should send the correct RPCs", ^{ + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(1)); + expect(sentRequests.firstObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.firstObject.mainField2).to(beNil()); + expect(sentRequests.firstObject.softButtons).to(haveCount(2)); + expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(button1Text)); + expect(sentRequests.firstObject.softButtons.firstObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText)); + expect(sentRequests.firstObject.softButtons.lastObject.text).to(equal(button2Text)); + expect(sentRequests.firstObject.softButtons.lastObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeText)); + }); + + context(@"if it returns correctly", ^{ + beforeEach(^{ + SDLShowResponse *response = [[SDLShowResponse alloc] init]; + response.success = @YES; + + [testConnectionManager respondToLastRequestWithResponse:response]; + }); + + it(@"should finish the operation", ^{ + expect(testOp.isFinished).to(beTrue()); + expect(testOp.error).to(beNil()); + }); + }); + + context(@"if it returns an error", ^{ + beforeEach(^{ + SDLShowResponse *response = [[SDLShowResponse alloc] init]; + response.success = @NO; + + [testConnectionManager respondToLastRequestWithResponse:response]; + }); + + it(@"should finish the operation", ^{ + expect(testOp.isFinished).to(beTrue()); + expect(testOp.error).toNot(beNil()); + }); }); }); }); diff --git a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m index 2efbcccf7..2c8de460f 100644 --- a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m +++ b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m @@ -1,6 +1,249 @@ #import #import +#import + +#import "SDLSoftButtonReplaceOperation.h" + +#import "SDLArtwork.h" +#import "SDLConnectionManagerType.h" +#import "SDLDisplayCapabilities+ShowManagerExtensions.h" +#import "SDLFileManager.h" +#import "SDLLogMacros.h" +#import "SDLShow.h" +#import "SDLSoftButton.h" +#import "SDLSoftButtonCapabilities.h" +#import "SDLSoftButtonObject.h" +#import "SDLSoftButtonState.h" +#import "TestConnectionManager.h" QuickSpecBegin(SDLSoftButtonReplaceOperationSpec) +describe(@"a soft button replace operation", ^{ + __block SDLSoftButtonReplaceOperation *testOp = nil; + + __block TestConnectionManager *testConnectionManager = nil; + __block SDLFileManager *testFileManager = nil; + + __block BOOL hasCalledOperationCompletionHandler = NO; + __block NSError *resultError = nil; + + __block NSString *object1Name = @"O1 Name"; + __block NSString *object1State1Name = @"O1S1 Name"; + __block NSString *object1State2Name = @"O1S2 Name"; + __block NSString *object1State1Text = @"O1S1 Text"; + __block NSString *object1State2Text = @"O1S2 Text"; + __block SDLSoftButtonState *object1State1 = nil; + __block SDLSoftButtonState *object1State2 = nil; + __block SDLSoftButtonObject *button1 = nil; + + __block NSString *object2Name = @"O2 Name"; + __block NSString *object2State1Name = @"O2S1 Name"; + __block NSString *object2State1Text = @"O2S1 Text"; + __block NSString *object2State1ArtworkName = @"O2S1 Artwork"; + __block SDLArtwork *object2State1Art = nil; + __block SDLSoftButtonState *object2State1 = nil; + __block SDLSoftButtonObject *button2 = nil; + + __block NSString *object3Name = @"O3 Name"; + __block NSString *object3State1Name = @"O3S1 Name"; + __block NSString *object3State1Text = @"O3S1 Text"; + __block NSString *object3State1IconName = SDLStaticIconNameRSS; + __block SDLArtwork *object3State1Art = nil; + __block SDLSoftButtonState *object3State1 = nil; + __block SDLSoftButtonObject *button3 = nil; + + __block NSString *testMainField1 = @"Test main field 1"; + + beforeEach(^{ + resultError = nil; + hasCalledOperationCompletionHandler = NO; + + testConnectionManager = [[TestConnectionManager alloc] init]; + testFileManager = OCMClassMock([SDLFileManager class]); + + object1State1 = [[SDLSoftButtonState alloc] initWithStateName:object1State1Name text:object1State1Text artwork:nil]; + object1State2 = [[SDLSoftButtonState alloc] initWithStateName:object1State2Name text:object1State2Text artwork:nil]; + button1 = [[SDLSoftButtonObject alloc] initWithName:object1Name state:object1State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; + + object2State1Art = [[SDLArtwork alloc] initWithData:[@"TestData" dataUsingEncoding:NSUTF8StringEncoding] name:object2State1ArtworkName fileExtension:@"png" persistent:YES]; + object2State1 = [[SDLSoftButtonState alloc] initWithStateName:object2State1Name text:object2State1Text artwork:object2State1Art]; + button2 = [[SDLSoftButtonObject alloc] initWithName:object2Name state:object2State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; + + object3State1Art = [[SDLArtwork alloc] initWithStaticIcon:object3State1IconName]; + object3State1 = [[SDLSoftButtonState alloc] initWithStateName:object3State1Name text:object3State1Text artwork:object3State1Art]; + button3 = [[SDLSoftButtonObject alloc] initWithName:object3Name state:object3State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; + + OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]); + }); + + it(@"should have a priority of 'normal'", ^{ + testOp = [[SDLSoftButtonReplaceOperation alloc] init]; + + expect(@(testOp.queuePriority)).to(equal(@(NSOperationQueuePriorityNormal))); + }); + + describe(@"running the operation", ^{ + context(@"without artworks", ^{ + beforeEach(^{ + SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init]; + capabilities.imageSupported = @YES; + + NSArray *testSoftButtonObjects = @[button1]; + + testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should send the correct RPCs", ^{ + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(1)); + expect(sentRequests.firstObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.firstObject.mainField2).to(beNil()); + expect(sentRequests.firstObject.softButtons).to(haveCount(1)); + expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(object1State1Text)); + expect(sentRequests.firstObject.softButtons.firstObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText)); + }); + }); + + context(@"with artworks", ^{ + __block NSArray *testSoftButtonObjects = nil; + + beforeEach(^{ + testSoftButtonObjects = @[button1, button2]; + }); + + context(@"but we don't support artworks", ^{ + beforeEach(^{ + SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init]; + capabilities.imageSupported = @NO; + + testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should not send artworks", ^{ + OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); + + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(1)); + expect(sentRequests.firstObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.firstObject.mainField2).to(beNil()); + expect(sentRequests.firstObject.softButtons).to(haveCount(2)); + expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(object1State1Text)); + expect(sentRequests.firstObject.softButtons.firstObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText)); + expect(sentRequests.firstObject.softButtons.lastObject.text).to(equal(object2State1Text)); + expect(sentRequests.firstObject.softButtons.lastObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeText)); + }); + }); + + context(@"and we support artworks", ^{ + __block SDLSoftButtonCapabilities *buttonCapabilities = nil; + + beforeEach(^{ + buttonCapabilities = [[SDLSoftButtonCapabilities alloc] init]; + buttonCapabilities.imageSupported = @YES; + }); + + context(@"when artworks are already on the system", ^{ + beforeEach(^{ + OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES); + + testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:buttonCapabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should not upload artworks", ^{ + OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); + + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(1)); + expect(sentRequests.firstObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.firstObject.mainField2).to(beNil()); + expect(sentRequests.firstObject.softButtons).to(haveCount(2)); + expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(object1State1Text)); + expect(sentRequests.firstObject.softButtons.firstObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText)); + expect(sentRequests.firstObject.softButtons.lastObject.text).to(equal(object2State1Text)); + expect(sentRequests.firstObject.softButtons.lastObject.image).toNot(beNil()); + expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeBoth)); + }); + }); + + context(@"when the artworks need uploading", ^{ + __block SDLSoftButtonCapabilities *buttonCapabilities = nil; + + beforeEach(^{ + buttonCapabilities = [[SDLSoftButtonCapabilities alloc] init]; + buttonCapabilities.imageSupported = @YES; + }); + + context(@"when artworks are static icons", ^{ + beforeEach(^{ + testSoftButtonObjects = @[button3]; + + testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:buttonCapabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should skip uploading artwork", ^{ + OCMReject([testFileManager uploadArtwork:[OCMArg any] completionHandler:[OCMArg any]]); + + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(1)); + expect(sentRequests.firstObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.firstObject.mainField2).to(beNil()); + expect(sentRequests.firstObject.softButtons).to(haveCount(1)); + expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(object3State1Text)); + expect(sentRequests.firstObject.softButtons.firstObject.image).toNot(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeBoth)); + }); + }); + + context(@"when artwork are not already on the system", ^{ + beforeEach(^{ + OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO); + + testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:buttonCapabilities softButtonObjects:testSoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should upload artworks", ^{ + OCMVerify([testFileManager uploadArtworks:[OCMArg checkWithBlock:^BOOL(id obj) { + NSArray *artworks = (NSArray *)obj; + return (artworks.count == 1); + }] progressHandler:[OCMArg any] completionHandler:[OCMArg any]]); + + // Both the text only buttons and the image buttons should be sent + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(2)); + expect(sentRequests.firstObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.firstObject.mainField2).to(beNil()); + expect(sentRequests.firstObject.softButtons).to(haveCount(2)); + expect(sentRequests.firstObject.softButtons.firstObject.text).to(equal(object1State1Text)); + expect(sentRequests.firstObject.softButtons.firstObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText)); + expect(sentRequests.firstObject.softButtons.lastObject.text).to(equal(object2State1Text)); + expect(sentRequests.firstObject.softButtons.lastObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeText)); + + expect(sentRequests.lastObject.mainField1).to(equal(testMainField1)); + expect(sentRequests.lastObject.mainField2).to(beNil()); + expect(sentRequests.lastObject.softButtons).to(haveCount(2)); + expect(sentRequests.lastObject.softButtons.firstObject.text).to(equal(object1State1Text)); + expect(sentRequests.lastObject.softButtons.firstObject.image).to(beNil()); + expect(sentRequests.firstObject.softButtons.firstObject.type).to(equal(SDLSoftButtonTypeText)); + expect(sentRequests.lastObject.softButtons.lastObject.text).to(equal(object2State1Text)); + expect(sentRequests.lastObject.softButtons.lastObject.image).toNot(beNil()); + expect(sentRequests.lastObject.softButtons.lastObject.type).to(equal(SDLSoftButtonTypeBoth)); + }); + }); + }); + }); + }); + }); +}); + QuickSpecEnd From cd44a87f9d50d8c0cb2f0510cc94a290c363f454 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 3 May 2019 10:25:50 -0400 Subject: [PATCH 023/179] Fis broken tests --- SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m | 2 +- SmartDeviceLinkTests/SDLScreenManagerSpec.m | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m index 2a312c7ac..772c8cbcd 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m @@ -39,7 +39,7 @@ @interface SDLSoftButtonManager() QuickSpecBegin(SDLSoftButtonManagerSpec) -fdescribe(@"a soft button manager", ^{ +describe(@"a soft button manager", ^{ __block SDLSoftButtonManager *testManager = nil; __block SDLFileManager *testFileManager = nil; diff --git a/SmartDeviceLinkTests/SDLScreenManagerSpec.m b/SmartDeviceLinkTests/SDLScreenManagerSpec.m index 481295539..5bb3943c5 100644 --- a/SmartDeviceLinkTests/SDLScreenManagerSpec.m +++ b/SmartDeviceLinkTests/SDLScreenManagerSpec.m @@ -17,7 +17,7 @@ @interface SDLSoftButtonManager() @property (weak, nonatomic) id connectionManager; @property (weak, nonatomic) SDLFileManager *fileManager; -@property (strong, nonatomic, nullable) SDLShow *inProgressUpdate; +@property (strong, nonatomic) NSOperationQueue *transactionQueue; @property (copy, nonatomic, nullable) SDLHMILevel currentLevel; @end @@ -100,7 +100,7 @@ @interface SDLScreenManager() it(@"should have in progress updates", ^{ expect(testScreenManager.textAndGraphicManager.inProgressUpdate).toNot(beNil()); - expect(testScreenManager.softButtonManager.inProgressUpdate).toNot(beNil()); + expect(testScreenManager.softButtonManager.transactionQueue.operationCount).to(equal(1)); expect(testScreenManager.textAndGraphicManager.batchUpdates).to(beFalse()); expect(testScreenManager.softButtonManager.batchUpdates).to(beFalse()); From b656990f7cfad3c0747895a6159f332901f1430f Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Fri, 3 May 2019 16:05:18 -0400 Subject: [PATCH 024/179] Create Package file --- Package.swift | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Package.swift diff --git a/Package.swift b/Package.swift new file mode 100644 index 000000000..3943eb5ee --- /dev/null +++ b/Package.swift @@ -0,0 +1,20 @@ +import PackageDescription + +let package = Package( + name: "SmartDeviceLink", + products: [ + .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]) + .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) + ], + targets: [ + .target( + name: "SmartDeviceLink", + path: "SmartDeviceLink" + ), + .target( + name: "SmartDeviceLinkSwift", + path: "SmartDeviceLinkSwift" + ), + ] +) + From 8629f52e431fba82e8114c65c51ed81b463b2386 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Fri, 3 May 2019 16:13:55 -0400 Subject: [PATCH 025/179] testing.. --- SmartDeviceLink/SmartDeviceLink.h | 1 + 1 file changed, 1 insertion(+) diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h index 4ae1a7d37..8a776230d 100644 --- a/SmartDeviceLink/SmartDeviceLink.h +++ b/SmartDeviceLink/SmartDeviceLink.h @@ -1,5 +1,6 @@ // SmartDeviceLink.h // +// #import From bedcdd01445b49c8ae48f486a661e0b280aade7a Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 6 May 2019 10:18:09 -0400 Subject: [PATCH 026/179] fixed issue with products array --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 3943eb5ee..3420f433a 100644 --- a/Package.swift +++ b/Package.swift @@ -3,8 +3,8 @@ import PackageDescription let package = Package( name: "SmartDeviceLink", products: [ - .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]) - .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) + .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]), + .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) ], targets: [ .target( From b80f03f7b44562b0ed48f92c8cd37ad0ea77aec9 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 6 May 2019 10:42:20 -0400 Subject: [PATCH 027/179] updating swift tools verison --- Package.swift | 1 + SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 3420f433a..d22264509 100644 --- a/Package.swift +++ b/Package.swift @@ -1,3 +1,4 @@ +// swift-tools-version:5.0 import PackageDescription let package = Package( diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 183bfcf37..18dac9be6 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -7913,7 +7913,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -7961,7 +7961,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.2; + SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; From a1f9fb7cb8d71e5cc5d3f75f1e2d7c8ae959f0b4 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 6 May 2019 11:40:52 -0400 Subject: [PATCH 028/179] testing a name change --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d22264509..dea1bf10c 100644 --- a/Package.swift +++ b/Package.swift @@ -2,7 +2,7 @@ import PackageDescription let package = Package( - name: "SmartDeviceLink", + name: "SmartDeviceLink-iOS", products: [ .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]), .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) From 5cf758fd9fc024904ea67e6c7f6c3c9039dad2f1 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 6 May 2019 11:50:15 -0400 Subject: [PATCH 029/179] no message --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index dea1bf10c..95a5fc7c0 100644 --- a/Package.swift +++ b/Package.swift @@ -13,8 +13,8 @@ let package = Package( path: "SmartDeviceLink" ), .target( - name: "SmartDeviceLinkSwift", - path: "SmartDeviceLinkSwift" + name: "SmartDeviceLixnkSwift", + path: "SmartDeviceLxinkSwift" ), ] ) From bb64813dbe9e031e4513e9765a824a62d102b9d4 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 6 May 2019 11:50:47 -0400 Subject: [PATCH 030/179] no message --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index 95a5fc7c0..dea1bf10c 100644 --- a/Package.swift +++ b/Package.swift @@ -13,8 +13,8 @@ let package = Package( path: "SmartDeviceLink" ), .target( - name: "SmartDeviceLixnkSwift", - path: "SmartDeviceLxinkSwift" + name: "SmartDeviceLinkSwift", + path: "SmartDeviceLinkSwift" ), ] ) From ee2980e427e4fcf98faddff9da63d62c5959dba0 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 6 May 2019 12:10:18 -0400 Subject: [PATCH 031/179] testing --- Package.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Package.swift b/Package.swift index dea1bf10c..2f69b79cb 100644 --- a/Package.swift +++ b/Package.swift @@ -4,18 +4,19 @@ import PackageDescription let package = Package( name: "SmartDeviceLink-iOS", products: [ - .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]), - .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) + .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]), + .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]) + ], targets: [ - .target( - name: "SmartDeviceLink", - path: "SmartDeviceLink" - ), .target( name: "SmartDeviceLinkSwift", path: "SmartDeviceLinkSwift" ), + .target( + name: "SmartDeviceLink", + path: "SmartDeviceLink" + ) ] ) From 7c523982107255319e1823150be2855bfddbd475 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 9 May 2019 10:25:26 -0400 Subject: [PATCH 032/179] adding SDLswift as a Dependency --- Package.swift | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Package.swift b/Package.swift index 2f69b79cb..4c4adbaf0 100644 --- a/Package.swift +++ b/Package.swift @@ -4,19 +4,20 @@ import PackageDescription let package = Package( name: "SmartDeviceLink-iOS", products: [ - .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]), - .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]) - + .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]), + .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) ], targets: [ + .target( + name: "SmartDeviceLink", + path: "SmartDeviceLink" + ), .target( name: "SmartDeviceLinkSwift", path: "SmartDeviceLinkSwift" + dependencies: [ + "SmartDeviceLink" + ] ), - .target( - name: "SmartDeviceLink", - path: "SmartDeviceLink" - ) ] ) - From 72a12d74d7421d312e70cc3cd57a55813e228066 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 9 May 2019 10:28:33 -0400 Subject: [PATCH 033/179] added comma --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 4c4adbaf0..f997f3cd2 100644 --- a/Package.swift +++ b/Package.swift @@ -14,7 +14,7 @@ let package = Package( ), .target( name: "SmartDeviceLinkSwift", - path: "SmartDeviceLinkSwift" + path: "SmartDeviceLinkSwift", dependencies: [ "SmartDeviceLink" ] From a85406f0722daa17bbbe164f5ec2abd561ba35db Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 9 May 2019 10:33:08 -0400 Subject: [PATCH 034/179] dependency must come before path --- Package.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Package.swift b/Package.swift index f997f3cd2..590aaee44 100644 --- a/Package.swift +++ b/Package.swift @@ -14,10 +14,10 @@ let package = Package( ), .target( name: "SmartDeviceLinkSwift", - path: "SmartDeviceLinkSwift", dependencies: [ "SmartDeviceLink" - ] + ], + path: "SmartDeviceLinkSwift" ), ] ) From 3815bfe90247deb58c8c91c9edab9678df80f3e4 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 13 May 2019 14:55:13 -0400 Subject: [PATCH 035/179] Added delegate for control session * fixed test cases --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 10 +- SmartDeviceLink/SDLIAPControlSession.h | 32 +++-- SmartDeviceLink/SDLIAPControlSession.m | 104 +++++++------- .../SDLIAPControlSessionDelegate.h | 23 +++ SmartDeviceLink/SDLIAPDataSessionDelegate.h | 22 +++ SmartDeviceLink/SDLIAPTransport.m | 55 ++++---- .../iAP/SDLIAPControlSessionSpec.m | 131 ++++++++++++------ .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 7 +- 8 files changed, 238 insertions(+), 146 deletions(-) create mode 100644 SmartDeviceLink/SDLIAPControlSessionDelegate.h create mode 100644 SmartDeviceLink/SDLIAPDataSessionDelegate.h diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 2889b01c7..d1d84f005 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1237,6 +1237,7 @@ 8816772922208B82001FACFF /* SDLNavigationInstructionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8816772822208B82001FACFF /* SDLNavigationInstructionSpec.m */; }; 8816772C222097C3001FACFF /* SDLNavigationServiceData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8816772A222097C3001FACFF /* SDLNavigationServiceData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8816772D222097C3001FACFF /* SDLNavigationServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 8816772B222097C3001FACFF /* SDLNavigationServiceData.m */; }; + 8817C2802289F4B900DB2DEC /* SDLIAPDataSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 8817C27F2289F41D00DB2DEC /* SDLIAPDataSessionDelegate.h */; }; 8818ADD82100FC18007D6F19 /* SDLTurnSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 8818ADD62100FC18007D6F19 /* SDLTurnSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8818ADD92100FC18007D6F19 /* SDLTurnSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 8818ADD72100FC18007D6F19 /* SDLTurnSignal.m */; }; 8818ADDD2100FE0C007D6F19 /* SDLTurnSignalSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */; }; @@ -1370,6 +1371,7 @@ 88D3EBCA2267949D00493C38 /* SDLIAPDataSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */; }; 88D5EB37220CD95000EC3782 /* SDLWeatherServiceData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D5EB35220CD95000EC3782 /* SDLWeatherServiceData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 88D5EB38220CD95000EC3782 /* SDLWeatherServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D5EB36220CD95000EC3782 /* SDLWeatherServiceData.m */; }; + 88D99DB52289C82F0039E047 /* SDLIAPControlSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */; }; 88DF998D22035CC600477AC1 /* EAAccessory+OCMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */; }; 88DF998F22035D1700477AC1 /* SDLIAPSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */; }; 88DF999122035D5A00477AC1 /* SDLIAPTransportSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */; }; @@ -2871,6 +2873,7 @@ 8816772822208B82001FACFF /* SDLNavigationInstructionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLNavigationInstructionSpec.m; sourceTree = ""; }; 8816772A222097C3001FACFF /* SDLNavigationServiceData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLNavigationServiceData.h; sourceTree = ""; }; 8816772B222097C3001FACFF /* SDLNavigationServiceData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLNavigationServiceData.m; sourceTree = ""; }; + 8817C27F2289F41D00DB2DEC /* SDLIAPDataSessionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPDataSessionDelegate.h; sourceTree = ""; }; 8818ADD62100FC18007D6F19 /* SDLTurnSignal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLTurnSignal.h; sourceTree = ""; }; 8818ADD72100FC18007D6F19 /* SDLTurnSignal.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTurnSignal.m; sourceTree = ""; }; 8818ADDC2100FE0C007D6F19 /* SDLTurnSignalSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTurnSignalSpec.m; sourceTree = ""; }; @@ -3002,6 +3005,7 @@ 88D5EB36220CD95000EC3782 /* SDLWeatherServiceData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherServiceData.m; sourceTree = ""; }; 88D6F17D22319FE000D4BFB3 /* SDLRPCRequestNotification.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCRequestNotification.m; sourceTree = ""; }; 88D6F17E22319FE000D4BFB3 /* SDLRPCRequestNotification.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLRPCRequestNotification.h; sourceTree = ""; }; + 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPControlSessionDelegate.h; sourceTree = ""; }; 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "EAAccessory+OCMock.m"; sourceTree = ""; }; 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPSessionSpec.m; sourceTree = ""; }; 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPTransportSpec.m; sourceTree = ""; }; @@ -5371,6 +5375,8 @@ 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */, 880FE6252267AE5300723732 /* SDLIAPConstants.h */, 880FE6262267AE5300723732 /* SDLIAPConstants.m */, + 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */, + 8817C27F2289F41D00DB2DEC /* SDLIAPDataSessionDelegate.h */, ); name = IAP; sourceTree = ""; @@ -6118,6 +6124,7 @@ 5D61FC901A84238C00846EE7 /* SDLDisplayCapabilities.h in Headers */, 5D3E420A20EAAD6500D8C622 /* SDLTPMS.h in Headers */, 5D61FCE81A84238C00846EE7 /* SDLLanguage.h in Headers */, + 8817C2802289F4B900DB2DEC /* SDLIAPDataSessionDelegate.h in Headers */, 5D61FC841A84238C00846EE7 /* SDLDeviceLevelStatus.h in Headers */, 5DB92D321AC9C8BA00C15BB0 /* SDLRPCStruct.h in Headers */, 5D61FD151A84238C00846EE7 /* SDLOnLockScreenStatus.h in Headers */, @@ -6147,6 +6154,7 @@ DA9F7E6B1DCBFB0700ACAE48 /* SDLDeliveryMode.h in Headers */, E9C32B941AB20BA200F283AF /* SDLStreamDelegate.h in Headers */, DA9F7E871DCC049900ACAE48 /* SDLSubscribeWayPoints.h in Headers */, + 88D99DB52289C82F0039E047 /* SDLIAPControlSessionDelegate.h in Headers */, 5D61FDBB1A84238C00846EE7 /* SDLSystemAction.h in Headers */, 5D8A09811F54B4E5002502A2 /* SDLStreamingMediaManagerDataSource.h in Headers */, 5D61FC9C1A84238C00846EE7 /* SDLEmergencyEventType.h in Headers */, @@ -6710,7 +6718,7 @@ }; 5D61FA1B1A84237100846EE7 = { CreatedOnToolsVersion = 6.1.1; - LastSwiftMigration = 0940; + LastSwiftMigration = 1020; }; 5D61FA251A84237100846EE7 = { CreatedOnToolsVersion = 6.1.1; diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index c2a39ecdf..76b209ed7 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -10,15 +10,17 @@ #import "SDLIAPSessionDelegate.h" @class EAAccessory; +@class SDLIAPControlSessionDelegate; @class SDLIAPSession; -NS_ASSUME_NONNULL_BEGIN +@protocol SDLIAPControlSessionDelegate; -typedef void (^SDLIAPControlSessionRetryCompletionHandler)(void); -typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccessory *connectedaccessory, NSString *indexedProtocolString); +NS_ASSUME_NONNULL_BEGIN /** - * A control session is used by to get the unique protocol string needed to create a session with Core. The control session is only used on legacy head units that do not support the multisession protocol which allows multiple apps to connect over the same protocol string. When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core. + * A control session is used to get the unique protocol string needed to create a session with Core. The control session is only used with legacy head units that do not support the multisession protocol. The multisession protocol allows multiple apps to connect over the same protocol string. A control session is needed because each app on the device needs to connect to the accessory using a unique protocol string. + * + * When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core. */ @interface SDLIAPControlSession : NSObject @@ -28,7 +30,7 @@ typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccesso @property (nullable, strong, nonatomic, readonly) SDLIAPSession *session; /** - * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. + * The unique ID assigned to the session between the app and accessory. If no session exists the `connectionID` will be 0. */ @property (assign, nonatomic, readonly) NSUInteger connectionID; @@ -40,22 +42,26 @@ typedef void (^SDLIAPControlSessionCreateDataSessionCompletionHandler)(EAAccesso - (instancetype)init NS_UNAVAILABLE; /** - * Sets a new control session. + * Creates a new control session. * - * @param session The new control session - * @param retrySessionHandler A handler called when the control session fails to be established and a new session should be attempted. - * @param createDataSessionHandler A handler called when control session is successful and a new session must be established with the recevied protocol string. - * @return A SDLIAPControlSession object + * @param session The new control session. If a `nil` session is passed, the delegate will be notified that it should attempt to establish a new control session. + * @param delegate The control session delegate + * @return A SDLIAPControlSession object + */ +- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate; + +/** + * Starts a control session. */ -- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler; +- (void)startSession; /** - * Stops a current session. + * Stops the current control session if it is open. */ - (void)stopSession; /** - * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed. + * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and the delegate will be notified that it should attempt to establish a new control session. */ - (void)startSessionTimer; diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index a26691a30..1a8b77e24 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -11,12 +11,12 @@ #import "EAAccessory+SDLProtocols.h" #import "EAAccessoryManager+SDLProtocols.h" #import "SDLIAPConstants.h" +#import "SDLIAPControlSessionDelegate.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" #import "SDLTimer.h" - NS_ASSUME_NONNULL_BEGIN int const ProtocolIndexTimeoutSeconds = 10; @@ -25,12 +25,13 @@ @interface SDLIAPControlSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; +@property (weak, nonatomic) id delegate; @end @implementation SDLIAPControlSession -- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler { +- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate { SDLLogV(@"SDLIAPControlSession init"); self = [super init]; @@ -40,53 +41,51 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo _session = session; _protocolIndexTimer = nil; + _delegate = delegate; + + return self; +} - if (self.session) { - SDLLogD(@"Starting control session with accessory (%@)", self.session.accessory.name); - EAAccessory *accessory = session.accessory; +- (void)startSession { + if (_session == nil) { + SDLLogW(@"There is no control session in progress, attempting to create a new control session."); + if (self.delegate == nil) { return; } + [self.delegate retryControlSession:self.session]; + } else { + SDLLogD(@"Starting a control session with accessory (%@)", self.session.accessory.name); + EAAccessory *accessory = self.session.accessory; SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; - controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory createDataSessionCompletionHandler:createDataSessionHandler]; - controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEndedHandlerWithRetrySessionHandler:retrySessionHandler]; - controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamEndedHandlerWithRetrySessionHandler:retrySessionHandler]; + controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory]; + controlStreamDelegate.streamEndHandler = [self sdl_controlStreamEnded]; + controlStreamDelegate.streamErrorHandler = [self sdl_controlStreamErrored]; self.session.streamDelegate = controlStreamDelegate; if (![self.session start]) { - SDLLogW(@"Control session failed to setup with accessory: %@. Retrying...", accessory); + SDLLogW(@"Control session failed to setup with accessory: %@. Attempting to create a new control session", accessory); [self stopSession]; - if (retrySessionHandler != nil) { - retrySessionHandler(); - } + if (self.delegate == nil) { return; } + [self.delegate retryControlSession:self.session]; } else { - SDLLogW(@"Control session started"); - if (self.protocolIndexTimer != nil) { - SDLLogV(@"Cancelling control session timer"); - [self.protocolIndexTimer cancel]; - } - SDLLogD(@"Waiting for the protocol string from Core, setting timer for %d seconds", ProtocolIndexTimeoutSeconds); - self.protocolIndexTimer = [self sdl_createProtocolIndexTimerWithRetrySessionHandler:retrySessionHandler]; - } - } else { - SDLLogW(@"Failed to setup control session"); - if (retrySessionHandler != nil) { - retrySessionHandler(); + self.protocolIndexTimer = [self sdl_createProtocolIndexTimer]; } } - - return self; } - (void)stopSession { - if (self.session != nil) { - SDLLogD(@"Stopping the control session"); - [self.session stop]; - self.session.streamDelegate = nil; - - // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. + if (_session == nil) { + SDLLogV(@"Attempting to stop the control session but the session is nil"); + return; } + + SDLLogD(@"Stopping the control session"); + [self.session stop]; + self.session.streamDelegate = nil; + + // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. } -- (void)destroySession { +- (void)sdl_destroySession { if (self.session == nil || self.isSessionInProgress) { SDLLogW(@"Control session in progress. Can not destroy"); return; @@ -106,10 +105,9 @@ - (void)startSessionTimer { /** * Handler called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. * - * @param retrySessionHandler A handler called when a new session should be attempted - * @return A SDLStreamEndHandler handler + * @return A SDLStreamEndHandler handler */ -- (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { +- (SDLStreamEndHandler)sdl_controlStreamEnded { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -121,8 +119,8 @@ - (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDL [strongSelf.protocolIndexTimer cancel]; [strongSelf stopSession]; - if (retrySessionHandler == nil) { return; } - retrySessionHandler(); + if (strongSelf.delegate == nil) { return; } + [strongSelf.delegate retryControlSession:strongSelf.session]; } }; } @@ -130,11 +128,10 @@ - (SDLStreamEndHandler)sdl_controlStreamEndedHandlerWithRetrySessionHandler:(SDL /** * Handler called when the session gets a `NSStreamEventHasBytesAvailable` event code. A protocol string is created from the received data. Since a new session needs to be established with the protocol string, the current session is closed and a new session is created. * - * @param accessory The connected accessory - * @param createDataSessionHandler A handler called when the data session is established successfully with Core - * @return A SDLStreamHasBytesHandler handler + * @param accessory The connected accessory + * @return A SDLStreamHasBytesHandler handler */ -- (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory createDataSessionCompletionHandler:(SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionHandler { +- (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAccessory *)accessory { __weak typeof(self) weakSelf = self; return ^(NSInputStream *istream) { @@ -156,13 +153,13 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce // Destroy the control session as it is no longer needed, and then create the data session. dispatch_sync(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; - [strongSelf destroySession]; + [strongSelf sdl_destroySession]; }); if (accessory.isConnected) { dispatch_async(dispatch_get_main_queue(), ^{ - if (createDataSessionHandler != nil) { - createDataSessionHandler(accessory, indexedProtocolString); + if (strongSelf.delegate != nil) { + [strongSelf.delegate controlSession:strongSelf.session didGetProtocolString:indexedProtocolString forConnectedAccessory:accessory]; } [strongSelf.protocolIndexTimer cancel]; }); @@ -173,10 +170,9 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce /** * Handler called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. * - * @param retrySessionHandler A handler called when a new session should be attempted - * @return A SDLStreamErrorHandler handler + * @return A SDLStreamErrorHandler handler */ -- (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { +- (SDLStreamErrorHandler)sdl_controlStreamErrored { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { @@ -186,8 +182,8 @@ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithRetrySessionHandler: [strongSelf.protocolIndexTimer cancel]; [strongSelf stopSession]; - if (retrySessionHandler == nil) { return; } - retrySessionHandler(); + if (self.delegate == nil) { return; } + [self.delegate retryControlSession:self.session]; }; } @@ -198,7 +194,7 @@ - (SDLStreamErrorHandler)sdl_controlStreamErroredHandlerWithRetrySessionHandler: * * @return A timer */ -- (SDLTimer *)sdl_createProtocolIndexTimerWithRetrySessionHandler:(SDLIAPControlSessionRetryCompletionHandler)retrySessionHandler { +- (SDLTimer *)sdl_createProtocolIndexTimer { SDLTimer *protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO]; __weak typeof(self) weakSelf = self; @@ -207,11 +203,11 @@ - (SDLTimer *)sdl_createProtocolIndexTimerWithRetrySessionHandler:(SDLIAPControl SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds); [strongSelf.session stop]; - if (retrySessionHandler == nil) { return; } - retrySessionHandler(); + if (strongSelf.delegate == nil) { return; } + [strongSelf.delegate retryControlSession:strongSelf.session]; }; - protocolIndexTimer.elapsedBlock = elapsedBlock; + protocolIndexTimer.elapsedBlock = elapsedBlock; return protocolIndexTimer; } diff --git a/SmartDeviceLink/SDLIAPControlSessionDelegate.h b/SmartDeviceLink/SDLIAPControlSessionDelegate.h new file mode 100644 index 000000000..930d8688a --- /dev/null +++ b/SmartDeviceLink/SDLIAPControlSessionDelegate.h @@ -0,0 +1,23 @@ +// +// SDLIAPControlSessionDelegate.h +// SmartDeviceLink-iOS +// +// Created by Nicole on 5/13/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +@class SDLIAPControlSession; + +NS_ASSUME_NONNULL_BEGIN + +@protocol SDLIAPControlSessionDelegate + +- (void)retryControlSession:(nullable SDLIAPSession *)controlSession; +- (void)controlSession:(SDLIAPSession *)controlSession didGetProtocolString:(NSString *)protocolString forConnectedAccessory:(EAAccessory *)accessory; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/SmartDeviceLink/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/SDLIAPDataSessionDelegate.h new file mode 100644 index 000000000..491f05414 --- /dev/null +++ b/SmartDeviceLink/SDLIAPDataSessionDelegate.h @@ -0,0 +1,22 @@ +// +// SDLIAPDataSessionDelegate.h +// SmartDeviceLink-iOS +// +// Created by Nicole on 5/13/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +@class SDLIAPControlSession; + +NS_ASSUME_NONNULL_BEGIN + +@protocol SDLIAPDataSessionDelegate + +- (void)retryDataSession:(nullable SDLIAPSession *)dataSession; +- (void)dataReceived:(NSData *)dataIn; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 37750b5f7..338db8ddb 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -11,6 +11,7 @@ #import "SDLGlobals.h" #import "SDLIAPConstants.h" #import "SDLIAPControlSession.h" +#import "SDLIAPControlSessionDelegate.h" #import "SDLIAPDataSession.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" @@ -18,13 +19,12 @@ #import "SDLTimer.h" #import - NS_ASSUME_NONNULL_BEGIN NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; int const CreateSessionRetries = 3; -@interface SDLIAPTransport () +@interface SDLIAPTransport () @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; @property (nullable, strong, nonatomic) SDLIAPDataSession *dataSession; @@ -319,7 +319,7 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { - (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)accessory sessionDelegate:(id)sessionDelegate { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; session.delegate = sessionDelegate; - return [[SDLIAPControlSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryControlSessionHandler createDataSessionCompletionHandler:self.createDataSessionCompletionHandler]; + return [[SDLIAPControlSession alloc] initWithSession:session delegate:self]; } /** @@ -420,33 +420,6 @@ - (void)sdl_retryEstablishSession { #pragma mark - Session Handlers -#pragma mark Control Session Handlers - -/** - * Called when the control session should be retried. - * - * @return A SDLIAPControlSessionRetryCompletionHandler handler - */ -- (nullable SDLIAPControlSessionRetryCompletionHandler)retryControlSessionHandler { - __weak typeof(self) weakSelf = self; - return ^{ - [weakSelf sdl_retryEstablishSession]; - }; -} - -/** - * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. - * - * @return A SDLIAPControlSessionCreateDataSessionCompletionHandler handler - */ -- (nullable SDLIAPControlSessionCreateDataSessionCompletionHandler)createDataSessionCompletionHandler { - __weak typeof(self) weakSelf = self; - return ^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - weakSelf.dataSession = [weakSelf sdl_createDataSessionWithAccessory:connectedaccessory forProtocol:indexedProtocolString sessionDelegate:weakSelf]; - }; -} - - #pragma mark Data Session Handlers /** @@ -610,6 +583,28 @@ - (void)dealloc { self.accessoryConnectDuringActiveSession = NO; } +#pragma mark - SDLIAPControlSessionDelegate + +/** + * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. + * + * @param controlSession The control session + * @param protocolString The protocol string to be used to open the data session + * @param accessory The accessory with which to create a data session + */ +- (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolString:(nonnull NSString *)protocolString forConnectedAccessory:(nonnull EAAccessory *)accessory { + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:protocolString sessionDelegate:self]; +} + +/** + * Called when the control session should be retried. + * + * @param controlSession The control session + */ +- (void)retryControlSession:(nullable SDLIAPSession *)controlSession { + [self sdl_retryEstablishSession]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index d9736461a..cf6ef7e44 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -14,12 +14,14 @@ #import "EAAccessory+OCMock.m" #import "SDLIAPConstants.h" +#import "SDLIAPControlSessionDelegate.h" #import "SDLIAPSession.h" #import "SDLTimer.h" @interface SDLIAPControlSession() @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; +@property (weak, nonatomic) id delegate; @end QuickSpecBegin(SDLIAPControlSessionSpec) @@ -28,64 +30,89 @@ @interface SDLIAPControlSession() __block SDLIAPControlSession *controlSession = nil; __block EAAccessory *mockAccessory = nil; __block SDLIAPSession *mockSession = nil; - __block BOOL retryHandlerCalled = nil; - __block BOOL createDataSessionHandlerCalled = nil; + __block id mockDelegate = nil; beforeEach(^{ - retryHandlerCalled = NO; - createDataSessionHandlerCalled = NO; - mockAccessory = [EAAccessory.class sdlCoreMock]; mockSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockSession accessory]).andReturn(mockAccessory); + + mockDelegate = OCMProtocolMock(@protocol(SDLIAPControlSessionDelegate)); }); describe(@"init", ^{ - describe(@"When a session starts successfully", ^{ + context(@"with a valid session", ^{ beforeEach(^{ - OCMStub([mockSession start]).andReturn(YES); - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - retryHandlerCalled = YES; - } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - createDataSessionHandlerCalled = YES; - }]; + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; }); - it(@"Should set the session", ^{ + it(@"Should get/set correctly", ^{ expect(controlSession.session).toNot(beNil()); expect(controlSession.connectionID).to(equal(5)); + expect(controlSession.delegate).to(equal(mockDelegate)); }); - it(@"Should create a timer", ^{ - expect(controlSession.protocolIndexTimer).toNot(beNil()); + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is stopped", ^{ + OCMStub([mockSession isStopped]).andReturn(NO); + expect(controlSession.isSessionInProgress).to(beTrue()); + }); + + it(@"Should be in progress if the session is running", ^{ + OCMStub([mockSession isStopped]).andReturn(YES); + expect(controlSession.isSessionInProgress).to(beFalse()); + }); }); + }); - it(@"Should not try to establish a new session", ^{ - expect(retryHandlerCalled).to(beFalse()); - expect(createDataSessionHandlerCalled).to(beFalse()); + context(@"with a nil session", ^{ + beforeEach(^{ + controlSession = [[SDLIAPControlSession alloc] initWithSession:nil delegate:mockDelegate]; + }); + + it(@"Should get/set correctly", ^{ + expect(controlSession.session).to(beNil()); + expect(controlSession.connectionID).to(equal(0)); + expect(controlSession.delegate).to(equal(mockDelegate)); }); describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is stopped", ^{ + it(@"Should not be in progress if the session is stopped because the session is `nil`", ^{ OCMStub([mockSession isStopped]).andReturn(NO); - expect(controlSession.isSessionInProgress).to(beTrue()); + expect(controlSession.isSessionInProgress).to(beFalse()); }); - it(@"Should be in progress if the session is running", ^{ + it(@"Should be in progress if the session is running becasue the session is `nil`", ^{ OCMStub([mockSession isStopped]).andReturn(YES); expect(controlSession.isSessionInProgress).to(beFalse()); }); }); }); + }); + + describe(@"Starting a session", ^{ + describe(@"When a session starts successfully", ^{ + beforeEach(^{ + OCMStub([mockSession start]).andReturn(YES); + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [controlSession startSession]; + }); + + it(@"Should create a timer", ^{ + expect(controlSession.protocolIndexTimer).toNot(beNil()); + }); + + it(@"Should not try to establish a new session", ^{ + OCMReject([mockDelegate retryControlSession:[OCMArg any]]); + OCMReject([mockDelegate controlSession:[OCMArg any] didGetProtocolString:[OCMArg any] forConnectedAccessory:[OCMArg any]]); + }); + }); describe(@"When a session does not start successfully", ^{ beforeEach(^{ OCMStub([mockSession start]).andReturn(NO); - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - retryHandlerCalled = YES; - } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - createDataSessionHandlerCalled = YES; - }]; + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [controlSession startSession]; }); it(@"Should not create a timer", ^{ @@ -93,30 +120,24 @@ @interface SDLIAPControlSession() }); it(@"Should try to establish a new session", ^{ - expect(retryHandlerCalled).to(beTrue()); - expect(createDataSessionHandlerCalled).to(beFalse()); + OCMVerify([mockDelegate retryControlSession:[OCMArg any]]); + OCMReject([mockDelegate controlSession:[OCMArg any] didGetProtocolString:[OCMArg any] forConnectedAccessory:[OCMArg any]]); }); it(@"Should should stop but not destroy the session", ^{ expect(controlSession.session).toNot(beNil()); expect(controlSession.connectionID).to(equal(5)); + }); + it(@"Should should stop but not destroy the session", ^{ OCMVerify([mockSession stop]); }); }); - describe(@"When a session is nil", ^{ + describe(@"When a session can not be started because the session is nil", ^{ beforeEach(^{ - mockSession = nil; - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - retryHandlerCalled = YES; - } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - createDataSessionHandlerCalled = YES; - }]; - }); - - it(@"Should not set the session", ^{ - expect(controlSession.session).to(beNil()); + controlSession = [[SDLIAPControlSession alloc] initWithSession:nil delegate:mockDelegate]; + [controlSession startSession]; }); it(@"Should not create a timer", ^{ @@ -128,14 +149,34 @@ @interface SDLIAPControlSession() }); it(@"Should try to establish a new session", ^{ - expect(retryHandlerCalled).to(beTrue()); - expect(createDataSessionHandlerCalled).to(beFalse()); + OCMVerify([mockDelegate retryControlSession:[OCMArg any]]); + OCMReject([mockDelegate controlSession:[OCMArg any] didGetProtocolString:[OCMArg any] forConnectedAccessory:[OCMArg any]]); + }); + }); + }); + + describe(@"Stopping a session", ^{ + context(@"that is nil", ^{ + beforeEach(^{ + mockSession = nil; + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [controlSession stopSession]; }); - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is nil", ^{ - expect(controlSession.isSessionInProgress).to(beFalse()); - }); + it(@"Should not try to stop the session", ^{ + expect(controlSession.session).to(beNil()); + }); + }); + + context(@"that is started", ^{ + beforeEach(^{ + controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [controlSession stopSession]; + }); + + it(@"Should try to stop the session", ^{ + expect(controlSession.session).toNot(beNil()); + expect(controlSession.session.streamDelegate).to(beNil()); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index 5e29baf57..5277c2f13 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -15,6 +15,7 @@ #import "SDLIAPSession.h" #import "SDLTimer.h" #import "SDLIAPControlSession.h" +#import "SDLIAPControlSessionDelegate.h" #import "SDLIAPDataSession.h" @interface SDLIAPTransport () @@ -155,13 +156,13 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc describe(@"When a control session is open", ^{ __block SDLIAPSession *mockControlSession = nil; __block NSNotification *accessoryDisconnectedNotification = nil; + __block id mockDelegate = nil; beforeEach(^{ + mockDelegate = OCMProtocolMock(@protocol(SDLIAPControlSessionDelegate)); mockControlSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockControlSession accessory]).andReturn(mockAccessory); - transport.controlSession = [[SDLIAPControlSession alloc] initWithSession:mockControlSession retrySessionCompletionHandler:^{ - } createDataSessionCompletionHandler:^(EAAccessory * _Nonnull connectedaccessory, NSString * _Nonnull indexedProtocolString) { - }]; + transport.controlSession = [[SDLIAPControlSession alloc] initWithSession:mockControlSession delegate:mockDelegate]; transport.dataSession = nil; transport.sessionSetupInProgress = YES; From 70d0658fdb5f8dbd0bc651168b8ed43f7bc63209 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 13 May 2019 16:36:20 -0400 Subject: [PATCH 036/179] Added delegate for data session * Fixed test cases --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 28 ++- SmartDeviceLink/SDLIAPDataSession.h | 21 +- SmartDeviceLink/SDLIAPDataSession.m | 83 ++++---- SmartDeviceLink/SDLIAPSession.m | 3 +- SmartDeviceLink/SDLIAPTransport.m | 50 ++--- .../iAP/SDLIAPControlSessionSpec.m | 3 +- .../iAP/SDLIAPDataSessionSpec.m | 180 +++++++++++------- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 6 +- 8 files changed, 216 insertions(+), 158 deletions(-) diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index d1d84f005..5b3e7444e 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -5362,6 +5362,8 @@ 5DAB5F582098E8BC00A020C8 /* IAP */ = { isa = PBXGroup; children = ( + 884DFBCB2289F6FF00EA8846 /* Data Session */, + 884DFBCA2289F6EA00EA8846 /* Control Session */, E9C32B891AB20BA200F283AF /* SDLIAPSession.h */, E9C32B8A1AB20BA200F283AF /* SDLIAPSession.m */, E9C32B8B1AB20BA200F283AF /* SDLIAPSessionDelegate.h */, @@ -5369,14 +5371,8 @@ 5D61FADB1A84238A00846EE7 /* SDLIAPTransport.m */, E9C32B8C1AB20BA200F283AF /* SDLStreamDelegate.h */, E9C32B8D1AB20BA200F283AF /* SDLStreamDelegate.m */, - 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */, - 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */, - 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */, - 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */, 880FE6252267AE5300723732 /* SDLIAPConstants.h */, 880FE6262267AE5300723732 /* SDLIAPConstants.m */, - 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */, - 8817C27F2289F41D00DB2DEC /* SDLIAPDataSessionDelegate.h */, ); name = IAP; sourceTree = ""; @@ -5861,6 +5857,26 @@ name = "Shared Assets"; sourceTree = ""; }; + 884DFBCA2289F6EA00EA8846 /* Control Session */ = { + isa = PBXGroup; + children = ( + 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */, + 88BCEA902266250B00BB7E70 /* SDLIAPControlSession.h */, + 88BCEA912266250B00BB7E70 /* SDLIAPControlSession.m */, + ); + name = "Control Session"; + sourceTree = ""; + }; + 884DFBCB2289F6FF00EA8846 /* Data Session */ = { + isa = PBXGroup; + children = ( + 88D3EBC72267949D00493C38 /* SDLIAPDataSession.h */, + 88D3EBC82267949D00493C38 /* SDLIAPDataSession.m */, + 8817C27F2289F41D00DB2DEC /* SDLIAPDataSessionDelegate.h */, + ); + name = "Data Session"; + sourceTree = ""; + }; 88A0AA5F207CFEA60075132C /* Connection */ = { isa = PBXGroup; children = ( diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index 638dbc20d..3573ddedf 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -10,10 +10,9 @@ @class SDLIAPSession; -NS_ASSUME_NONNULL_BEGIN +@protocol SDLIAPDataSessionDelegate; -typedef void (^SDLIAPDataSessionRetryCompletionHandler)(void); -typedef void (^SDLIAPDataSessionDataReceivedHandler)(NSData *dataIn); +NS_ASSUME_NONNULL_BEGIN @interface SDLIAPDataSession : NSObject @@ -35,14 +34,18 @@ typedef void (^SDLIAPDataSessionDataReceivedHandler)(NSData *dataIn); - (instancetype)init NS_UNAVAILABLE; /** - * Sets a new data session. + * Creates a new data session. * - * @param session The new data session. - * @param retrySessionHandler A handler called when the data session fails to be established and a new session should be attempted. - * @param dataReceivedHandler A handler called when data is received from Core - * @return A SDLIAPSession object + * @param session The new data session. If a `nil` session is passed, the delegate will be notified that it should attempt to establish a new data session. + * @param delegate The data session delegate + * @return A SDLIAPSession object + */ +- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate; + +/** + * Starts a data session. */ -- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler; +- (void)startSession; /** * Stops a current session. diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index d3911f183..ab40c635f 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -13,6 +13,7 @@ #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" +#import "SDLIAPDataSessionDelegate.h" NS_ASSUME_NONNULL_BEGIN @@ -20,12 +21,13 @@ @interface SDLIAPDataSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; +@property (weak, nonatomic) id delegate; @end @implementation SDLIAPDataSession -- (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCompletionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler dataReceivedCompletionHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { +- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate { SDLLogV(@"SDLIAPDataSession init"); self = [super init]; @@ -34,40 +36,44 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session retrySessionCo } _session = session; + _delegate = delegate; - if (self.session) { - SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, session.protocol); + return self; +} + +- (void)startSession { + if (_session == nil) { + SDLLogW(@"Failed to setup data session"); + if (self.delegate == nil) { return; } + [self.delegate retryDataSession:self.session]; + } else { + SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, self.session.protocol); SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; self.session.streamDelegate = ioStreamDelegate; - ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandlerWithDataReceivedHandler:dataReceivedHandler]; - ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandlerWithRetrySessionHandler:retrySessionHandler]; - ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandlerWithRetrySessionHandler:retrySessionHandler]; + ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandler]; + ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandler]; + ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandler]; if (![self.session start]) { - SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", session.accessory); + SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.session.accessory); [self stopSession]; - if (retrySessionHandler != nil) { - retrySessionHandler(); - } - } - } else { - SDLLogW(@"Failed to setup data session"); - if (retrySessionHandler != nil) { - retrySessionHandler(); + if (self.delegate == nil) { return; } + [self.delegate retryDataSession:self.session]; } } - - return self; } - (void)stopSession { - if (self.session != nil) { - SDLLogD(@"Stopping the data session"); - [self.session stop]; - self.session.streamDelegate = nil; - - // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. + if (_session == nil) { + SDLLogV(@"Attempting to stop the data session but the session is nil"); + return; } + + SDLLogD(@"Stopping the data session"); + [self.session stop]; + self.session.streamDelegate = nil; + + // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. } #pragma mark - Data Stream Handlers @@ -75,10 +81,9 @@ - (void)stopSession { /** * Handler called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. * - * @param retrySessionHandler A handler called when a new session should be attempted - * @return A SDLStreamEndHandler handler + * @return A SDLStreamEndHandler handler */ -- (SDLStreamEndHandler)sdl_dataStreamEndedHandlerWithRetrySessionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler { +- (SDLStreamEndHandler)sdl_dataStreamEndedHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); @@ -93,8 +98,8 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandlerWithRetrySessionHandler:(SDLIAP dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; - if (retrySessionHandler == nil) { return; } - retrySessionHandler(); + if (self.delegate == nil) { return; } + [self.delegate retryDataSession:self.session]; }); // To prevent deadlocks the handler must return to the runloop and not block the thread @@ -104,11 +109,13 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandlerWithRetrySessionHandler:(SDLIAP /** * Handler called when the session gets a `NSStreamEventHasBytesAvailable` event code. The data is passed to the listener. * - * @param dataReceivedHandler A handler called when data is received from Core - * @return A SDLStreamHasBytesHandler handler + * @return A SDLStreamHasBytesHandler handler */ -- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandlerWithDataReceivedHandler:(SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { +- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { + __weak typeof(self) weakSelf = self; return ^(NSInputStream *istream) { + __strong typeof(weakSelf) strongSelf = weakSelf; + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; while (istream.streamStatus == NSStreamStatusOpen && istream.hasBytesAvailable) { @@ -124,8 +131,8 @@ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandlerWithDataReceivedHandler SDLLogBytes(dataIn, SDLLogBytesDirectionReceive); if (bytesRead > 0) { - if (dataReceivedHandler == nil) { return; } - dataReceivedHandler(dataIn); + if (strongSelf.delegate == nil) { return; } + [strongSelf.delegate dataReceived:dataIn]; } else { break; } @@ -136,20 +143,20 @@ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandlerWithDataReceivedHandler /** * Handler called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. * - * @param retrySessionHandler A handler called when a new session should be attempted - * @return A SDLStreamErrorHandler handler + * @return A SDLStreamErrorHandler handler */ -- (SDLStreamErrorHandler)sdl_dataStreamErroredHandlerWithRetrySessionHandler:(SDLIAPDataSessionRetryCompletionHandler)retrySessionHandler { +- (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { __weak typeof(self) weakSelf = self; return ^(NSStream *stream) { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); __strong typeof(weakSelf) strongSelf = weakSelf; + SDLLogE(@"Data stream error"); dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { - if (retrySessionHandler == nil) { return; } - retrySessionHandler(); + if (self.delegate == nil) { return; } + [self.delegate retryDataSession:strongSelf.session]; } }); diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index b6ddc7d3e..2fedc3679 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -100,13 +100,14 @@ - (void)sdl_stop { } self.ioStreamThread = nil; self.isDataSession = NO; + self.easession = nil; }]; } else { // Stop control session [self stopStream:self.easession.outputStream]; [self stopStream:self.easession.inputStream]; + self.easession = nil; } - self.easession = nil; } - (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completionHandler:(void (^)(BOOL success))completionHandler { diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 338db8ddb..5a0ad5e94 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -13,6 +13,7 @@ #import "SDLIAPControlSession.h" #import "SDLIAPControlSessionDelegate.h" #import "SDLIAPDataSession.h" +#import "SDLIAPDataSessionDelegate.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" @@ -24,7 +25,7 @@ NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; int const CreateSessionRetries = 3; -@interface SDLIAPTransport () +@interface SDLIAPTransport () @property (nullable, strong, nonatomic) SDLIAPControlSession *controlSession; @property (nullable, strong, nonatomic) SDLIAPDataSession *dataSession; @@ -333,7 +334,7 @@ - (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)a - (SDLIAPDataSession *)sdl_createDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; session.delegate = sessionDelegate; - return [[SDLIAPDataSession alloc] initWithSession:session retrySessionCompletionHandler:self.retryDataSessionHandler dataReceivedCompletionHandler:self.dataReceivedHandler]; + return [[SDLIAPDataSession alloc] initWithSession:session delegate:self]; } /** @@ -417,36 +418,6 @@ - (void)sdl_retryEstablishSession { [self sdl_connect:nil]; } - -#pragma mark - Session Handlers - -#pragma mark Data Session Handlers - -/** - * Called when the data session should be retried. - * - * @return A SDLIAPDataSessionRetryCompletionHandler handler - */ -- (nullable SDLIAPDataSessionRetryCompletionHandler)retryDataSessionHandler { - __weak typeof(self) weakSelf = self; - return ^{ - [weakSelf sdl_retryEstablishSession]; - }; -} - -/** - * Called when data is received during the data session. The data is passed to the listeners. - * - * @return A SDLIAPDataSessionCreateDataReceivedHandler handler - */ -- (nullable SDLIAPDataSessionDataReceivedHandler)dataReceivedHandler { - __weak typeof(self) weakSelf = self; - return ^(NSData * _Nonnull dataIn) { - [weakSelf.delegate onDataReceived:dataIn]; - [weakSelf sdl_backgroundTaskStart]; - }; -} - #pragma mark - SDLIAPSessionDelegate /** @@ -583,7 +554,9 @@ - (void)dealloc { self.accessoryConnectDuringActiveSession = NO; } -#pragma mark - SDLIAPControlSessionDelegate +#pragma mark - iAP Session Delegates + +#pragma mark Control Session /** * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. @@ -605,6 +578,17 @@ - (void)retryControlSession:(nullable SDLIAPSession *)controlSession { [self sdl_retryEstablishSession]; } +#pragma mark Data Session + +- (void)dataReceived:(nonnull NSData *)dataIn { + [self.delegate onDataReceived:dataIn]; + [self sdl_backgroundTaskStart]; +} + +- (void)retryDataSession:(nullable SDLIAPSession *)dataSession { + [self sdl_retryEstablishSession]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index cf6ef7e44..c5951e72a 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -33,11 +33,10 @@ @interface SDLIAPControlSession() __block id mockDelegate = nil; beforeEach(^{ + mockDelegate = OCMProtocolMock(@protocol(SDLIAPControlSessionDelegate)); mockAccessory = [EAAccessory.class sdlCoreMock]; mockSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockSession accessory]).andReturn(mockAccessory); - - mockDelegate = OCMProtocolMock(@protocol(SDLIAPControlSessionDelegate)); }); describe(@"init", ^{ diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m index c7c89584e..c0985c09e 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -15,6 +15,11 @@ #import "EAAccessory+OCMock.m" #import "SDLIAPConstants.h" #import "SDLIAPSession.h" +#import "SDLIAPDataSessionDelegate.h" + +@interface SDLIAPDataSession() +@property (weak, nonatomic) id delegate; +@end QuickSpecBegin(SDLIAPDataSessionSpec) @@ -22,101 +27,144 @@ __block SDLIAPDataSession *dataSession = nil; __block EAAccessory *mockAccessory = nil; __block SDLIAPSession *mockSession = nil; - __block BOOL retryHandlerCalled = nil; - __block BOOL createDataSessionHandlerCalled = nil; - - beforeEach(^{ - retryHandlerCalled = NO; - createDataSessionHandlerCalled = NO; + __block id mockDelegate = nil; + beforeEach(^{ + mockDelegate = OCMProtocolMock(@protocol(SDLIAPDataSessionDelegate)); mockAccessory = [EAAccessory.class sdlCoreMock]; mockSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockSession accessory]).andReturn(mockAccessory); }); - describe(@"When a session starts successfully", ^{ - beforeEach(^{ - OCMStub([mockSession start]).andReturn(YES); - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - retryHandlerCalled = YES; - } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { - createDataSessionHandlerCalled = YES; - }]; - }); + describe(@"init", ^{ + context(@"with a valid session", ^{ + beforeEach(^{ + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; + }); - it(@"Should set the sesion", ^{ - expect(dataSession.session).toNot(beNil()); - expect(dataSession.connectionID).to(equal(5)); - }); + it(@"Should get/set correctly", ^{ + expect(dataSession.session).toNot(beNil()); + expect(dataSession.connectionID).to(equal(5)); + expect(dataSession.delegate).to(equal(mockDelegate)); + }); - it(@"Should not try to establish a new session", ^{ - expect(retryHandlerCalled).to(beFalse()); - expect(createDataSessionHandlerCalled).to(beFalse()); + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is stopped", ^{ + OCMStub([mockSession isStopped]).andReturn(NO); + expect(dataSession.isSessionInProgress).to(beTrue()); + }); + + it(@"Should be in progress if the session is running", ^{ + OCMStub([mockSession isStopped]).andReturn(YES); + expect(dataSession.isSessionInProgress).to(beFalse()); + }); + }); }); - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is stopped", ^{ - OCMStub([mockSession isStopped]).andReturn(NO); - expect(dataSession.isSessionInProgress).to(beTrue()); + context(@"with a nil session", ^{ + beforeEach(^{ + dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; }); - it(@"Should be in progress if the session is running", ^{ - OCMStub([mockSession isStopped]).andReturn(YES); - expect(dataSession.isSessionInProgress).to(beFalse()); + it(@"Should get/set correctly", ^{ + expect(dataSession.session).to(beNil()); + expect(dataSession.connectionID).to(equal(0)); + expect(dataSession.delegate).to(equal(mockDelegate)); + }); + + describe(@"When checking if the session is in progress", ^{ + it(@"Should not be in progress if the session is stopped because the session is `nil`", ^{ + OCMStub([mockSession isStopped]).andReturn(NO); + expect(dataSession.isSessionInProgress).to(beFalse()); + }); + + it(@"Should be in progress if the session is running becasue the session is `nil`", ^{ + OCMStub([mockSession isStopped]).andReturn(YES); + expect(dataSession.isSessionInProgress).to(beFalse()); + }); }); }); }); - describe(@"When a session does not start successfully", ^{ - beforeEach(^{ - OCMStub([mockSession start]).andReturn(NO); - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - retryHandlerCalled = YES; - } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { - createDataSessionHandlerCalled = YES; - }]; + + describe(@"Starting a session", ^{ + xdescribe(@"When a session starts successfully", ^{ + beforeEach(^{ + OCMStub([mockSession start]).andReturn(YES); + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [dataSession startSession]; + }); + + it(@"Should not try to establish a new session", ^{ + OCMReject([mockDelegate retryDataSession:[OCMArg any]]); + OCMReject([mockDelegate dataReceived:[OCMArg any]]); + }); }); - it(@"Should try to establish a new session", ^{ - expect(retryHandlerCalled).to(beTrue()); - expect(createDataSessionHandlerCalled).to(beFalse()); + describe(@"When a session does not start successfully", ^{ + beforeEach(^{ + OCMStub([mockSession start]).andReturn(NO); + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [dataSession startSession]; + }); + + it(@"Should try to establish a new session", ^{ + OCMVerify([mockDelegate retryDataSession:[OCMArg any]]); + OCMReject([mockDelegate dataReceived:[OCMArg any]]); + }); + + it(@"Should should stop but not destroy the session", ^{ + expect(dataSession.session).toNot(beNil()); + expect(dataSession.connectionID).to(equal(5)); + }); + + it(@"Should should stop but not destroy the session", ^{ + OCMVerify([mockSession stop]); + }); }); - it(@"Should should stop but not destroy the session", ^{ - expect(dataSession.session).toNot(beNil()); - expect(dataSession.connectionID).to(equal(5)); + describe(@"When a session can not be started because the session is nil", ^{ + beforeEach(^{ + dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; + [dataSession startSession]; + }); + + it(@"Should return a connectionID of zero", ^{ + expect(dataSession.connectionID).to(equal(0)); + }); - OCMVerify([mockSession stop]); + it(@"Should try to establish a new session", ^{ + OCMVerify([mockDelegate retryDataSession:[OCMArg any]]); + OCMReject([mockDelegate dataReceived:[OCMArg any]]); + }); }); }); - describe(@"When a session is nil", ^{ - beforeEach(^{ - mockSession = nil; - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - retryHandlerCalled = YES; - } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { - createDataSessionHandlerCalled = YES; - }]; - }); + describe(@"Stopping a session", ^{ + context(@"that is nil", ^{ + beforeEach(^{ + dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; + [dataSession stopSession]; + }); - it(@"Should not set the session", ^{ - expect(dataSession).toNot(beNil()); - expect(dataSession.session).to(beNil()); + it(@"Should not try to stop the session", ^{ + expect(dataSession.session).to(beNil()); + }); }); - it(@"Should return a connectionID of zero", ^{ - expect(dataSession.connectionID).to(equal(0)); - }); + context(@"that is started", ^{ + beforeEach(^{ + dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; + [dataSession stopSession]; + }); - it(@"Should try to establish a new session", ^{ - expect(retryHandlerCalled).to(beTrue()); - expect(createDataSessionHandlerCalled).to(beFalse()); - }); + it(@"Should try to stop the session", ^{ + expect(dataSession.session).toNot(beNil()); + expect(dataSession.session.streamDelegate).to(beNil()); + }); - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is nil", ^{ - expect(dataSession.isSessionInProgress).to(beFalse()); + it(@"Should should stop but not destroy the session", ^{ + OCMVerify([mockSession stop]); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index 5277c2f13..5f347c6dd 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -17,6 +17,7 @@ #import "SDLIAPControlSession.h" #import "SDLIAPControlSessionDelegate.h" #import "SDLIAPDataSession.h" +#import "SDLIAPDataSessionDelegate.h" @interface SDLIAPTransport () @@ -100,14 +101,13 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc describe(@"When an accessory disconnects", ^{ __block SDLIAPSession *mockSession = nil; __block NSNotification *accessoryDisconnectedNotification = nil; + __block id mockDelegate = nil; beforeEach(^{ transport.controlSession = nil; mockSession = OCMClassMock([SDLIAPSession class]); OCMStub([mockSession accessory]).andReturn(mockAccessory); - transport.dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession retrySessionCompletionHandler:^{ - } dataReceivedCompletionHandler:^(NSData * _Nonnull dataIn) { - }]; + transport.dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; }); From 0fc61791bce71e76fb8ff0b6b3f2ddfc124bb40e Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 14 May 2019 09:16:12 -0400 Subject: [PATCH 037/179] Deprecate RPC superclass initializers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * So that they won’t appear on every RPC initializer in autocomplete and confuse developers --- SmartDeviceLink/SDLAddCommand.m | 19 +-- SmartDeviceLink/SDLAddCommandResponse.m | 3 + SmartDeviceLink/SDLAddSubMenu.m | 19 +-- SmartDeviceLink/SDLAddSubMenuResponse.m | 3 + SmartDeviceLink/SDLAirbagStatus.m | 32 ++--- SmartDeviceLink/SDLAlert.m | 35 ++--- SmartDeviceLink/SDLAlertManeuver.m | 11 +- SmartDeviceLink/SDLAlertManeuverResponse.m | 3 + SmartDeviceLink/SDLAlertResponse.m | 7 +- SmartDeviceLink/SDLAppInfo.m | 12 +- SmartDeviceLink/SDLAppServiceCapability.m | 8 +- SmartDeviceLink/SDLAppServiceData.m | 20 +-- SmartDeviceLink/SDLAppServiceManifest.m | 36 ++--- SmartDeviceLink/SDLAppServiceRecord.m | 16 +-- SmartDeviceLink/SDLAppServicesCapabilities.m | 4 +- SmartDeviceLink/SDLAudioControlCapabilities.m | 24 ++-- SmartDeviceLink/SDLAudioControlData.m | 16 +-- .../SDLAudioPassThruCapabilities.m | 12 +- SmartDeviceLink/SDLBeltStatus.m | 60 ++++----- SmartDeviceLink/SDLBodyInformation.m | 28 ++-- SmartDeviceLink/SDLButtonCapabilities.m | 16 +-- SmartDeviceLink/SDLButtonPress.m | 15 ++- SmartDeviceLink/SDLButtonPressResponse.m | 3 + SmartDeviceLink/SDLChangeRegistration.m | 27 ++-- .../SDLChangeRegistrationResponse.m | 3 + SmartDeviceLink/SDLChoice.m | 28 ++-- .../SDLClimateControlCapabilities.m | 64 ++++----- SmartDeviceLink/SDLClimateControlData.m | 56 ++++---- SmartDeviceLink/SDLCloudAppProperties.m | 28 ++-- SmartDeviceLink/SDLClusterModeStatus.m | 16 +-- .../SDLCreateInteractionChoiceSet.m | 11 +- .../SDLCreateInteractionChoiceSetResponse.m | 3 + SmartDeviceLink/SDLDIDResult.m | 12 +- SmartDeviceLink/SDLDateTime.m | 36 ++--- SmartDeviceLink/SDLDeleteCommand.m | 7 +- SmartDeviceLink/SDLDeleteCommandResponse.m | 3 + SmartDeviceLink/SDLDeleteFile.m | 7 +- SmartDeviceLink/SDLDeleteFileResponse.m | 7 +- .../SDLDeleteInteractionChoiceSet.m | 7 +- .../SDLDeleteInteractionChoiceSetResponse.m | 3 + SmartDeviceLink/SDLDeleteSubMenu.m | 7 +- SmartDeviceLink/SDLDeleteSubMenuResponse.m | 3 + SmartDeviceLink/SDLDeviceInfo.m | 24 ++-- SmartDeviceLink/SDLDeviceStatus.m | 44 +++---- SmartDeviceLink/SDLDiagnosticMessage.m | 15 ++- .../SDLDiagnosticMessageResponse.m | 7 +- SmartDeviceLink/SDLDialNumber.m | 7 +- SmartDeviceLink/SDLDialNumberResponse.m | 3 + SmartDeviceLink/SDLDisplayCapabilities.m | 36 ++--- SmartDeviceLink/SDLECallInfo.m | 12 +- SmartDeviceLink/SDLEmergencyEvent.m | 20 +-- SmartDeviceLink/SDLEncodedSyncPData.m | 7 +- SmartDeviceLink/SDLEncodedSyncPDataResponse.m | 3 + SmartDeviceLink/SDLEndAudioPassThru.m | 3 + SmartDeviceLink/SDLEndAudioPassThruResponse.m | 3 + SmartDeviceLink/SDLEqualizerSettings.m | 12 +- SmartDeviceLink/SDLFuelRange.m | 8 +- SmartDeviceLink/SDLGPSData.m | 72 +++++----- SmartDeviceLink/SDLGenericResponse.m | 3 + SmartDeviceLink/SDLGetAppServiceData.m | 11 +- .../SDLGetAppServiceDataResponse.m | 7 +- SmartDeviceLink/SDLGetCloudAppProperties.m | 7 +- .../SDLGetCloudAppPropertiesResponse.m | 7 +- SmartDeviceLink/SDLGetDTCs.m | 11 +- SmartDeviceLink/SDLGetDTCsResponse.m | 11 +- SmartDeviceLink/SDLGetFile.m | 23 ++-- SmartDeviceLink/SDLGetFileResponse.m | 19 +-- SmartDeviceLink/SDLGetInteriorVehicleData.m | 11 +- .../SDLGetInteriorVehicleDataResponse.m | 11 +- SmartDeviceLink/SDLGetSystemCapability.m | 11 +- .../SDLGetSystemCapabilityResponse.m | 7 +- SmartDeviceLink/SDLGetVehicleData.m | 123 +++++++++--------- SmartDeviceLink/SDLGetVehicleDataResponse.m | 123 +++++++++--------- SmartDeviceLink/SDLGetWayPoints.m | 7 +- SmartDeviceLink/SDLGetWayPointsResponse.m | 7 +- SmartDeviceLink/SDLHMICapabilities.m | 12 +- SmartDeviceLink/SDLHMIPermissions.m | 8 +- .../SDLHMISettingsControlCapabilities.m | 16 +-- SmartDeviceLink/SDLHMISettingsControlData.m | 12 +- SmartDeviceLink/SDLHapticRect.m | 8 +- SmartDeviceLink/SDLHeadLampStatus.m | 12 +- SmartDeviceLink/SDLImage.m | 12 +- SmartDeviceLink/SDLImageField.m | 12 +- SmartDeviceLink/SDLImageResolution.m | 8 +- SmartDeviceLink/SDLKeyboardProperties.m | 20 +-- SmartDeviceLink/SDLLightCapabilities.m | 16 +-- SmartDeviceLink/SDLLightControlCapabilities.m | 8 +- SmartDeviceLink/SDLLightControlData.m | 4 +- SmartDeviceLink/SDLLightState.m | 16 +-- SmartDeviceLink/SDLListFiles.m | 3 + SmartDeviceLink/SDLListFilesResponse.m | 11 +- SmartDeviceLink/SDLLocationCoordinate.m | 8 +- SmartDeviceLink/SDLLocationDetails.m | 28 ++-- SmartDeviceLink/SDLMassageCushionFirmness.m | 8 +- SmartDeviceLink/SDLMassageModeData.m | 8 +- SmartDeviceLink/SDLMediaServiceData.m | 48 +++---- SmartDeviceLink/SDLMenuParams.m | 12 +- SmartDeviceLink/SDLMetadataTags.m | 16 +-- SmartDeviceLink/SDLModuleData.m | 28 ++-- SmartDeviceLink/SDLMyKey.m | 4 +- SmartDeviceLink/SDLNavigationCapability.m | 8 +- SmartDeviceLink/SDLNavigationInstruction.m | 32 ++--- SmartDeviceLink/SDLNavigationServiceData.m | 36 ++--- .../SDLNavigationServiceManifest.m | 4 +- SmartDeviceLink/SDLOasisAddress.m | 36 ++--- .../SDLOnAppInterfaceUnregistered.m | 7 +- SmartDeviceLink/SDLOnAppServiceData.m | 7 +- SmartDeviceLink/SDLOnAudioPassThru.m | 3 + SmartDeviceLink/SDLOnButtonEvent.m | 15 ++- SmartDeviceLink/SDLOnButtonPress.m | 15 ++- SmartDeviceLink/SDLOnCommand.m | 11 +- SmartDeviceLink/SDLOnDriverDistraction.m | 7 +- SmartDeviceLink/SDLOnEncodedSyncPData.m | 15 ++- SmartDeviceLink/SDLOnHMIStatus.m | 19 +-- SmartDeviceLink/SDLOnHashChange.m | 7 +- SmartDeviceLink/SDLOnInteriorVehicleData.m | 7 +- SmartDeviceLink/SDLOnKeyboardInput.m | 11 +- SmartDeviceLink/SDLOnLanguageChange.m | 11 +- SmartDeviceLink/SDLOnLockScreenStatus.m | 19 +-- SmartDeviceLink/SDLOnPermissionsChange.m | 7 +- SmartDeviceLink/SDLOnRCStatus.m | 15 ++- SmartDeviceLink/SDLOnSyncPData.m | 11 +- .../SDLOnSystemCapabilityUpdated.m | 7 +- SmartDeviceLink/SDLOnSystemRequest.m | 31 +++-- SmartDeviceLink/SDLOnTBTClientState.m | 7 +- SmartDeviceLink/SDLOnTouchEvent.m | 11 +- SmartDeviceLink/SDLOnVehicleData.m | 123 +++++++++--------- SmartDeviceLink/SDLOnWayPointChange.m | 7 +- SmartDeviceLink/SDLParameterPermissions.m | 8 +- .../SDLPerformAppServiceInteraction.m | 19 +-- .../SDLPerformAppServiceInteractionResponse.m | 7 +- SmartDeviceLink/SDLPerformAudioPassThru.m | 35 ++--- .../SDLPerformAudioPassThruResponse.m | 3 + SmartDeviceLink/SDLPerformInteraction.m | 39 +++--- .../SDLPerformInteractionResponse.m | 15 ++- SmartDeviceLink/SDLPermissionItem.m | 12 +- SmartDeviceLink/SDLPhoneCapability.m | 4 +- SmartDeviceLink/SDLPresetBankCapabilities.m | 4 +- SmartDeviceLink/SDLProtocol.m | 8 +- SmartDeviceLink/SDLProxy.m | 26 ++-- SmartDeviceLink/SDLPublishAppService.m | 7 +- .../SDLPublishAppServiceResponse.m | 7 +- SmartDeviceLink/SDLPutFile.m | 31 +++-- SmartDeviceLink/SDLPutFileResponse.m | 7 +- SmartDeviceLink/SDLRDSData.m | 32 ++--- SmartDeviceLink/SDLRGBColor.m | 12 +- SmartDeviceLink/SDLRPCMessage.h | 29 ++--- SmartDeviceLink/SDLRPCMessage.m | 77 ++++++----- SmartDeviceLink/SDLRPCNotification.m | 18 ++- SmartDeviceLink/SDLRPCRequest.m | 10 +- SmartDeviceLink/SDLRPCResponse.m | 34 +++-- SmartDeviceLink/SDLRPCStruct.h | 17 +-- SmartDeviceLink/SDLRPCStruct.m | 42 +++--- SmartDeviceLink/SDLRadioControlCapabilities.m | 52 ++++---- SmartDeviceLink/SDLRadioControlData.m | 48 +++---- SmartDeviceLink/SDLReadDID.m | 11 +- SmartDeviceLink/SDLReadDIDResponse.m | 7 +- SmartDeviceLink/SDLRectangle.m | 16 +-- SmartDeviceLink/SDLRegisterAppInterface.m | 67 +++++----- .../SDLRegisterAppInterfaceResponse.m | 79 +++++------ .../SDLRemoteControlCapabilities.m | 28 ++-- SmartDeviceLink/SDLResetGlobalProperties.m | 7 +- .../SDLResetGlobalPropertiesResponse.m | 3 + SmartDeviceLink/SDLSISData.m | 20 +-- SmartDeviceLink/SDLScreenParams.m | 8 +- SmartDeviceLink/SDLScrollableMessage.m | 15 ++- .../SDLScrollableMessageResponse.m | 3 + SmartDeviceLink/SDLSeatControlCapabilities.m | 64 ++++----- SmartDeviceLink/SDLSeatControlData.m | 64 ++++----- SmartDeviceLink/SDLSeatMemoryAction.m | 12 +- SmartDeviceLink/SDLSendHapticData.m | 7 +- SmartDeviceLink/SDLSendHapticDataResponse.m | 3 + SmartDeviceLink/SDLSendLocation.m | 43 +++--- SmartDeviceLink/SDLSendLocationResponse.m | 3 + SmartDeviceLink/SDLSetAppIcon.m | 7 +- SmartDeviceLink/SDLSetAppIconResponse.m | 3 + SmartDeviceLink/SDLSetCloudAppProperties.m | 7 +- .../SDLSetCloudAppPropertiesResponse.m | 3 + SmartDeviceLink/SDLSetDisplayLayout.m | 15 ++- SmartDeviceLink/SDLSetDisplayLayoutResponse.m | 19 +-- SmartDeviceLink/SDLSetGlobalProperties.m | 31 +++-- .../SDLSetGlobalPropertiesResponse.m | 3 + SmartDeviceLink/SDLSetInteriorVehicleData.m | 7 +- .../SDLSetInteriorVehicleDataResponse.m | 7 +- SmartDeviceLink/SDLSetMediaClockTimer.m | 19 +-- .../SDLSetMediaClockTimerResponse.m | 3 + SmartDeviceLink/SDLShow.m | 55 ++++---- SmartDeviceLink/SDLShowConstantTBT.m | 47 +++---- SmartDeviceLink/SDLShowConstantTBTResponse.m | 3 + SmartDeviceLink/SDLShowResponse.m | 3 + SmartDeviceLink/SDLSingleTireStatus.m | 12 +- SmartDeviceLink/SDLSlider.m | 23 ++-- SmartDeviceLink/SDLSliderResponse.m | 7 +- SmartDeviceLink/SDLSoftButton.m | 24 ++-- SmartDeviceLink/SDLSoftButtonCapabilities.m | 16 +-- SmartDeviceLink/SDLSpeak.m | 7 +- SmartDeviceLink/SDLSpeakResponse.m | 3 + SmartDeviceLink/SDLStartTime.m | 12 +- SmartDeviceLink/SDLStationIDNumber.m | 8 +- SmartDeviceLink/SDLSubscribeButton.m | 7 +- SmartDeviceLink/SDLSubscribeButtonResponse.m | 3 + SmartDeviceLink/SDLSubscribeVehicleData.m | 119 ++++++++--------- .../SDLSubscribeVehicleDataResponse.m | 119 ++++++++--------- SmartDeviceLink/SDLSubscribeWayPoints.m | 3 + .../SDLSubscribeWayPointsResponse.m | 3 + SmartDeviceLink/SDLSyncMsgVersion.m | 12 +- SmartDeviceLink/SDLSyncPData.m | 3 + SmartDeviceLink/SDLSyncPDataResponse.m | 3 + SmartDeviceLink/SDLSystemCapability.m | 24 ++-- SmartDeviceLink/SDLSystemRequest.m | 15 ++- SmartDeviceLink/SDLSystemRequestResponse.m | 3 + SmartDeviceLink/SDLTTSChunk.m | 8 +- SmartDeviceLink/SDLTemperature.m | 8 +- SmartDeviceLink/SDLTemplateColorScheme.m | 12 +- SmartDeviceLink/SDLTextField.m | 16 +-- SmartDeviceLink/SDLTireStatus.m | 28 ++-- SmartDeviceLink/SDLTouchCoord.m | 8 +- SmartDeviceLink/SDLTouchEvent.m | 12 +- SmartDeviceLink/SDLTouchEventCapabilities.m | 12 +- SmartDeviceLink/SDLTurn.m | 8 +- SmartDeviceLink/SDLUnregisterAppInterface.m | 3 + .../SDLUnregisterAppInterfaceResponse.m | 3 + SmartDeviceLink/SDLUnsubscribeButton.m | 7 +- .../SDLUnsubscribeButtonResponse.m | 3 + SmartDeviceLink/SDLUnsubscribeVehicleData.m | 119 ++++++++--------- .../SDLUnsubscribeVehicleDataResponse.m | 119 ++++++++--------- SmartDeviceLink/SDLUnsubscribeWayPoints.m | 3 + .../SDLUnsubscribeWayPointsResponse.m | 3 + SmartDeviceLink/SDLUpdateTurnList.m | 11 +- SmartDeviceLink/SDLUpdateTurnListResponse.m | 3 + SmartDeviceLink/SDLVehicleDataResult.m | 8 +- SmartDeviceLink/SDLVehicleType.m | 16 +-- SmartDeviceLink/SDLVideoStreamingCapability.m | 16 +-- SmartDeviceLink/SDLVideoStreamingFormat.m | 8 +- SmartDeviceLink/SDLVrHelpItem.m | 12 +- SmartDeviceLink/SDLWeatherAlert.m | 24 ++-- SmartDeviceLink/SDLWeatherData.m | 88 ++++++------- SmartDeviceLink/SDLWeatherServiceData.m | 24 ++-- SmartDeviceLink/SDLWeatherServiceManifest.m | 20 +-- 239 files changed, 2502 insertions(+), 2053 deletions(-) diff --git a/SmartDeviceLink/SDLAddCommand.m b/SmartDeviceLink/SDLAddCommand.m index 074db8846..0613f3193 100644 --- a/SmartDeviceLink/SDLAddCommand.m +++ b/SmartDeviceLink/SDLAddCommand.m @@ -14,11 +14,14 @@ @implementation SDLAddCommand +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAddCommand]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithHandler:(nullable SDLRPCCommandNotificationHandler)handler { self = [self init]; @@ -103,36 +106,36 @@ - (instancetype)initWithId:(UInt32)commandId vrCommands:(nullable NSArray *)cmdID { - [parameters sdl_setObject:cmdID forName:SDLRPCParameterNameCommandId]; + [self.parameters sdl_setObject:cmdID forName:SDLRPCParameterNameCommandId]; } - (NSNumber *)cmdID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameCommandId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCommandId ofClass:NSNumber.class error:&error]; } - (void)setMenuParams:(nullable SDLMenuParams *)menuParams { - [parameters sdl_setObject:menuParams forName:SDLRPCParameterNameMenuParams]; + [self.parameters sdl_setObject:menuParams forName:SDLRPCParameterNameMenuParams]; } - (nullable SDLMenuParams *)menuParams { - return [parameters sdl_objectForName:SDLRPCParameterNameMenuParams ofClass:SDLMenuParams.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuParams ofClass:SDLMenuParams.class error:nil]; } - (void)setVrCommands:(nullable NSArray *)vrCommands { - [parameters sdl_setObject:vrCommands forName:SDLRPCParameterNameVRCommands]; + [self.parameters sdl_setObject:vrCommands forName:SDLRPCParameterNameVRCommands]; } - (nullable NSArray *)vrCommands { - return [parameters sdl_objectsForName:SDLRPCParameterNameVRCommands ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameVRCommands ofClass:NSString.class error:nil]; } - (void)setCmdIcon:(nullable SDLImage *)cmdIcon { - [parameters sdl_setObject:cmdIcon forName:SDLRPCParameterNameCommandIcon]; + [self.parameters sdl_setObject:cmdIcon forName:SDLRPCParameterNameCommandIcon]; } - (nullable SDLImage *)cmdIcon { - return [parameters sdl_objectForName:SDLRPCParameterNameCommandIcon ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCommandIcon ofClass:SDLImage.class error:nil]; } -(id)copyWithZone:(nullable NSZone *)zone { diff --git a/SmartDeviceLink/SDLAddCommandResponse.m b/SmartDeviceLink/SDLAddCommandResponse.m index 2caf3c6e7..1906f7f64 100644 --- a/SmartDeviceLink/SDLAddCommandResponse.m +++ b/SmartDeviceLink/SDLAddCommandResponse.m @@ -10,11 +10,14 @@ @implementation SDLAddCommandResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAddCommand]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLAddSubMenu.m b/SmartDeviceLink/SDLAddSubMenu.m index 3a79563a4..48ea43c8a 100644 --- a/SmartDeviceLink/SDLAddSubMenu.m +++ b/SmartDeviceLink/SDLAddSubMenu.m @@ -11,11 +11,14 @@ @implementation SDLAddSubMenu +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAddSubMenu]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName menuIcon:(nullable SDLImage *)icon position:(UInt8)position { self = [self initWithId:menuId menuName:menuName]; @@ -44,37 +47,37 @@ - (instancetype)initWithId:(UInt32)menuId menuName:(NSString *)menuName { } - (void)setMenuID:(NSNumber *)menuID { - [parameters sdl_setObject:menuID forName:SDLRPCParameterNameMenuId]; + [self.parameters sdl_setObject:menuID forName:SDLRPCParameterNameMenuId]; } - (NSNumber *)menuID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameMenuId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuId ofClass:NSNumber.class error:&error]; } - (void)setPosition:(nullable NSNumber *)position { - [parameters sdl_setObject:position forName:SDLRPCParameterNamePosition]; + [self.parameters sdl_setObject:position forName:SDLRPCParameterNamePosition]; } - (nullable NSNumber *)position { - return [parameters sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:nil]; } - (void)setMenuName:(NSString *)menuName { - [parameters sdl_setObject:menuName forName:SDLRPCParameterNameMenuName]; + [self.parameters sdl_setObject:menuName forName:SDLRPCParameterNameMenuName]; } - (NSString *)menuName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:&error]; } - (void)setMenuIcon:(nullable SDLImage *)menuIcon { - [parameters sdl_setObject:menuIcon forName:SDLRPCParameterNameMenuIcon]; + [self.parameters sdl_setObject:menuIcon forName:SDLRPCParameterNameMenuIcon]; } - (nullable SDLImage *)menuIcon { - return [parameters sdl_objectForName:SDLRPCParameterNameMenuIcon ofClass:[SDLImage class] error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuIcon ofClass:[SDLImage class] error:nil]; } @end diff --git a/SmartDeviceLink/SDLAddSubMenuResponse.m b/SmartDeviceLink/SDLAddSubMenuResponse.m index 78376e491..e47fe724b 100644 --- a/SmartDeviceLink/SDLAddSubMenuResponse.m +++ b/SmartDeviceLink/SDLAddSubMenuResponse.m @@ -10,11 +10,14 @@ @implementation SDLAddSubMenuResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAddSubMenu]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLAirbagStatus.m b/SmartDeviceLink/SDLAirbagStatus.m index a13f525f8..650a2c5ba 100644 --- a/SmartDeviceLink/SDLAirbagStatus.m +++ b/SmartDeviceLink/SDLAirbagStatus.m @@ -10,74 +10,74 @@ @implementation SDLAirbagStatus - (void)setDriverAirbagDeployed:(SDLVehicleDataEventStatus)driverAirbagDeployed { - [store sdl_setObject:driverAirbagDeployed forName:SDLRPCParameterNameDriverAirbagDeployed]; + [self.store sdl_setObject:driverAirbagDeployed forName:SDLRPCParameterNameDriverAirbagDeployed]; } - (SDLVehicleDataEventStatus)driverAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDriverAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDriverAirbagDeployed error:&error]; } - (void)setDriverSideAirbagDeployed:(SDLVehicleDataEventStatus)driverSideAirbagDeployed { - [store sdl_setObject:driverSideAirbagDeployed forName:SDLRPCParameterNameDriverSideAirbagDeployed]; + [self.store sdl_setObject:driverSideAirbagDeployed forName:SDLRPCParameterNameDriverSideAirbagDeployed]; } - (SDLVehicleDataEventStatus)driverSideAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDriverSideAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDriverSideAirbagDeployed error:&error]; } - (void)setDriverCurtainAirbagDeployed:(SDLVehicleDataEventStatus)driverCurtainAirbagDeployed { - [store sdl_setObject:driverCurtainAirbagDeployed forName:SDLRPCParameterNameDriverCurtainAirbagDeployed]; + [self.store sdl_setObject:driverCurtainAirbagDeployed forName:SDLRPCParameterNameDriverCurtainAirbagDeployed]; } - (SDLVehicleDataEventStatus)driverCurtainAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDriverCurtainAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDriverCurtainAirbagDeployed error:&error]; } - (void)setPassengerAirbagDeployed:(SDLVehicleDataEventStatus)passengerAirbagDeployed { - [store sdl_setObject:passengerAirbagDeployed forName:SDLRPCParameterNamePassengerAirbagDeployed];} + [self.store sdl_setObject:passengerAirbagDeployed forName:SDLRPCParameterNamePassengerAirbagDeployed];} - (SDLVehicleDataEventStatus)passengerAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerAirbagDeployed error:&error]; } - (void)setPassengerCurtainAirbagDeployed:(SDLVehicleDataEventStatus)passengerCurtainAirbagDeployed { - [store sdl_setObject:passengerCurtainAirbagDeployed forName:SDLRPCParameterNamePassengerCurtainAirbagDeployed]; + [self.store sdl_setObject:passengerCurtainAirbagDeployed forName:SDLRPCParameterNamePassengerCurtainAirbagDeployed]; } - (SDLVehicleDataEventStatus)passengerCurtainAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerCurtainAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerCurtainAirbagDeployed error:&error]; } - (void)setDriverKneeAirbagDeployed:(SDLVehicleDataEventStatus)driverKneeAirbagDeployed { - [store sdl_setObject:driverKneeAirbagDeployed forName:SDLRPCParameterNameDriverKneeAirbagDeployed]; + [self.store sdl_setObject:driverKneeAirbagDeployed forName:SDLRPCParameterNameDriverKneeAirbagDeployed]; } - (SDLVehicleDataEventStatus)driverKneeAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDriverKneeAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDriverKneeAirbagDeployed error:&error]; } - (void)setPassengerSideAirbagDeployed:(SDLVehicleDataEventStatus)passengerSideAirbagDeployed { - [store sdl_setObject:passengerSideAirbagDeployed forName:SDLRPCParameterNamePassengerSideAirbagDeployed]; + [self.store sdl_setObject:passengerSideAirbagDeployed forName:SDLRPCParameterNamePassengerSideAirbagDeployed]; } - (SDLVehicleDataEventStatus)passengerSideAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerSideAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerSideAirbagDeployed error:&error]; } - (void)setPassengerKneeAirbagDeployed:(SDLVehicleDataEventStatus)passengerKneeAirbagDeployed { - [store sdl_setObject:passengerKneeAirbagDeployed forName:SDLRPCParameterNamePassengerKneeAirbagDeployed]; + [self.store sdl_setObject:passengerKneeAirbagDeployed forName:SDLRPCParameterNamePassengerKneeAirbagDeployed]; } - (SDLVehicleDataEventStatus)passengerKneeAirbagDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerKneeAirbagDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerKneeAirbagDeployed error:&error]; } @end diff --git a/SmartDeviceLink/SDLAlert.m b/SmartDeviceLink/SDLAlert.m index 7c9fa67f5..120ed6fe7 100644 --- a/SmartDeviceLink/SDLAlert.m +++ b/SmartDeviceLink/SDLAlert.m @@ -14,11 +14,14 @@ @implementation SDLAlert +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAlert]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAlertText1:(nullable NSString *)alertText1 alertText2:(nullable NSString *)alertText2 alertText3:(nullable NSString *)alertText3 { return [self initWithAlertText1:alertText1 alertText2:alertText2 alertText3:alertText3 duration:SDLDefaultDuration]; @@ -75,67 +78,67 @@ - (instancetype)initWithTTSChunks:(nullable NSArray *)ttsChunks a } - (void)setAlertText1:(nullable NSString *)alertText1 { - [parameters sdl_setObject:alertText1 forName:SDLRPCParameterNameAlertText1]; + [self.parameters sdl_setObject:alertText1 forName:SDLRPCParameterNameAlertText1]; } - (nullable NSString *)alertText1 { - return [parameters sdl_objectForName:SDLRPCParameterNameAlertText1 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAlertText1 ofClass:NSString.class error:nil]; } - (void)setAlertText2:(nullable NSString *)alertText2 { - [parameters sdl_setObject:alertText2 forName:SDLRPCParameterNameAlertText2]; + [self.parameters sdl_setObject:alertText2 forName:SDLRPCParameterNameAlertText2]; } - (nullable NSString *)alertText2 { - return [parameters sdl_objectForName:SDLRPCParameterNameAlertText2 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAlertText2 ofClass:NSString.class error:nil]; } - (void)setAlertText3:(nullable NSString *)alertText3 { - [parameters sdl_setObject:alertText3 forName:SDLRPCParameterNameAlertText3]; + [self.parameters sdl_setObject:alertText3 forName:SDLRPCParameterNameAlertText3]; } - (nullable NSString *)alertText3 { - return [parameters sdl_objectForName:SDLRPCParameterNameAlertText3 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAlertText3 ofClass:NSString.class error:nil]; } - (void)setTtsChunks:(nullable NSArray *)ttsChunks { - [parameters sdl_setObject:ttsChunks forName:SDLRPCParameterNameTTSChunks]; + [self.parameters sdl_setObject:ttsChunks forName:SDLRPCParameterNameTTSChunks]; } - (nullable NSArray *)ttsChunks { - return [parameters sdl_objectsForName:SDLRPCParameterNameTTSChunks ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTTSChunks ofClass:SDLTTSChunk.class error:nil]; } - (void)setDuration:(nullable NSNumber *)duration { - [parameters sdl_setObject:duration forName:SDLRPCParameterNameDuration]; + [self.parameters sdl_setObject:duration forName:SDLRPCParameterNameDuration]; } - (nullable NSNumber *)duration { - return [parameters sdl_objectForName:SDLRPCParameterNameDuration ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDuration ofClass:NSNumber.class error:nil]; } - (void)setPlayTone:(nullable NSNumber *)playTone { - [parameters sdl_setObject:playTone forName:SDLRPCParameterNamePlayTone]; + [self.parameters sdl_setObject:playTone forName:SDLRPCParameterNamePlayTone]; } - (nullable NSNumber *)playTone { - return [parameters sdl_objectForName:SDLRPCParameterNamePlayTone ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePlayTone ofClass:NSNumber.class error:nil]; } - (void)setProgressIndicator:(nullable NSNumber *)progressIndicator { - [parameters sdl_setObject:progressIndicator forName:SDLRPCParameterNameProgressIndicator]; + [self.parameters sdl_setObject:progressIndicator forName:SDLRPCParameterNameProgressIndicator]; } - (nullable NSNumber *)progressIndicator { - return [parameters sdl_objectForName:SDLRPCParameterNameProgressIndicator ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameProgressIndicator ofClass:NSNumber.class error:nil]; } - (void)setSoftButtons:(nullable NSArray *)softButtons { - [parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; + [self.parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; } - (nullable NSArray *)softButtons { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAlertManeuver.m b/SmartDeviceLink/SDLAlertManeuver.m index 7eb01682a..c92ee6bd6 100644 --- a/SmartDeviceLink/SDLAlertManeuver.m +++ b/SmartDeviceLink/SDLAlertManeuver.m @@ -14,11 +14,14 @@ @implementation SDLAlertManeuver +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAlertManeuver]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithTTS:(nullable NSString *)ttsText softButtons:(nullable NSArray *)softButtons { @@ -39,19 +42,19 @@ - (instancetype)initWithTTSChunks:(nullable NSArray *)ttsChunks s } - (void)setTtsChunks:(nullable NSArray *)ttsChunks { - [parameters sdl_setObject:ttsChunks forName:SDLRPCParameterNameTTSChunks]; + [self.parameters sdl_setObject:ttsChunks forName:SDLRPCParameterNameTTSChunks]; } - (nullable NSArray *)ttsChunks { - return [parameters sdl_objectsForName:SDLRPCParameterNameTTSChunks ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTTSChunks ofClass:SDLTTSChunk.class error:nil]; } - (void)setSoftButtons:(nullable NSArray *)softButtons { - [parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; + [self.parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; } - (nullable NSArray *)softButtons { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAlertManeuverResponse.m b/SmartDeviceLink/SDLAlertManeuverResponse.m index 150678cba..89c0f3331 100644 --- a/SmartDeviceLink/SDLAlertManeuverResponse.m +++ b/SmartDeviceLink/SDLAlertManeuverResponse.m @@ -11,11 +11,14 @@ @implementation SDLAlertManeuverResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAlertManeuver]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLAlertResponse.m b/SmartDeviceLink/SDLAlertResponse.m index a35890723..401b29e76 100644 --- a/SmartDeviceLink/SDLAlertResponse.m +++ b/SmartDeviceLink/SDLAlertResponse.m @@ -11,17 +11,20 @@ @implementation SDLAlertResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameAlert]) { } return self; } +#pragma clang diagnostic pop - (void)setTryAgainTime:(nullable NSNumber *)tryAgainTime { - [parameters sdl_setObject:tryAgainTime forName:SDLRPCParameterNameTryAgainTime];} + [self.parameters sdl_setObject:tryAgainTime forName:SDLRPCParameterNameTryAgainTime];} - (nullable NSNumber *)tryAgainTime { - return [parameters sdl_objectForName:SDLRPCParameterNameTryAgainTime ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTryAgainTime ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAppInfo.m b/SmartDeviceLink/SDLAppInfo.m index 431382f91..1b7ec0150 100644 --- a/SmartDeviceLink/SDLAppInfo.m +++ b/SmartDeviceLink/SDLAppInfo.m @@ -27,30 +27,30 @@ + (instancetype)currentAppInfo { } - (void)setAppDisplayName:(NSString *)appDisplayName { - [store sdl_setObject:appDisplayName forName:SDLRPCParameterNameAppDisplayName]; + [self.store sdl_setObject:appDisplayName forName:SDLRPCParameterNameAppDisplayName]; } - (NSString *)appDisplayName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameAppDisplayName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameAppDisplayName ofClass:NSString.class error:&error]; } - (void)setAppBundleID:(NSString *)appBundleID { - [store sdl_setObject:appBundleID forName:SDLRPCParameterNameAppBundleId]; + [self.store sdl_setObject:appBundleID forName:SDLRPCParameterNameAppBundleId]; } - (NSString *)appBundleID { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameAppBundleId ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameAppBundleId ofClass:NSString.class error:&error]; } - (void)setAppVersion:(NSString *)appVersion { - [store sdl_setObject:appVersion forName:SDLRPCParameterNameAppVersion]; + [self.store sdl_setObject:appVersion forName:SDLRPCParameterNameAppVersion]; } - (NSString *)appVersion { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameAppVersion ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameAppVersion ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLAppServiceCapability.m b/SmartDeviceLink/SDLAppServiceCapability.m index 19e30d607..595540cf4 100644 --- a/SmartDeviceLink/SDLAppServiceCapability.m +++ b/SmartDeviceLink/SDLAppServiceCapability.m @@ -40,20 +40,20 @@ - (instancetype)initWithUpdateReason:(nullable SDLServiceUpdateReason)updateReas } - (void)setUpdateReason:(nullable SDLServiceUpdateReason)updateReason { - [store sdl_setObject:updateReason forName:SDLRPCParameterNameUpdateReason]; + [self.store sdl_setObject:updateReason forName:SDLRPCParameterNameUpdateReason]; } - (nullable SDLServiceUpdateReason)updateReason { - return [store sdl_enumForName:SDLRPCParameterNameUpdateReason error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameUpdateReason error:nil]; } - (void)setUpdatedAppServiceRecord:(SDLAppServiceRecord *)updatedAppServiceRecord { - [store sdl_setObject:updatedAppServiceRecord forName:SDLRPCParameterNameUpdatedAppServiceRecord]; + [self.store sdl_setObject:updatedAppServiceRecord forName:SDLRPCParameterNameUpdatedAppServiceRecord]; } - (SDLAppServiceRecord *)updatedAppServiceRecord { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameUpdatedAppServiceRecord ofClass:SDLAppServiceRecord.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameUpdatedAppServiceRecord ofClass:SDLAppServiceRecord.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLAppServiceData.m b/SmartDeviceLink/SDLAppServiceData.m index 5381211c5..13565a7af 100644 --- a/SmartDeviceLink/SDLAppServiceData.m +++ b/SmartDeviceLink/SDLAppServiceData.m @@ -78,45 +78,45 @@ - (instancetype)initWithAppServiceType:(SDLAppServiceType)serviceType serviceId: } - (void)setServiceType:(NSString *)serviceType { - [store sdl_setObject:serviceType forName:SDLRPCParameterNameServiceType]; + [self.store sdl_setObject:serviceType forName:SDLRPCParameterNameServiceType]; } - (NSString *)serviceType { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServiceType ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceType ofClass:NSString.class error:&error]; } - (void)setServiceId:(NSString *)serviceId { - [store sdl_setObject:serviceId forName:SDLRPCParameterNameServiceID]; + [self.store sdl_setObject:serviceId forName:SDLRPCParameterNameServiceID]; } - (NSString *)serviceId { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServiceID ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceID ofClass:NSString.class error:&error]; } - (void)setWeatherServiceData:(nullable SDLWeatherServiceData *)weatherServiceData { - [store sdl_setObject:weatherServiceData forName:SDLRPCParameterNameWeatherServiceData]; + [self.store sdl_setObject:weatherServiceData forName:SDLRPCParameterNameWeatherServiceData]; } - (nullable SDLWeatherServiceData *)weatherServiceData { - return [store sdl_objectForName:SDLRPCParameterNameWeatherServiceData ofClass:SDLWeatherServiceData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWeatherServiceData ofClass:SDLWeatherServiceData.class error:nil]; } - (void)setMediaServiceData:(nullable SDLMediaServiceData *)mediaServiceData { - [store sdl_setObject:mediaServiceData forName:SDLRPCParameterNameMediaServiceData]; + [self.store sdl_setObject:mediaServiceData forName:SDLRPCParameterNameMediaServiceData]; } - (nullable SDLMediaServiceData *)mediaServiceData { - return [store sdl_objectForName:SDLRPCParameterNameMediaServiceData ofClass:SDLMediaServiceData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMediaServiceData ofClass:SDLMediaServiceData.class error:nil]; } - (void)setNavigationServiceData:(nullable SDLNavigationServiceData *)navigationServiceData { - [store sdl_setObject:navigationServiceData forName:SDLRPCParameterNameNavigationServiceData]; + [self.store sdl_setObject:navigationServiceData forName:SDLRPCParameterNameNavigationServiceData]; } - (nullable SDLNavigationServiceData *)navigationServiceData { - return [store sdl_objectForName:SDLRPCParameterNameNavigationServiceData ofClass:SDLNavigationServiceData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNavigationServiceData ofClass:SDLNavigationServiceData.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAppServiceManifest.m b/SmartDeviceLink/SDLAppServiceManifest.m index ce6c827a7..97afc2e77 100644 --- a/SmartDeviceLink/SDLAppServiceManifest.m +++ b/SmartDeviceLink/SDLAppServiceManifest.m @@ -63,76 +63,76 @@ - (instancetype)initWithServiceName:(nullable NSString *)serviceName serviceType } - (void)setServiceName:(nullable NSString *)serviceName { - [store sdl_setObject:serviceName forName:SDLRPCParameterNameServiceName]; + [self.store sdl_setObject:serviceName forName:SDLRPCParameterNameServiceName]; } - (nullable NSString *)serviceName { - return [store sdl_objectForName:SDLRPCParameterNameServiceName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceName ofClass:NSString.class error:nil]; } - (void)setServiceType:(NSString *)serviceType { - [store sdl_setObject:serviceType forName:SDLRPCParameterNameServiceType]; + [self.store sdl_setObject:serviceType forName:SDLRPCParameterNameServiceType]; } - (NSString *)serviceType { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServiceType ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceType ofClass:NSString.class error:&error]; } - (void)setServiceIcon:(nullable SDLImage *)serviceIcon { - [store sdl_setObject:serviceIcon forName:SDLRPCParameterNameServiceIcon]; + [self.store sdl_setObject:serviceIcon forName:SDLRPCParameterNameServiceIcon]; } - (nullable SDLImage *)serviceIcon { - return [store sdl_objectForName:SDLRPCParameterNameServiceIcon ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceIcon ofClass:SDLImage.class error:nil]; } - (void)setAllowAppConsumers:(nullable NSNumber *)allowAppConsumers { - [store sdl_setObject:allowAppConsumers forName:SDLRPCParameterNameAllowAppConsumers]; + [self.store sdl_setObject:allowAppConsumers forName:SDLRPCParameterNameAllowAppConsumers]; } - (nullable NSNumber *)allowAppConsumers { - return [store sdl_objectForName:SDLRPCParameterNameAllowAppConsumers ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAllowAppConsumers ofClass:NSNumber.class error:nil]; } - (void)setRpcSpecVersion:(nullable SDLSyncMsgVersion *)rpcSpecVersion { - [store sdl_setObject:rpcSpecVersion forName:SDLRPCParameterNameRPCSpecVersion]; + [self.store sdl_setObject:rpcSpecVersion forName:SDLRPCParameterNameRPCSpecVersion]; } - (nullable SDLSyncMsgVersion *)rpcSpecVersion { - return [store sdl_objectForName:SDLRPCParameterNameRPCSpecVersion ofClass:SDLSyncMsgVersion.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRPCSpecVersion ofClass:SDLSyncMsgVersion.class error:nil]; } - (void)setHandledRPCs:(nullable NSArray *> *)handledRPCs { - [store sdl_setObject:handledRPCs forName:SDLRPCParameterNameHandledRPCs]; + [self.store sdl_setObject:handledRPCs forName:SDLRPCParameterNameHandledRPCs]; } - (nullable NSArray *> *)handledRPCs { - return [store sdl_objectsForName:SDLRPCParameterNameHandledRPCs ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameHandledRPCs ofClass:NSNumber.class error:nil]; } - (void)setWeatherServiceManifest:(nullable SDLWeatherServiceManifest *)weatherServiceManifest { - [store sdl_setObject:weatherServiceManifest forName:SDLRPCParameterNameWeatherServiceManifest]; + [self.store sdl_setObject:weatherServiceManifest forName:SDLRPCParameterNameWeatherServiceManifest]; } - (nullable SDLWeatherServiceManifest *)weatherServiceManifest { - return [store sdl_objectForName:SDLRPCParameterNameWeatherServiceManifest ofClass:SDLWeatherServiceManifest.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWeatherServiceManifest ofClass:SDLWeatherServiceManifest.class error:nil]; } - (void)setMediaServiceManifest:(nullable SDLMediaServiceManifest *)mediaServiceManifest { - [store sdl_setObject:mediaServiceManifest forName:SDLRPCParameterNameMediaServiceManifest]; + [self.store sdl_setObject:mediaServiceManifest forName:SDLRPCParameterNameMediaServiceManifest]; } - (nullable SDLMediaServiceManifest *)mediaServiceManifest { - return [store sdl_objectForName:SDLRPCParameterNameMediaServiceManifest ofClass:SDLMediaServiceManifest.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMediaServiceManifest ofClass:SDLMediaServiceManifest.class error:nil]; } - (void)setNavigationServiceManifest:(nullable SDLNavigationServiceManifest *)navigationServiceManifest { - [store sdl_setObject:navigationServiceManifest forName:SDLRPCParameterNameNavigationServiceManifest]; + [self.store sdl_setObject:navigationServiceManifest forName:SDLRPCParameterNameNavigationServiceManifest]; } - (nullable SDLNavigationServiceManifest *)navigationServiceManifest { - return [store sdl_objectForName:SDLRPCParameterNameNavigationServiceManifest ofClass:SDLNavigationServiceManifest.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNavigationServiceManifest ofClass:SDLNavigationServiceManifest.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAppServiceRecord.m b/SmartDeviceLink/SDLAppServiceRecord.m index 5677d6776..72711d0a8 100644 --- a/SmartDeviceLink/SDLAppServiceRecord.m +++ b/SmartDeviceLink/SDLAppServiceRecord.m @@ -31,39 +31,39 @@ - (instancetype)initWithServiceID:(NSString *)serviceID serviceManifest:(SDLAppS } - (void)setServiceID:(NSString *)serviceID { - [store sdl_setObject:serviceID forName:SDLRPCParameterNameServiceID]; + [self.store sdl_setObject:serviceID forName:SDLRPCParameterNameServiceID]; } - (NSString *)serviceID { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServiceID ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceID ofClass:NSString.class error:&error]; } - (void)setServiceManifest:(SDLAppServiceManifest *)serviceManifest { - [store sdl_setObject:serviceManifest forName:SDLRPCParameterNameServiceManifest]; + [self.store sdl_setObject:serviceManifest forName:SDLRPCParameterNameServiceManifest]; } - (SDLAppServiceManifest *)serviceManifest { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServiceManifest ofClass:SDLAppServiceManifest.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceManifest ofClass:SDLAppServiceManifest.class error:&error]; } - (void)setServicePublished:(NSNumber *)servicePublished { - [store sdl_setObject:servicePublished forName:SDLRPCParameterNameServicePublished]; + [self.store sdl_setObject:servicePublished forName:SDLRPCParameterNameServicePublished]; } - (NSNumber *)servicePublished { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServicePublished ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServicePublished ofClass:NSNumber.class error:&error]; } - (void)setServiceActive:(NSNumber *)serviceActive { - [store sdl_setObject:serviceActive forName:SDLRPCParameterNameServiceActive]; + [self.store sdl_setObject:serviceActive forName:SDLRPCParameterNameServiceActive]; } - (NSNumber *)serviceActive { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameServiceActive ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameServiceActive ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLAppServicesCapabilities.m b/SmartDeviceLink/SDLAppServicesCapabilities.m index f0d032c54..a31b5d400 100644 --- a/SmartDeviceLink/SDLAppServicesCapabilities.m +++ b/SmartDeviceLink/SDLAppServicesCapabilities.m @@ -28,11 +28,11 @@ - (instancetype)initWithAppServices:(nullable NSArray } - (void)setAppServices:(nullable NSArray *)appServices { - [store sdl_setObject:appServices forName:SDLRPCParameterNameAppServices]; + [self.store sdl_setObject:appServices forName:SDLRPCParameterNameAppServices]; } - (nullable NSArray *)appServices { - return [store sdl_objectsForName:SDLRPCParameterNameAppServices ofClass:SDLAppServiceCapability.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameAppServices ofClass:SDLAppServiceCapability.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAudioControlCapabilities.m b/SmartDeviceLink/SDLAudioControlCapabilities.m index 9d22c4d94..ad204cc62 100644 --- a/SmartDeviceLink/SDLAudioControlCapabilities.m +++ b/SmartDeviceLink/SDLAudioControlCapabilities.m @@ -35,52 +35,52 @@ - (instancetype)initWithModuleName:(NSString *)name sourceAvailable:(nullable NS } - (void)setModuleName:(NSString *)moduleName { - [store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; + [self.store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; } - (NSString *)moduleName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; } - (void)setSourceAvailable:(nullable NSNumber *)sourceAvailable { - [store sdl_setObject:sourceAvailable forName:SDLRPCParameterNameSourceAvailable]; + [self.store sdl_setObject:sourceAvailable forName:SDLRPCParameterNameSourceAvailable]; } - (nullable NSNumber *)sourceAvailable { - return [store sdl_objectForName:SDLRPCParameterNameSourceAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSourceAvailable ofClass:NSNumber.class error:nil]; } - (void)setKeepContextAvailable:(nullable NSNumber *)keepContextAvailable { - [store sdl_setObject:keepContextAvailable forName:SDLRPCParameterNameKeepContextAvailable]; + [self.store sdl_setObject:keepContextAvailable forName:SDLRPCParameterNameKeepContextAvailable]; } - (nullable NSNumber *)keepContextAvailable { - return [store sdl_objectForName:SDLRPCParameterNameKeepContextAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameKeepContextAvailable ofClass:NSNumber.class error:nil]; } - (void)setVolumeAvailable:(nullable NSNumber *)volumeAvailable { - [store sdl_setObject:volumeAvailable forName:SDLRPCParameterNameVolumeAvailable]; + [self.store sdl_setObject:volumeAvailable forName:SDLRPCParameterNameVolumeAvailable]; } - (nullable NSNumber *)volumeAvailable { - return [store sdl_objectForName:SDLRPCParameterNameVolumeAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVolumeAvailable ofClass:NSNumber.class error:nil]; } - (void)setEqualizerAvailable:(nullable NSNumber *)equalizerAvailable { - [store sdl_setObject:equalizerAvailable forName:SDLRPCParameterNameEqualizerAvailable]; + [self.store sdl_setObject:equalizerAvailable forName:SDLRPCParameterNameEqualizerAvailable]; } - (nullable NSNumber *)equalizerAvailable { - return [store sdl_objectForName:SDLRPCParameterNameEqualizerAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameEqualizerAvailable ofClass:NSNumber.class error:nil]; } - (void)setEqualizerMaxChannelId:(nullable NSNumber *)equalizerMaxChannelId { - [store sdl_setObject:equalizerMaxChannelId forName:SDLRPCParameterNameEqualizerMaxChannelId]; + [self.store sdl_setObject:equalizerMaxChannelId forName:SDLRPCParameterNameEqualizerMaxChannelId]; } - (nullable NSNumber *)equalizerMaxChannelId { - return [store sdl_objectForName:SDLRPCParameterNameEqualizerMaxChannelId ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameEqualizerMaxChannelId ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAudioControlData.m b/SmartDeviceLink/SDLAudioControlData.m index b205aee71..67296c9ae 100644 --- a/SmartDeviceLink/SDLAudioControlData.m +++ b/SmartDeviceLink/SDLAudioControlData.m @@ -25,36 +25,36 @@ - (instancetype)initWithSource:(nullable SDLPrimaryAudioSource)source keepContex } - (void)setSource:(nullable SDLPrimaryAudioSource)source { - [store sdl_setObject:source forName:SDLRPCParameterNameSource]; + [self.store sdl_setObject:source forName:SDLRPCParameterNameSource]; } - (nullable SDLPrimaryAudioSource)source { - return [store sdl_enumForName:SDLRPCParameterNameSource error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameSource error:nil]; } - (void)setKeepContext:(nullable NSNumber *)keepContext { - [store sdl_setObject:keepContext forName:SDLRPCParameterNameKeepContext]; + [self.store sdl_setObject:keepContext forName:SDLRPCParameterNameKeepContext]; } - (nullable NSNumber *)keepContext { - return [store sdl_objectForName:SDLRPCParameterNameKeepContext ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameKeepContext ofClass:NSNumber.class error:nil]; } - (void)setVolume:(nullable NSNumber *)volume { - [store sdl_setObject:volume forName:SDLRPCParameterNameVolume]; + [self.store sdl_setObject:volume forName:SDLRPCParameterNameVolume]; } - (nullable NSNumber *)volume { - return [store sdl_objectForName:SDLRPCParameterNameVolume ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVolume ofClass:NSNumber.class error:nil]; } - (void)setEqualizerSettings:(nullable NSArray *)equalizerSettings { - [store sdl_setObject:equalizerSettings forName:SDLRPCParameterNameEqualizerSettings]; + [self.store sdl_setObject:equalizerSettings forName:SDLRPCParameterNameEqualizerSettings]; } - (nullable NSArray *)equalizerSettings { - return [store sdl_objectsForName:SDLRPCParameterNameEqualizerSettings ofClass:SDLEqualizerSettings.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameEqualizerSettings ofClass:SDLEqualizerSettings.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLAudioPassThruCapabilities.m b/SmartDeviceLink/SDLAudioPassThruCapabilities.m index 51c1e64bb..c84263a24 100644 --- a/SmartDeviceLink/SDLAudioPassThruCapabilities.m +++ b/SmartDeviceLink/SDLAudioPassThruCapabilities.m @@ -12,30 +12,30 @@ @implementation SDLAudioPassThruCapabilities - (void)setSamplingRate:(SDLSamplingRate)samplingRate { - [store sdl_setObject:samplingRate forName:SDLRPCParameterNameSamplingRate]; + [self.store sdl_setObject:samplingRate forName:SDLRPCParameterNameSamplingRate]; } - (SDLSamplingRate)samplingRate { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameSamplingRate error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameSamplingRate error:&error]; } - (void)setBitsPerSample:(SDLBitsPerSample)bitsPerSample { - [store sdl_setObject:bitsPerSample forName:SDLRPCParameterNameBitsPerSample]; + [self.store sdl_setObject:bitsPerSample forName:SDLRPCParameterNameBitsPerSample]; } - (SDLBitsPerSample)bitsPerSample { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameBitsPerSample error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameBitsPerSample error:&error]; } - (void)setAudioType:(SDLAudioType)audioType { - [store sdl_setObject:audioType forName:SDLRPCParameterNameAudioType]; + [self.store sdl_setObject:audioType forName:SDLRPCParameterNameAudioType]; } - (SDLAudioType)audioType { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameAudioType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameAudioType error:&error]; } @end diff --git a/SmartDeviceLink/SDLBeltStatus.m b/SmartDeviceLink/SDLBeltStatus.m index 1432b9453..89a5271e3 100644 --- a/SmartDeviceLink/SDLBeltStatus.m +++ b/SmartDeviceLink/SDLBeltStatus.m @@ -12,138 +12,138 @@ @implementation SDLBeltStatus - (void)setDriverBeltDeployed:(SDLVehicleDataEventStatus)driverBeltDeployed { - [store sdl_setObject:driverBeltDeployed forName:SDLRPCParameterNameDriverBeltDeployed]; + [self.store sdl_setObject:driverBeltDeployed forName:SDLRPCParameterNameDriverBeltDeployed]; } - (SDLVehicleDataEventStatus)driverBeltDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDriverBeltDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDriverBeltDeployed error:&error]; } - (void)setPassengerBeltDeployed:(SDLVehicleDataEventStatus)passengerBeltDeployed { - [store sdl_setObject:passengerBeltDeployed forName:SDLRPCParameterNamePassengerBeltDeployed]; + [self.store sdl_setObject:passengerBeltDeployed forName:SDLRPCParameterNamePassengerBeltDeployed]; } - (SDLVehicleDataEventStatus)passengerBeltDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerBeltDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerBeltDeployed error:&error]; } - (void)setPassengerBuckleBelted:(SDLVehicleDataEventStatus)passengerBuckleBelted { - [store sdl_setObject:passengerBuckleBelted forName:SDLRPCParameterNamePassengerBuckleBelted]; + [self.store sdl_setObject:passengerBuckleBelted forName:SDLRPCParameterNamePassengerBuckleBelted]; } - (SDLVehicleDataEventStatus)passengerBuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerBuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerBuckleBelted error:&error]; } - (void)setDriverBuckleBelted:(SDLVehicleDataEventStatus)driverBuckleBelted { - [store sdl_setObject:driverBuckleBelted forName:SDLRPCParameterNameDriverBuckleBelted]; + [self.store sdl_setObject:driverBuckleBelted forName:SDLRPCParameterNameDriverBuckleBelted]; } - (SDLVehicleDataEventStatus)driverBuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDriverBuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDriverBuckleBelted error:&error]; } - (void)setLeftRow2BuckleBelted:(SDLVehicleDataEventStatus)leftRow2BuckleBelted { - [store sdl_setObject:leftRow2BuckleBelted forName:SDLRPCParameterNameLeftRow2BuckleBelted]; + [self.store sdl_setObject:leftRow2BuckleBelted forName:SDLRPCParameterNameLeftRow2BuckleBelted]; } - (SDLVehicleDataEventStatus)leftRow2BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameLeftRow2BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameLeftRow2BuckleBelted error:&error]; } - (void)setPassengerChildDetected:(SDLVehicleDataEventStatus)passengerChildDetected { - [store sdl_setObject:passengerChildDetected forName:SDLRPCParameterNamePassengerChildDetected]; + [self.store sdl_setObject:passengerChildDetected forName:SDLRPCParameterNamePassengerChildDetected]; } - (SDLVehicleDataEventStatus)passengerChildDetected { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePassengerChildDetected error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePassengerChildDetected error:&error]; } - (void)setRightRow2BuckleBelted:(SDLVehicleDataEventStatus)rightRow2BuckleBelted { - [store sdl_setObject:rightRow2BuckleBelted forName:SDLRPCParameterNameRightRow2BuckleBelted]; + [self.store sdl_setObject:rightRow2BuckleBelted forName:SDLRPCParameterNameRightRow2BuckleBelted]; } - (SDLVehicleDataEventStatus)rightRow2BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameRightRow2BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameRightRow2BuckleBelted error:&error]; } - (void)setMiddleRow2BuckleBelted:(SDLVehicleDataEventStatus)middleRow2BuckleBelted { - [store sdl_setObject:middleRow2BuckleBelted forName:SDLRPCParameterNameMiddleRow2BuckleBelted]; + [self.store sdl_setObject:middleRow2BuckleBelted forName:SDLRPCParameterNameMiddleRow2BuckleBelted]; } - (SDLVehicleDataEventStatus)middleRow2BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMiddleRow2BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMiddleRow2BuckleBelted error:&error]; } - (void)setMiddleRow3BuckleBelted:(SDLVehicleDataEventStatus)middleRow3BuckleBelted { - [store sdl_setObject:middleRow3BuckleBelted forName:SDLRPCParameterNameMiddleRow3BuckleBelted]; + [self.store sdl_setObject:middleRow3BuckleBelted forName:SDLRPCParameterNameMiddleRow3BuckleBelted]; } - (SDLVehicleDataEventStatus)middleRow3BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMiddleRow3BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMiddleRow3BuckleBelted error:&error]; } - (void)setLeftRow3BuckleBelted:(SDLVehicleDataEventStatus)leftRow3BuckleBelted { - [store sdl_setObject:leftRow3BuckleBelted forName:SDLRPCParameterNameLeftRow3BuckleBelted]; + [self.store sdl_setObject:leftRow3BuckleBelted forName:SDLRPCParameterNameLeftRow3BuckleBelted]; } - (SDLVehicleDataEventStatus)leftRow3BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameLeftRow3BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameLeftRow3BuckleBelted error:&error]; } - (void)setRightRow3BuckleBelted:(SDLVehicleDataEventStatus)rightRow3BuckleBelted { - [store sdl_setObject:rightRow3BuckleBelted forName:SDLRPCParameterNameRightRow3BuckleBelted]; + [self.store sdl_setObject:rightRow3BuckleBelted forName:SDLRPCParameterNameRightRow3BuckleBelted]; } - (SDLVehicleDataEventStatus)rightRow3BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameRightRow3BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameRightRow3BuckleBelted error:&error]; } - (void)setLeftRearInflatableBelted:(SDLVehicleDataEventStatus)leftRearInflatableBelted { - [store sdl_setObject:leftRearInflatableBelted forName:SDLRPCParameterNameLeftRearInflatableBelted]; + [self.store sdl_setObject:leftRearInflatableBelted forName:SDLRPCParameterNameLeftRearInflatableBelted]; } - (SDLVehicleDataEventStatus)leftRearInflatableBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameLeftRearInflatableBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameLeftRearInflatableBelted error:&error]; } - (void)setRightRearInflatableBelted:(SDLVehicleDataEventStatus)rightRearInflatableBelted { - [store sdl_setObject:rightRearInflatableBelted forName:SDLRPCParameterNameRightRearInflatableBelted]; + [self.store sdl_setObject:rightRearInflatableBelted forName:SDLRPCParameterNameRightRearInflatableBelted]; } - (SDLVehicleDataEventStatus)rightRearInflatableBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameRightRearInflatableBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameRightRearInflatableBelted error:&error]; } - (void)setMiddleRow1BeltDeployed:(SDLVehicleDataEventStatus)middleRow1BeltDeployed { - [store sdl_setObject:middleRow1BeltDeployed forName:SDLRPCParameterNameMiddleRow1BeltDeployed]; + [self.store sdl_setObject:middleRow1BeltDeployed forName:SDLRPCParameterNameMiddleRow1BeltDeployed]; } - (SDLVehicleDataEventStatus)middleRow1BeltDeployed { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMiddleRow1BeltDeployed error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMiddleRow1BeltDeployed error:&error]; } - (void)setMiddleRow1BuckleBelted:(SDLVehicleDataEventStatus)middleRow1BuckleBelted { - [store sdl_setObject:middleRow1BuckleBelted forName:SDLRPCParameterNameMiddleRow1BuckleBelted]; + [self.store sdl_setObject:middleRow1BuckleBelted forName:SDLRPCParameterNameMiddleRow1BuckleBelted]; } - (SDLVehicleDataEventStatus)middleRow1BuckleBelted { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMiddleRow1BuckleBelted error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMiddleRow1BuckleBelted error:&error]; } @end diff --git a/SmartDeviceLink/SDLBodyInformation.m b/SmartDeviceLink/SDLBodyInformation.m index 5591998a3..fe8aa8b29 100644 --- a/SmartDeviceLink/SDLBodyInformation.m +++ b/SmartDeviceLink/SDLBodyInformation.m @@ -14,62 +14,62 @@ @implementation SDLBodyInformation - (void)setParkBrakeActive:(NSNumber *)parkBrakeActive { - [store sdl_setObject:parkBrakeActive forName:SDLRPCParameterNameParkBrakeActive]; + [self.store sdl_setObject:parkBrakeActive forName:SDLRPCParameterNameParkBrakeActive]; } - (NSNumber *)parkBrakeActive { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameParkBrakeActive ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameParkBrakeActive ofClass:NSNumber.class error:&error]; } - (void)setIgnitionStableStatus:(SDLIgnitionStableStatus)ignitionStableStatus { - [store sdl_setObject:ignitionStableStatus forName:SDLRPCParameterNameIgnitionStableStatus]; + [self.store sdl_setObject:ignitionStableStatus forName:SDLRPCParameterNameIgnitionStableStatus]; } - (SDLIgnitionStableStatus)ignitionStableStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameIgnitionStableStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameIgnitionStableStatus error:&error]; } - (void)setIgnitionStatus:(SDLIgnitionStatus)ignitionStatus { - [store sdl_setObject:ignitionStatus forName:SDLRPCParameterNameIgnitionStatus]; + [self.store sdl_setObject:ignitionStatus forName:SDLRPCParameterNameIgnitionStatus]; } - (SDLIgnitionStatus)ignitionStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameIgnitionStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameIgnitionStatus error:&error]; } - (void)setDriverDoorAjar:(nullable NSNumber *)driverDoorAjar { - [store sdl_setObject:driverDoorAjar forName:SDLRPCParameterNameDriverDoorAjar]; + [self.store sdl_setObject:driverDoorAjar forName:SDLRPCParameterNameDriverDoorAjar]; } - (nullable NSNumber *)driverDoorAjar { - return [store sdl_objectForName:SDLRPCParameterNameDriverDoorAjar ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDriverDoorAjar ofClass:NSNumber.class error:nil]; } - (void)setPassengerDoorAjar:(nullable NSNumber *)passengerDoorAjar { - [store sdl_setObject:passengerDoorAjar forName:SDLRPCParameterNamePassengerDoorAjar]; + [self.store sdl_setObject:passengerDoorAjar forName:SDLRPCParameterNamePassengerDoorAjar]; } - (nullable NSNumber *)passengerDoorAjar { - return [store sdl_objectForName:SDLRPCParameterNamePassengerDoorAjar ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePassengerDoorAjar ofClass:NSNumber.class error:nil]; } - (void)setRearLeftDoorAjar:(nullable NSNumber *)rearLeftDoorAjar { - [store sdl_setObject:rearLeftDoorAjar forName:SDLRPCParameterNameRearLeftDoorAjar]; + [self.store sdl_setObject:rearLeftDoorAjar forName:SDLRPCParameterNameRearLeftDoorAjar]; } - (nullable NSNumber *)rearLeftDoorAjar { - return [store sdl_objectForName:SDLRPCParameterNameRearLeftDoorAjar ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRearLeftDoorAjar ofClass:NSNumber.class error:nil]; } - (void)setRearRightDoorAjar:(nullable NSNumber *)rearRightDoorAjar { - [store sdl_setObject:rearRightDoorAjar forName:SDLRPCParameterNameRearRightDoorAjar]; + [self.store sdl_setObject:rearRightDoorAjar forName:SDLRPCParameterNameRearRightDoorAjar]; } - (nullable NSNumber *)rearRightDoorAjar { - return [store sdl_objectForName:SDLRPCParameterNameRearRightDoorAjar ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRearRightDoorAjar ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLButtonCapabilities.m b/SmartDeviceLink/SDLButtonCapabilities.m index 79fbc3fdf..12cd24847 100644 --- a/SmartDeviceLink/SDLButtonCapabilities.m +++ b/SmartDeviceLink/SDLButtonCapabilities.m @@ -11,39 +11,39 @@ @implementation SDLButtonCapabilities - (void)setName:(SDLButtonName)name { - [store sdl_setObject:name forName:SDLRPCParameterNameName]; + [self.store sdl_setObject:name forName:SDLRPCParameterNameName]; } - (SDLButtonName)name { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameName error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameName error:&error]; } - (void)setShortPressAvailable:(NSNumber *)shortPressAvailable { - [store sdl_setObject:shortPressAvailable forName:SDLRPCParameterNameShortPressAvailable]; + [self.store sdl_setObject:shortPressAvailable forName:SDLRPCParameterNameShortPressAvailable]; } - (NSNumber *)shortPressAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameShortPressAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameShortPressAvailable ofClass:NSNumber.class error:&error]; } - (void)setLongPressAvailable:(NSNumber *)longPressAvailable { - [store sdl_setObject:longPressAvailable forName:SDLRPCParameterNameLongPressAvailable]; + [self.store sdl_setObject:longPressAvailable forName:SDLRPCParameterNameLongPressAvailable]; } - (NSNumber *)longPressAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLongPressAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLongPressAvailable ofClass:NSNumber.class error:&error]; } - (void)setUpDownAvailable:(NSNumber *)upDownAvailable { - [store sdl_setObject:upDownAvailable forName:SDLRPCParameterNameUpDownAvailable]; + [self.store sdl_setObject:upDownAvailable forName:SDLRPCParameterNameUpDownAvailable]; } - (NSNumber *)upDownAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameUpDownAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameUpDownAvailable ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLButtonPress.m b/SmartDeviceLink/SDLButtonPress.m index 7823edbe2..f79152830 100644 --- a/SmartDeviceLink/SDLButtonPress.m +++ b/SmartDeviceLink/SDLButtonPress.m @@ -11,11 +11,14 @@ @implementation SDLButtonPress +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameButtonPress]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithButtonName:(SDLButtonName) buttonName moduleType:(SDLModuleType) moduleType { self = [self init]; @@ -30,30 +33,30 @@ - (instancetype)initWithButtonName:(SDLButtonName) buttonName moduleType:(SDLMod } - (void)setModuleType:(SDLModuleType)moduleType { - [parameters sdl_setObject:moduleType forName:SDLRPCParameterNameModuleType]; + [self.parameters sdl_setObject:moduleType forName:SDLRPCParameterNameModuleType]; } - (SDLModuleType)moduleType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameModuleType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameModuleType error:&error]; } - (void)setButtonName:(SDLButtonName)buttonName { - [parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; + [self.parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; } - (SDLButtonName)buttonName { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; } - (void)setButtonPressMode:(SDLButtonPressMode)buttonPressMode { - [parameters sdl_setObject:buttonPressMode forName:SDLRPCParameterNameButtonPressMode]; + [self.parameters sdl_setObject:buttonPressMode forName:SDLRPCParameterNameButtonPressMode]; } - (SDLButtonPressMode)buttonPressMode { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonPressMode error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonPressMode error:&error]; } @end diff --git a/SmartDeviceLink/SDLButtonPressResponse.m b/SmartDeviceLink/SDLButtonPressResponse.m index 6b0beb802..0dde4c52e 100644 --- a/SmartDeviceLink/SDLButtonPressResponse.m +++ b/SmartDeviceLink/SDLButtonPressResponse.m @@ -10,11 +10,14 @@ @implementation SDLButtonPressResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameButtonPress]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLChangeRegistration.m b/SmartDeviceLink/SDLChangeRegistration.m index 828653a39..87a14cb9d 100644 --- a/SmartDeviceLink/SDLChangeRegistration.m +++ b/SmartDeviceLink/SDLChangeRegistration.m @@ -13,11 +13,14 @@ @implementation SDLChangeRegistration +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameChangeRegistration]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithLanguage:(SDLLanguage)language hmiDisplayLanguage:(SDLLanguage)hmiDisplayLanguage { self = [self initWithLanguage:language hmiDisplayLanguage:hmiDisplayLanguage appName:nil ttsName:nil ngnMediaScreenAppName:nil vrSynonyms:nil]; @@ -45,53 +48,53 @@ - (instancetype)initWithLanguage:(SDLLanguage)language hmiDisplayLanguage:(SDLLa } - (void)setLanguage:(SDLLanguage)language { - [parameters sdl_setObject:language forName:SDLRPCParameterNameLanguage]; + [self.parameters sdl_setObject:language forName:SDLRPCParameterNameLanguage]; } - (SDLLanguage)language { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameLanguage error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameLanguage error:&error]; } - (void)setHmiDisplayLanguage:(SDLLanguage )hmiDisplayLanguage { - [parameters sdl_setObject:hmiDisplayLanguage forName:SDLRPCParameterNameHMIDisplayLanguage]; + [self.parameters sdl_setObject:hmiDisplayLanguage forName:SDLRPCParameterNameHMIDisplayLanguage]; } - (SDLLanguage)hmiDisplayLanguage { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguage error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguage error:&error]; } - (void)setAppName:(nullable NSString *)appName { - [parameters sdl_setObject:appName forName:SDLRPCParameterNameAppName]; + [self.parameters sdl_setObject:appName forName:SDLRPCParameterNameAppName]; } - (nullable NSString *)appName { - return [[parameters sdl_objectForName:SDLRPCParameterNameAppName ofClass:NSString.class error:nil] copy]; + return [[self.parameters sdl_objectForName:SDLRPCParameterNameAppName ofClass:NSString.class error:nil] copy]; } - (void)setTtsName:(nullable NSArray *)ttsName { - [parameters sdl_setObject:ttsName forName:SDLRPCParameterNameTTSName]; + [self.parameters sdl_setObject:ttsName forName:SDLRPCParameterNameTTSName]; } - (nullable NSArray *)ttsName { - return [parameters sdl_objectsForName:SDLRPCParameterNameTTSName ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTTSName ofClass:SDLTTSChunk.class error:nil]; } - (void)setNgnMediaScreenAppName:(nullable NSString *)ngnMediaScreenAppName { - [parameters sdl_setObject:ngnMediaScreenAppName forName:SDLRPCParameterNameNGNMediaScreenAppName]; + [self.parameters sdl_setObject:ngnMediaScreenAppName forName:SDLRPCParameterNameNGNMediaScreenAppName]; } - (nullable NSString *)ngnMediaScreenAppName { - return [parameters sdl_objectForName:SDLRPCParameterNameNGNMediaScreenAppName ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNGNMediaScreenAppName ofClass:NSString.class error:nil]; } - (void)setVrSynonyms:(nullable NSArray *)vrSynonyms { - [parameters sdl_setObject:vrSynonyms forName:SDLRPCParameterNameVRSynonyms]; + [self.parameters sdl_setObject:vrSynonyms forName:SDLRPCParameterNameVRSynonyms]; } - (nullable NSArray *)vrSynonyms { - return [parameters sdl_objectsForName:SDLRPCParameterNameVRSynonyms ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameVRSynonyms ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLChangeRegistrationResponse.m b/SmartDeviceLink/SDLChangeRegistrationResponse.m index 0765ffb00..a40493503 100644 --- a/SmartDeviceLink/SDLChangeRegistrationResponse.m +++ b/SmartDeviceLink/SDLChangeRegistrationResponse.m @@ -12,11 +12,14 @@ @implementation SDLChangeRegistrationResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameChangeRegistration]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLChoice.m b/SmartDeviceLink/SDLChoice.m index 0734c2a66..e384ddf86 100644 --- a/SmartDeviceLink/SDLChoice.m +++ b/SmartDeviceLink/SDLChoice.m @@ -39,61 +39,61 @@ - (instancetype)initWithId:(UInt16)choiceId menuName:(NSString *)menuName vrComm } - (void)setChoiceID:(NSNumber *)choiceID { - [store sdl_setObject:choiceID forName:SDLRPCParameterNameChoiceId]; + [self.store sdl_setObject:choiceID forName:SDLRPCParameterNameChoiceId]; } - (NSNumber *)choiceID { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameChoiceId ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameChoiceId ofClass:NSNumber.class error:&error]; } - (void)setMenuName:(NSString *)menuName { - [store sdl_setObject:menuName forName:SDLRPCParameterNameMenuName]; + [self.store sdl_setObject:menuName forName:SDLRPCParameterNameMenuName]; } - (NSString *)menuName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:&error]; } - (void)setVrCommands:(nullable NSArray *)vrCommands { - [store sdl_setObject:vrCommands forName:SDLRPCParameterNameVRCommands]; + [self.store sdl_setObject:vrCommands forName:SDLRPCParameterNameVRCommands]; } - (nullable NSArray *)vrCommands { - return [store sdl_objectsForName:SDLRPCParameterNameVRCommands ofClass:NSString.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameVRCommands ofClass:NSString.class error:nil]; } - (void)setImage:(nullable SDLImage *)image { - [store sdl_setObject:image forName:SDLRPCParameterNameImage]; + [self.store sdl_setObject:image forName:SDLRPCParameterNameImage]; } - (nullable SDLImage *)image { - return [store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; } - (void)setSecondaryText:(nullable NSString *)secondaryText { - [store sdl_setObject:secondaryText forName:SDLRPCParameterNameSecondaryText]; + [self.store sdl_setObject:secondaryText forName:SDLRPCParameterNameSecondaryText]; } - (nullable NSString *)secondaryText { - return [store sdl_objectForName:SDLRPCParameterNameSecondaryText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSecondaryText ofClass:NSString.class error:nil]; } - (void)setTertiaryText:(nullable NSString *)tertiaryText { - [store sdl_setObject:tertiaryText forName:SDLRPCParameterNameTertiaryText]; + [self.store sdl_setObject:tertiaryText forName:SDLRPCParameterNameTertiaryText]; } - (nullable NSString *)tertiaryText { - return [store sdl_objectForName:SDLRPCParameterNameTertiaryText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTertiaryText ofClass:NSString.class error:nil]; } - (void)setSecondaryImage:(nullable SDLImage *)secondaryImage { - [store sdl_setObject:secondaryImage forName:SDLRPCParameterNameSecondaryImage]; + [self.store sdl_setObject:secondaryImage forName:SDLRPCParameterNameSecondaryImage]; } - (nullable SDLImage *)secondaryImage { - return [store sdl_objectForName:SDLRPCParameterNameSecondaryImage ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSecondaryImage ofClass:SDLImage.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLClimateControlCapabilities.m b/SmartDeviceLink/SDLClimateControlCapabilities.m index e34c8405f..e2e488a94 100644 --- a/SmartDeviceLink/SDLClimateControlCapabilities.m +++ b/SmartDeviceLink/SDLClimateControlCapabilities.m @@ -39,132 +39,132 @@ - (instancetype)initWithModuleName:(NSString *)moduleName fanSpeedAvailable:(BOO } - (void)setModuleName:(NSString *)moduleName { - [store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; + [self.store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; } - (NSString *)moduleName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; } - (void)setFanSpeedAvailable:(nullable NSNumber *)fanSpeedAvailable { - [store sdl_setObject:fanSpeedAvailable forName:SDLRPCParameterNameFanSpeedAvailable]; + [self.store sdl_setObject:fanSpeedAvailable forName:SDLRPCParameterNameFanSpeedAvailable]; } - (nullable NSNumber *)fanSpeedAvailable { - return [store sdl_objectForName:SDLRPCParameterNameFanSpeedAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFanSpeedAvailable ofClass:NSNumber.class error:nil]; } - (void)setDesiredTemperatureAvailable:(nullable NSNumber *)desiredTemperatureAvailable { - [store sdl_setObject:desiredTemperatureAvailable forName:SDLRPCParameterNameDesiredTemperatureAvailable]; + [self.store sdl_setObject:desiredTemperatureAvailable forName:SDLRPCParameterNameDesiredTemperatureAvailable]; } - (nullable NSNumber *)desiredTemperatureAvailable { - return [store sdl_objectForName:SDLRPCParameterNameDesiredTemperatureAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDesiredTemperatureAvailable ofClass:NSNumber.class error:nil]; } - (void)setAcEnableAvailable:(nullable NSNumber *)acEnableAvailable { - [store sdl_setObject:acEnableAvailable forName:SDLRPCParameterNameACEnableAvailable]; + [self.store sdl_setObject:acEnableAvailable forName:SDLRPCParameterNameACEnableAvailable]; } - (nullable NSNumber *)acEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameACEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameACEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setAcMaxEnableAvailable:(nullable NSNumber *)acMaxEnableAvailable { - [store sdl_setObject:acMaxEnableAvailable forName:SDLRPCParameterNameACMaxEnableAvailable]; + [self.store sdl_setObject:acMaxEnableAvailable forName:SDLRPCParameterNameACMaxEnableAvailable]; } - (nullable NSNumber *)acMaxEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameACMaxEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameACMaxEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setCirculateAirEnableAvailable:(nullable NSNumber *)circulateAirEnableAvailable { - [store sdl_setObject:circulateAirEnableAvailable forName:SDLRPCParameterNameCirculateAirEnableAvailable]; + [self.store sdl_setObject:circulateAirEnableAvailable forName:SDLRPCParameterNameCirculateAirEnableAvailable]; } - (nullable NSNumber *)circulateAirEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameCirculateAirEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCirculateAirEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setAutoModeEnableAvailable:(nullable NSNumber *)autoModeEnableAvailable { - [store sdl_setObject:autoModeEnableAvailable forName:SDLRPCParameterNameAutoModeEnableAvailable]; + [self.store sdl_setObject:autoModeEnableAvailable forName:SDLRPCParameterNameAutoModeEnableAvailable]; } - (nullable NSNumber *)autoModeEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameAutoModeEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAutoModeEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setDualModeEnableAvailable:(nullable NSNumber *)dualModeEnableAvailable { - [store sdl_setObject:dualModeEnableAvailable forName:SDLRPCParameterNameDualModeEnableAvailable]; + [self.store sdl_setObject:dualModeEnableAvailable forName:SDLRPCParameterNameDualModeEnableAvailable]; } - (nullable NSNumber *)dualModeEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameDualModeEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDualModeEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setDefrostZoneAvailable:(nullable NSNumber *)defrostZoneAvailable { - [store sdl_setObject:defrostZoneAvailable forName:SDLRPCParameterNameDefrostZoneAvailable]; + [self.store sdl_setObject:defrostZoneAvailable forName:SDLRPCParameterNameDefrostZoneAvailable]; } - (nullable NSNumber *)defrostZoneAvailable { - return [store sdl_objectForName:SDLRPCParameterNameDefrostZoneAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDefrostZoneAvailable ofClass:NSNumber.class error:nil]; } - (void)setDefrostZone:(nullable NSArray *)defrostZone { - [store sdl_setObject:defrostZone forName:SDLRPCParameterNameDefrostZone]; + [self.store sdl_setObject:defrostZone forName:SDLRPCParameterNameDefrostZone]; } - (nullable NSArray *)defrostZone { - return [store sdl_enumsForName:SDLRPCParameterNameDefrostZone error:nil]; + return [self.store sdl_enumsForName:SDLRPCParameterNameDefrostZone error:nil]; } - (void)setVentilationModeAvailable:(nullable NSNumber *)ventilationModeAvailable { - [store sdl_setObject:ventilationModeAvailable forName:SDLRPCParameterNameVentilationModeAvailable]; + [self.store sdl_setObject:ventilationModeAvailable forName:SDLRPCParameterNameVentilationModeAvailable]; } - (nullable NSNumber *)ventilationModeAvailable { - return [store sdl_objectForName:SDLRPCParameterNameVentilationModeAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVentilationModeAvailable ofClass:NSNumber.class error:nil]; } - (void)setVentilationMode:(nullable NSArray *)ventilationMode { - [store sdl_setObject:ventilationMode forName:SDLRPCParameterNameVentilationMode]; + [self.store sdl_setObject:ventilationMode forName:SDLRPCParameterNameVentilationMode]; } - (nullable NSArray *)ventilationMode { - return [store sdl_enumsForName:SDLRPCParameterNameVentilationMode error:nil]; + return [self.store sdl_enumsForName:SDLRPCParameterNameVentilationMode error:nil]; } - (void)setHeatedSteeringWheelAvailable:(nullable NSNumber *)heatedSteeringWheelAvailable { - [store sdl_setObject:heatedSteeringWheelAvailable forName:SDLRPCParameterNameHeatedSteeringWheelAvailable]; + [self.store sdl_setObject:heatedSteeringWheelAvailable forName:SDLRPCParameterNameHeatedSteeringWheelAvailable]; } - (nullable NSNumber *)heatedSteeringWheelAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedSteeringWheelAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedSteeringWheelAvailable ofClass:NSNumber.class error:nil]; } - (void)setHeatedWindshieldAvailable:(nullable NSNumber *)heatedWindshieldAvailable { - [store sdl_setObject:heatedWindshieldAvailable forName:SDLRPCParameterNameHeatedWindshieldAvailable]; + [self.store sdl_setObject:heatedWindshieldAvailable forName:SDLRPCParameterNameHeatedWindshieldAvailable]; } - (nullable NSNumber *)heatedWindshieldAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedWindshieldAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedWindshieldAvailable ofClass:NSNumber.class error:nil]; } - (void)setHeatedRearWindowAvailable:(nullable NSNumber *)heatedRearWindowAvailable { - [store sdl_setObject:heatedRearWindowAvailable forName:SDLRPCParameterNameHeatedRearWindowAvailable]; + [self.store sdl_setObject:heatedRearWindowAvailable forName:SDLRPCParameterNameHeatedRearWindowAvailable]; } - (nullable NSNumber *)heatedRearWindowAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedRearWindowAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedRearWindowAvailable ofClass:NSNumber.class error:nil]; } - (void)setHeatedMirrorsAvailable:(nullable NSNumber *)heatedMirrorsAvailable { - [store sdl_setObject:heatedMirrorsAvailable forName:SDLRPCParameterNameHeatedMirrorsAvailable]; + [self.store sdl_setObject:heatedMirrorsAvailable forName:SDLRPCParameterNameHeatedMirrorsAvailable]; } - (nullable NSNumber *)heatedMirrorsAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedMirrorsAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedMirrorsAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLClimateControlData.m b/SmartDeviceLink/SDLClimateControlData.m index f5e312e58..e84e87821 100644 --- a/SmartDeviceLink/SDLClimateControlData.m +++ b/SmartDeviceLink/SDLClimateControlData.m @@ -39,115 +39,115 @@ - (instancetype)initWithFanSpeed:(nullable NSNumber *)fanSpeed desiredTe } - (void)setFanSpeed:(nullable NSNumber *)fanSpeed { - [store sdl_setObject:fanSpeed forName:SDLRPCParameterNameFanSpeed]; + [self.store sdl_setObject:fanSpeed forName:SDLRPCParameterNameFanSpeed]; } - (nullable NSNumber *)fanSpeed { - return [store sdl_objectForName:SDLRPCParameterNameFanSpeed ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFanSpeed ofClass:NSNumber.class error:nil]; } - (void)setCurrentTemperature:(nullable SDLTemperature *)currentTemperature { - [store sdl_setObject:currentTemperature forName:SDLRPCParameterNameCurrentTemperature]; + [self.store sdl_setObject:currentTemperature forName:SDLRPCParameterNameCurrentTemperature]; } - (nullable SDLTemperature *)currentTemperature { - return [store sdl_objectForName:SDLRPCParameterNameCurrentTemperature ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCurrentTemperature ofClass:SDLTemperature.class error:nil]; } - (void)setDesiredTemperature:(nullable SDLTemperature *)desiredTemperature { - [store sdl_setObject:desiredTemperature forName:SDLRPCParameterNameDesiredTemperature]; + [self.store sdl_setObject:desiredTemperature forName:SDLRPCParameterNameDesiredTemperature]; } - (nullable SDLTemperature *)desiredTemperature { - return [store sdl_objectForName:SDLRPCParameterNameDesiredTemperature ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDesiredTemperature ofClass:SDLTemperature.class error:nil]; } - (void)setAcEnable:(nullable NSNumber *)acEnable { - [store sdl_setObject:acEnable forName:SDLRPCParameterNameACEnable]; + [self.store sdl_setObject:acEnable forName:SDLRPCParameterNameACEnable]; } - (nullable NSNumber *)acEnable { - return [store sdl_objectForName:SDLRPCParameterNameACEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameACEnable ofClass:NSNumber.class error:nil]; } - (void)setCirculateAirEnable:(nullable NSNumber *)circulateAirEnable { - [store sdl_setObject:circulateAirEnable forName:SDLRPCParameterNameCirculateAirEnable]; + [self.store sdl_setObject:circulateAirEnable forName:SDLRPCParameterNameCirculateAirEnable]; } - (nullable NSNumber *)circulateAirEnable { - return [store sdl_objectForName:SDLRPCParameterNameCirculateAirEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCirculateAirEnable ofClass:NSNumber.class error:nil]; } - (void)setAutoModeEnable:(nullable NSNumber *)autoModeEnable { - [store sdl_setObject:autoModeEnable forName:SDLRPCParameterNameAutoModeEnable]; + [self.store sdl_setObject:autoModeEnable forName:SDLRPCParameterNameAutoModeEnable]; } - (nullable NSNumber *)autoModeEnable { - return [store sdl_objectForName:SDLRPCParameterNameAutoModeEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAutoModeEnable ofClass:NSNumber.class error:nil]; } - (void)setDefrostZone:(nullable SDLDefrostZone)defrostZone { - [store sdl_setObject:defrostZone forName:SDLRPCParameterNameDefrostZone]; + [self.store sdl_setObject:defrostZone forName:SDLRPCParameterNameDefrostZone]; } - (nullable SDLDefrostZone)defrostZone { - return [store sdl_enumForName:SDLRPCParameterNameDefrostZone error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameDefrostZone error:nil]; } - (void)setDualModeEnable:(nullable NSNumber *)dualModeEnable { - [store sdl_setObject:dualModeEnable forName:SDLRPCParameterNameDualModeEnable]; + [self.store sdl_setObject:dualModeEnable forName:SDLRPCParameterNameDualModeEnable]; } - (nullable NSNumber *)dualModeEnable { - return [store sdl_objectForName:SDLRPCParameterNameDualModeEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDualModeEnable ofClass:NSNumber.class error:nil]; } - (void)setAcMaxEnable:(nullable NSNumber *)acMaxEnable { - [store sdl_setObject:acMaxEnable forName:SDLRPCParameterNameACMaxEnable]; + [self.store sdl_setObject:acMaxEnable forName:SDLRPCParameterNameACMaxEnable]; } - (nullable NSNumber *)acMaxEnable { - return [store sdl_objectForName:SDLRPCParameterNameACMaxEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameACMaxEnable ofClass:NSNumber.class error:nil]; } - (void)setVentilationMode:(nullable SDLVentilationMode)ventilationMode { - [store sdl_setObject:ventilationMode forName:SDLRPCParameterNameVentilationMode]; + [self.store sdl_setObject:ventilationMode forName:SDLRPCParameterNameVentilationMode]; } - (nullable SDLVentilationMode)ventilationMode { - return [store sdl_enumForName:SDLRPCParameterNameVentilationMode error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameVentilationMode error:nil]; } - (void)setHeatedSteeringWheelEnable:(nullable NSNumber *)heatedSteeringWheelEnable { - [store sdl_setObject:heatedSteeringWheelEnable forName:SDLRPCParameterNameHeatedSteeringWheelEnable]; + [self.store sdl_setObject:heatedSteeringWheelEnable forName:SDLRPCParameterNameHeatedSteeringWheelEnable]; } - (nullable NSNumber *)heatedSteeringWheelEnable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedSteeringWheelEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedSteeringWheelEnable ofClass:NSNumber.class error:nil]; } - (void)setHeatedWindshieldEnable:(nullable NSNumber *)heatedWindshieldEnable { - [store sdl_setObject:heatedWindshieldEnable forName:SDLRPCParameterNameHeatedWindshieldEnable]; + [self.store sdl_setObject:heatedWindshieldEnable forName:SDLRPCParameterNameHeatedWindshieldEnable]; } - (nullable NSNumber *)heatedWindshieldEnable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedWindshieldEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedWindshieldEnable ofClass:NSNumber.class error:nil]; } - (void)setHeatedRearWindowEnable:(nullable NSNumber *)heatedRearWindowEnable { - [store sdl_setObject:heatedRearWindowEnable forName:SDLRPCParameterNameHeatedRearWindowEnable]; + [self.store sdl_setObject:heatedRearWindowEnable forName:SDLRPCParameterNameHeatedRearWindowEnable]; } - (nullable NSNumber *)heatedRearWindowEnable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedRearWindowEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedRearWindowEnable ofClass:NSNumber.class error:nil]; } - (void)setHeatedMirrorsEnable:(nullable NSNumber *)heatedMirrorsEnable { - [store sdl_setObject:heatedMirrorsEnable forName:SDLRPCParameterNameHeatedMirrorsEnable]; + [self.store sdl_setObject:heatedMirrorsEnable forName:SDLRPCParameterNameHeatedMirrorsEnable]; } - (nullable NSNumber *)heatedMirrorsEnable { - return [store sdl_objectForName:SDLRPCParameterNameHeatedMirrorsEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatedMirrorsEnable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLCloudAppProperties.m b/SmartDeviceLink/SDLCloudAppProperties.m index 389ab0144..3a2ad32a2 100644 --- a/SmartDeviceLink/SDLCloudAppProperties.m +++ b/SmartDeviceLink/SDLCloudAppProperties.m @@ -44,60 +44,60 @@ - (instancetype)initWithAppID:(NSString *)appID nicknames:(nullable NSArray *)nicknames { - [store sdl_setObject:nicknames forName:SDLRPCParameterNameNicknames]; + [self.store sdl_setObject:nicknames forName:SDLRPCParameterNameNicknames]; } - (nullable NSArray *)nicknames { - return [store sdl_objectsForName:SDLRPCParameterNameNicknames ofClass:NSString.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameNicknames ofClass:NSString.class error:nil]; } - (void)setAppID:(NSString *)appID { - [store sdl_setObject:appID forName:SDLRPCParameterNameAppId]; + [self.store sdl_setObject:appID forName:SDLRPCParameterNameAppId]; } - (NSString *)appID { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameAppId ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameAppId ofClass:NSString.class error:&error]; } - (void)setEnabled:(nullable NSNumber *)enabled { - [store sdl_setObject:enabled forName:SDLRPCParameterNameEnabled]; + [self.store sdl_setObject:enabled forName:SDLRPCParameterNameEnabled]; } - (nullable NSNumber *)enabled { - return [store sdl_objectForName:SDLRPCParameterNameEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameEnabled ofClass:NSNumber.class error:nil]; } - (void)setAuthToken:(nullable NSString *)authToken { - [store sdl_setObject:authToken forName:SDLRPCParameterNameAuthToken]; + [self.store sdl_setObject:authToken forName:SDLRPCParameterNameAuthToken]; } - (nullable NSString *)authToken { - return [store sdl_objectForName:SDLRPCParameterNameAuthToken ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAuthToken ofClass:NSString.class error:nil]; } - (void)setCloudTransportType:(nullable NSString *)cloudTransportType { - [store sdl_setObject:cloudTransportType forName:SDLRPCParameterNameCloudTransportType]; + [self.store sdl_setObject:cloudTransportType forName:SDLRPCParameterNameCloudTransportType]; } - (nullable NSString *)cloudTransportType { - return [store sdl_objectForName:SDLRPCParameterNameCloudTransportType ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCloudTransportType ofClass:NSString.class error:nil]; } - (void)setHybridAppPreference:(nullable SDLHybridAppPreference)hybridAppPreference { - [store sdl_setObject:hybridAppPreference forName:SDLRPCParameterNameHybridAppPreference]; + [self.store sdl_setObject:hybridAppPreference forName:SDLRPCParameterNameHybridAppPreference]; } - (nullable SDLHybridAppPreference)hybridAppPreference { - return [store sdl_enumForName:SDLRPCParameterNameHybridAppPreference error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameHybridAppPreference error:nil]; } - (void)setEndpoint:(nullable NSString *)endpoint { - [store sdl_setObject:endpoint forName:SDLRPCParameterNameEndpoint]; + [self.store sdl_setObject:endpoint forName:SDLRPCParameterNameEndpoint]; } - (nullable NSString *)endpoint { - return [store sdl_objectForName:SDLRPCParameterNameEndpoint ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameEndpoint ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLClusterModeStatus.m b/SmartDeviceLink/SDLClusterModeStatus.m index 05b635357..1558c0522 100644 --- a/SmartDeviceLink/SDLClusterModeStatus.m +++ b/SmartDeviceLink/SDLClusterModeStatus.m @@ -11,39 +11,39 @@ @implementation SDLClusterModeStatus - (void)setPowerModeActive:(NSNumber *)powerModeActive { - [store sdl_setObject:powerModeActive forName:SDLRPCParameterNamePowerModeActive]; + [self.store sdl_setObject:powerModeActive forName:SDLRPCParameterNamePowerModeActive]; } - (NSNumber *)powerModeActive { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNamePowerModeActive ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNamePowerModeActive ofClass:NSNumber.class error:&error]; } - (void)setPowerModeQualificationStatus:(SDLPowerModeQualificationStatus)powerModeQualificationStatus { - [store sdl_setObject:powerModeQualificationStatus forName:SDLRPCParameterNamePowerModeQualificationStatus]; + [self.store sdl_setObject:powerModeQualificationStatus forName:SDLRPCParameterNamePowerModeQualificationStatus]; } - (SDLPowerModeQualificationStatus)powerModeQualificationStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePowerModeQualificationStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePowerModeQualificationStatus error:&error]; } - (void)setCarModeStatus:(SDLCarModeStatus)carModeStatus { - [store sdl_setObject:carModeStatus forName:SDLRPCParameterNameCarModeStatus]; + [self.store sdl_setObject:carModeStatus forName:SDLRPCParameterNameCarModeStatus]; } - (SDLCarModeStatus)carModeStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameCarModeStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameCarModeStatus error:&error]; } - (void)setPowerModeStatus:(SDLPowerModeStatus)powerModeStatus { - [store sdl_setObject:powerModeStatus forName:SDLRPCParameterNamePowerModeStatus]; + [self.store sdl_setObject:powerModeStatus forName:SDLRPCParameterNamePowerModeStatus]; } - (SDLPowerModeStatus)powerModeStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePowerModeStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePowerModeStatus error:&error]; } @end diff --git a/SmartDeviceLink/SDLCreateInteractionChoiceSet.m b/SmartDeviceLink/SDLCreateInteractionChoiceSet.m index d35a0470b..00ee17093 100644 --- a/SmartDeviceLink/SDLCreateInteractionChoiceSet.m +++ b/SmartDeviceLink/SDLCreateInteractionChoiceSet.m @@ -13,11 +13,14 @@ @implementation SDLCreateInteractionChoiceSet +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameCreateInteractionChoiceSet]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithId:(UInt32)choiceId choiceSet:(NSArray *)choiceSet { self = [self init]; @@ -31,21 +34,21 @@ - (instancetype)initWithId:(UInt32)choiceId choiceSet:(NSArray *)ch } - (void)setInteractionChoiceSetID:(NSNumber *)interactionChoiceSetID { - [parameters sdl_setObject:interactionChoiceSetID forName:SDLRPCParameterNameInteractionChoiceSetId]; + [self.parameters sdl_setObject:interactionChoiceSetID forName:SDLRPCParameterNameInteractionChoiceSetId]; } - (NSNumber *)interactionChoiceSetID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameInteractionChoiceSetId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInteractionChoiceSetId ofClass:NSNumber.class error:&error]; } - (void)setChoiceSet:(NSArray *)choiceSet { - [parameters sdl_setObject:choiceSet forName:SDLRPCParameterNameChoiceSet]; + [self.parameters sdl_setObject:choiceSet forName:SDLRPCParameterNameChoiceSet]; } - (NSArray *)choiceSet { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameChoiceSet ofClass:SDLChoice.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameChoiceSet ofClass:SDLChoice.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.m b/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.m index bc5fee627..37b8bad2e 100644 --- a/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.m +++ b/SmartDeviceLink/SDLCreateInteractionChoiceSetResponse.m @@ -12,11 +12,14 @@ @implementation SDLCreateInteractionChoiceSetResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameCreateInteractionChoiceSet]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLDIDResult.m b/SmartDeviceLink/SDLDIDResult.m index 885a64839..4f661d895 100644 --- a/SmartDeviceLink/SDLDIDResult.m +++ b/SmartDeviceLink/SDLDIDResult.m @@ -11,29 +11,29 @@ @implementation SDLDIDResult - (void)setResultCode:(SDLVehicleDataResultCode)resultCode { - [store sdl_setObject:resultCode forName:SDLRPCParameterNameResultCode]; + [self.store sdl_setObject:resultCode forName:SDLRPCParameterNameResultCode]; } - (SDLVehicleDataResultCode)resultCode { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameResultCode error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameResultCode error:&error]; } - (void)setDidLocation:(NSNumber *)didLocation { - [store sdl_setObject:didLocation forName:SDLRPCParameterNameDIDLocation]; + [self.store sdl_setObject:didLocation forName:SDLRPCParameterNameDIDLocation]; } - (NSNumber *)didLocation { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameDIDLocation ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameDIDLocation ofClass:NSNumber.class error:&error]; } - (void)setData:(nullable NSString *)data { - [store sdl_setObject:data forName:SDLRPCParameterNameData]; + [self.store sdl_setObject:data forName:SDLRPCParameterNameData]; } - (nullable NSString *)data { - return [store sdl_objectForName:SDLRPCParameterNameData ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameData ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLDateTime.m b/SmartDeviceLink/SDLDateTime.m index bb496cd9c..c5a45214a 100644 --- a/SmartDeviceLink/SDLDateTime.m +++ b/SmartDeviceLink/SDLDateTime.m @@ -59,84 +59,84 @@ - (instancetype)initWithHour:(UInt8)hour minute:(UInt8)minute second:(UInt8)seco } - (void)setMillisecond:(NSNumber *)millisecond { - [store sdl_setObject:millisecond forName:SDLRPCParameterNameMillisecond]; + [self.store sdl_setObject:millisecond forName:SDLRPCParameterNameMillisecond]; } - (NSNumber *)millisecond { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMillisecond ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMillisecond ofClass:NSNumber.class error:&error]; } - (void)setSecond:(NSNumber *)second { - [store sdl_setObject:second forName:SDLRPCParameterNameSecond]; + [self.store sdl_setObject:second forName:SDLRPCParameterNameSecond]; } - (NSNumber *)second { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameSecond ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameSecond ofClass:NSNumber.class error:&error]; } - (void)setMinute:(NSNumber *)minute { - [store sdl_setObject:minute forName:SDLRPCParameterNameMinute]; + [self.store sdl_setObject:minute forName:SDLRPCParameterNameMinute]; } - (NSNumber *)minute { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMinute ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMinute ofClass:NSNumber.class error:&error]; } - (void)setHour:(NSNumber *)hour { - [store sdl_setObject:hour forName:SDLRPCParameterNameHour]; + [self.store sdl_setObject:hour forName:SDLRPCParameterNameHour]; } - (NSNumber *)hour { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameHour ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameHour ofClass:NSNumber.class error:&error]; } - (void)setDay:(NSNumber *)day { - [store sdl_setObject:day forName:SDLRPCParameterNameDay]; + [self.store sdl_setObject:day forName:SDLRPCParameterNameDay]; } - (NSNumber *)day { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameDay ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameDay ofClass:NSNumber.class error:&error]; } - (void)setMonth:(NSNumber *)month { - [store sdl_setObject:month forName:SDLRPCParameterNameMonth]; + [self.store sdl_setObject:month forName:SDLRPCParameterNameMonth]; } - (NSNumber *)month { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMonth ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMonth ofClass:NSNumber.class error:&error]; } - (void)setYear:(NSNumber *)year { - [store sdl_setObject:year forName:SDLRPCParameterNameYear]; + [self.store sdl_setObject:year forName:SDLRPCParameterNameYear]; } - (NSNumber *)year { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameYear ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameYear ofClass:NSNumber.class error:&error]; } - (void)setTimezoneMinuteOffset:(NSNumber *)timezoneMinuteOffset { - [store sdl_setObject:timezoneMinuteOffset forName:SDLRPCParameterNameTimezoneMinuteOffset]; + [self.store sdl_setObject:timezoneMinuteOffset forName:SDLRPCParameterNameTimezoneMinuteOffset]; } - (NSNumber *)timezoneMinuteOffset { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameTimezoneMinuteOffset ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameTimezoneMinuteOffset ofClass:NSNumber.class error:&error]; } - (void)setTimezoneHourOffset:(NSNumber *)timezoneHourOffset { - [store sdl_setObject:timezoneHourOffset forName:SDLRPCParameterNameTimezoneHourOffset]; + [self.store sdl_setObject:timezoneHourOffset forName:SDLRPCParameterNameTimezoneHourOffset]; } - (NSNumber *)timezoneHourOffset { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameTimezoneHourOffset ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameTimezoneHourOffset ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDeleteCommand.m b/SmartDeviceLink/SDLDeleteCommand.m index cc8b80feb..563cde435 100644 --- a/SmartDeviceLink/SDLDeleteCommand.m +++ b/SmartDeviceLink/SDLDeleteCommand.m @@ -12,11 +12,14 @@ @implementation SDLDeleteCommand +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteCommand]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithId:(UInt32)commandId { self = [self init]; @@ -30,12 +33,12 @@ - (instancetype)initWithId:(UInt32)commandId { } - (void)setCmdID:(NSNumber *)cmdID { - [parameters sdl_setObject:cmdID forName:SDLRPCParameterNameCommandId]; + [self.parameters sdl_setObject:cmdID forName:SDLRPCParameterNameCommandId]; } - (NSNumber *)cmdID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameCommandId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCommandId ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDeleteCommandResponse.m b/SmartDeviceLink/SDLDeleteCommandResponse.m index cdfb646fe..57460a834 100644 --- a/SmartDeviceLink/SDLDeleteCommandResponse.m +++ b/SmartDeviceLink/SDLDeleteCommandResponse.m @@ -12,11 +12,14 @@ @implementation SDLDeleteCommandResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteCommand]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLDeleteFile.m b/SmartDeviceLink/SDLDeleteFile.m index 007959f47..8c1a0573a 100644 --- a/SmartDeviceLink/SDLDeleteFile.m +++ b/SmartDeviceLink/SDLDeleteFile.m @@ -12,11 +12,14 @@ @implementation SDLDeleteFile +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteFile]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithFileName:(NSString *)fileName { self = [self init]; @@ -30,12 +33,12 @@ - (instancetype)initWithFileName:(NSString *)fileName { } - (void)setSyncFileName:(NSString *)syncFileName { - [parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName]; + [self.parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName]; } - (NSString *)syncFileName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDeleteFileResponse.m b/SmartDeviceLink/SDLDeleteFileResponse.m index cddc4f1a2..17db0cb17 100644 --- a/SmartDeviceLink/SDLDeleteFileResponse.m +++ b/SmartDeviceLink/SDLDeleteFileResponse.m @@ -12,18 +12,21 @@ @implementation SDLDeleteFileResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteFile]) { } return self; } +#pragma clang diagnostic pop - (void)setSpaceAvailable:(nullable NSNumber *)spaceAvailable { - [parameters sdl_setObject:spaceAvailable forName:SDLRPCParameterNameSpaceAvailable]; + [self.parameters sdl_setObject:spaceAvailable forName:SDLRPCParameterNameSpaceAvailable]; } - (nullable NSNumber *)spaceAvailable { - return [parameters sdl_objectForName:SDLRPCParameterNameSpaceAvailable ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpaceAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m b/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m index 8c749aaea..20174145f 100644 --- a/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m +++ b/SmartDeviceLink/SDLDeleteInteractionChoiceSet.m @@ -12,11 +12,14 @@ @implementation SDLDeleteInteractionChoiceSet +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteInteractionChoiceSet]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithId:(UInt32)choiceId { self = [self init]; @@ -30,12 +33,12 @@ - (instancetype)initWithId:(UInt32)choiceId { } - (void)setInteractionChoiceSetID:(NSNumber *)interactionChoiceSetID { - [parameters sdl_setObject:interactionChoiceSetID forName:SDLRPCParameterNameInteractionChoiceSetId]; + [self.parameters sdl_setObject:interactionChoiceSetID forName:SDLRPCParameterNameInteractionChoiceSetId]; } - (NSNumber *)interactionChoiceSetID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameInteractionChoiceSetId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInteractionChoiceSetId ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.m b/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.m index 2a0047a79..abc14d757 100644 --- a/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.m +++ b/SmartDeviceLink/SDLDeleteInteractionChoiceSetResponse.m @@ -12,11 +12,14 @@ @implementation SDLDeleteInteractionChoiceSetResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteInteractionChoiceSet]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLDeleteSubMenu.m b/SmartDeviceLink/SDLDeleteSubMenu.m index 6e260712e..2fd29100e 100644 --- a/SmartDeviceLink/SDLDeleteSubMenu.m +++ b/SmartDeviceLink/SDLDeleteSubMenu.m @@ -12,11 +12,14 @@ @implementation SDLDeleteSubMenu +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteSubMenu]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithId:(UInt32)menuId { self = [self init]; @@ -30,12 +33,12 @@ - (instancetype)initWithId:(UInt32)menuId { } - (void)setMenuID:(NSNumber *)menuID { - [parameters sdl_setObject:menuID forName:SDLRPCParameterNameMenuId]; + [self.parameters sdl_setObject:menuID forName:SDLRPCParameterNameMenuId]; } - (NSNumber *)menuID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameMenuId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuId ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDeleteSubMenuResponse.m b/SmartDeviceLink/SDLDeleteSubMenuResponse.m index 1a9309a13..d9c3355ea 100644 --- a/SmartDeviceLink/SDLDeleteSubMenuResponse.m +++ b/SmartDeviceLink/SDLDeleteSubMenuResponse.m @@ -12,11 +12,14 @@ @implementation SDLDeleteSubMenuResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDeleteSubMenu]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLDeviceInfo.m b/SmartDeviceLink/SDLDeviceInfo.m index cd4474166..a28f2759a 100644 --- a/SmartDeviceLink/SDLDeviceInfo.m +++ b/SmartDeviceLink/SDLDeviceInfo.m @@ -30,51 +30,51 @@ + (instancetype)currentDevice { } - (void)setHardware:(nullable NSString *)hardware { - [store sdl_setObject:hardware forName:SDLRPCParameterNameHardware]; + [self.store sdl_setObject:hardware forName:SDLRPCParameterNameHardware]; } - (nullable NSString *)hardware { - return [store sdl_objectForName:SDLRPCParameterNameHardware ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHardware ofClass:NSString.class error:nil]; } - (void)setFirmwareRev:(nullable NSString *)firmwareRev { - [store sdl_setObject:firmwareRev forName:SDLRPCParameterNameFirmwareRevision]; + [self.store sdl_setObject:firmwareRev forName:SDLRPCParameterNameFirmwareRevision]; } - (nullable NSString *)firmwareRev { - return [store sdl_objectForName:SDLRPCParameterNameFirmwareRevision ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFirmwareRevision ofClass:NSString.class error:nil]; } - (void)setOs:(nullable NSString *)os { - [store sdl_setObject:os forName:SDLRPCParameterNameOS]; + [self.store sdl_setObject:os forName:SDLRPCParameterNameOS]; } - (nullable NSString *)os { - return [store sdl_objectForName:SDLRPCParameterNameOS ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameOS ofClass:NSString.class error:nil]; } - (void)setOsVersion:(nullable NSString *)osVersion { - [store sdl_setObject:osVersion forName:SDLRPCParameterNameOSVersion]; + [self.store sdl_setObject:osVersion forName:SDLRPCParameterNameOSVersion]; } - (nullable NSString *)osVersion { - return [store sdl_objectForName:SDLRPCParameterNameOSVersion ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameOSVersion ofClass:NSString.class error:nil]; } - (void)setCarrier:(nullable NSString *)carrier { - [store sdl_setObject:carrier forName:SDLRPCParameterNameCarrier]; + [self.store sdl_setObject:carrier forName:SDLRPCParameterNameCarrier]; } - (nullable NSString *)carrier { - return [store sdl_objectForName:SDLRPCParameterNameCarrier ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCarrier ofClass:NSString.class error:nil]; } - (void)setMaxNumberRFCOMMPorts:(nullable NSNumber *)maxNumberRFCOMMPorts { - [store sdl_setObject:maxNumberRFCOMMPorts forName:SDLRPCParameterNameMaxNumberRFCOMMPorts]; + [self.store sdl_setObject:maxNumberRFCOMMPorts forName:SDLRPCParameterNameMaxNumberRFCOMMPorts]; } - (nullable NSNumber *)maxNumberRFCOMMPorts { - return [store sdl_objectForName:SDLRPCParameterNameMaxNumberRFCOMMPorts ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMaxNumberRFCOMMPorts ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLDeviceStatus.m b/SmartDeviceLink/SDLDeviceStatus.m index 048e4f8c4..2b9101233 100644 --- a/SmartDeviceLink/SDLDeviceStatus.m +++ b/SmartDeviceLink/SDLDeviceStatus.m @@ -13,102 +13,102 @@ @implementation SDLDeviceStatus - (void)setVoiceRecOn:(NSNumber *)voiceRecOn { - [store sdl_setObject:voiceRecOn forName:SDLRPCParameterNameVoiceRecognitionOn]; + [self.store sdl_setObject:voiceRecOn forName:SDLRPCParameterNameVoiceRecognitionOn]; } - (NSNumber *)voiceRecOn { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameVoiceRecognitionOn ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameVoiceRecognitionOn ofClass:NSNumber.class error:&error]; } - (void)setBtIconOn:(NSNumber *)btIconOn { - [store sdl_setObject:btIconOn forName:SDLRPCParameterNameBluetoothIconOn]; + [self.store sdl_setObject:btIconOn forName:SDLRPCParameterNameBluetoothIconOn]; } - (NSNumber *)btIconOn { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameBluetoothIconOn ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameBluetoothIconOn ofClass:NSNumber.class error:&error]; } - (void)setCallActive:(NSNumber *)callActive { - [store sdl_setObject:callActive forName:SDLRPCParameterNameCallActive]; + [self.store sdl_setObject:callActive forName:SDLRPCParameterNameCallActive]; } - (NSNumber *)callActive { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameCallActive ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameCallActive ofClass:NSNumber.class error:&error]; } - (void)setPhoneRoaming:(NSNumber *)phoneRoaming { - [store sdl_setObject:phoneRoaming forName:SDLRPCParameterNamePhoneRoaming]; + [self.store sdl_setObject:phoneRoaming forName:SDLRPCParameterNamePhoneRoaming]; } - (NSNumber *)phoneRoaming { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNamePhoneRoaming ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNamePhoneRoaming ofClass:NSNumber.class error:&error]; } - (void)setTextMsgAvailable:(NSNumber *)textMsgAvailable { - [store sdl_setObject:textMsgAvailable forName:SDLRPCParameterNameTextMessageAvailable]; + [self.store sdl_setObject:textMsgAvailable forName:SDLRPCParameterNameTextMessageAvailable]; } - (NSNumber *)textMsgAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameTextMessageAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameTextMessageAvailable ofClass:NSNumber.class error:&error]; } - (void)setBattLevelStatus:(SDLDeviceLevelStatus )battLevelStatus { - [store sdl_setObject:battLevelStatus forName:SDLRPCParameterNameBatteryLevelStatus]; + [self.store sdl_setObject:battLevelStatus forName:SDLRPCParameterNameBatteryLevelStatus]; } - (SDLDeviceLevelStatus)battLevelStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameBatteryLevelStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameBatteryLevelStatus error:&error]; } - (void)setStereoAudioOutputMuted:(NSNumber *)stereoAudioOutputMuted { - [store sdl_setObject:stereoAudioOutputMuted forName:SDLRPCParameterNameStereoAudioOutputMuted]; + [self.store sdl_setObject:stereoAudioOutputMuted forName:SDLRPCParameterNameStereoAudioOutputMuted]; } - (NSNumber *)stereoAudioOutputMuted { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameStereoAudioOutputMuted ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameStereoAudioOutputMuted ofClass:NSNumber.class error:&error]; } - (void)setMonoAudioOutputMuted:(NSNumber *)monoAudioOutputMuted { - [store sdl_setObject:monoAudioOutputMuted forName:SDLRPCParameterNameMonoAudioOutputMuted]; + [self.store sdl_setObject:monoAudioOutputMuted forName:SDLRPCParameterNameMonoAudioOutputMuted]; } - (NSNumber *)monoAudioOutputMuted { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMonoAudioOutputMuted ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMonoAudioOutputMuted ofClass:NSNumber.class error:&error]; } - (void)setSignalLevelStatus:(SDLDeviceLevelStatus)signalLevelStatus { - [store sdl_setObject:signalLevelStatus forName:SDLRPCParameterNameSignalLevelStatus]; + [self.store sdl_setObject:signalLevelStatus forName:SDLRPCParameterNameSignalLevelStatus]; } - (SDLDeviceLevelStatus)signalLevelStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameSignalLevelStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameSignalLevelStatus error:&error]; } - (void)setPrimaryAudioSource:(SDLPrimaryAudioSource)primaryAudioSource { - [store sdl_setObject:primaryAudioSource forName:SDLRPCParameterNamePrimaryAudioSource]; + [self.store sdl_setObject:primaryAudioSource forName:SDLRPCParameterNamePrimaryAudioSource]; } - (SDLPrimaryAudioSource)primaryAudioSource { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePrimaryAudioSource error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePrimaryAudioSource error:&error]; } - (void)setECallEventActive:(NSNumber *)eCallEventActive { - [store sdl_setObject:eCallEventActive forName:SDLRPCParameterNameECallEventActive]; + [self.store sdl_setObject:eCallEventActive forName:SDLRPCParameterNameECallEventActive]; } - (NSNumber *)eCallEventActive { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameECallEventActive ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameECallEventActive ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDiagnosticMessage.m b/SmartDeviceLink/SDLDiagnosticMessage.m index 89f636c26..b7d4e4016 100644 --- a/SmartDeviceLink/SDLDiagnosticMessage.m +++ b/SmartDeviceLink/SDLDiagnosticMessage.m @@ -12,11 +12,14 @@ @implementation SDLDiagnosticMessage +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDiagnosticMessage]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithTargetId:(UInt16)targetId length:(UInt16)length data:(NSArray *)data { self = [self init]; @@ -32,30 +35,30 @@ - (instancetype)initWithTargetId:(UInt16)targetId length:(UInt16)length data:(NS } - (void)setTargetID:(NSNumber *)targetID { - [parameters sdl_setObject:targetID forName:SDLRPCParameterNameTargetId]; + [self.parameters sdl_setObject:targetID forName:SDLRPCParameterNameTargetId]; } - (NSNumber *)targetID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameTargetId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTargetId ofClass:NSNumber.class error:&error]; } - (void)setMessageLength:(NSNumber *)messageLength { - [parameters sdl_setObject:messageLength forName:SDLRPCParameterNameMessageLength]; + [self.parameters sdl_setObject:messageLength forName:SDLRPCParameterNameMessageLength]; } - (NSNumber *)messageLength { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameMessageLength ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMessageLength ofClass:NSNumber.class error:&error]; } - (void)setMessageData:(NSArray *> *)messageData { - [parameters sdl_setObject:messageData forName:SDLRPCParameterNameMessageData]; + [self.parameters sdl_setObject:messageData forName:SDLRPCParameterNameMessageData]; } - (NSArray *> *)messageData { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameMessageData ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameMessageData ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDiagnosticMessageResponse.m b/SmartDeviceLink/SDLDiagnosticMessageResponse.m index 6b275135a..8863f97ec 100644 --- a/SmartDeviceLink/SDLDiagnosticMessageResponse.m +++ b/SmartDeviceLink/SDLDiagnosticMessageResponse.m @@ -11,19 +11,22 @@ @implementation SDLDiagnosticMessageResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDiagnosticMessage]) { } return self; } +#pragma clang diagnostic pop - (void)setMessageDataResult:(NSArray *> *)messageDataResult { - [parameters sdl_setObject:messageDataResult forName:SDLRPCParameterNameMessageDataResult]; + [self.parameters sdl_setObject:messageDataResult forName:SDLRPCParameterNameMessageDataResult]; } - (NSArray *> *)messageDataResult { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameMessageDataResult ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameMessageDataResult ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDialNumber.m b/SmartDeviceLink/SDLDialNumber.m index 47c312416..eaed1eb41 100644 --- a/SmartDeviceLink/SDLDialNumber.m +++ b/SmartDeviceLink/SDLDialNumber.m @@ -10,11 +10,14 @@ @implementation SDLDialNumber +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDialNumber]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithNumber:(NSString *)number { self = [self init]; @@ -28,12 +31,12 @@ - (instancetype)initWithNumber:(NSString *)number { } - (void)setNumber:(NSString *)number { - [parameters sdl_setObject:number forName:SDLRPCParameterNameNumber]; + [self.parameters sdl_setObject:number forName:SDLRPCParameterNameNumber]; } - (NSString *)number { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameNumber ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNumber ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLDialNumberResponse.m b/SmartDeviceLink/SDLDialNumberResponse.m index 0b9e02c58..b8073cf9d 100644 --- a/SmartDeviceLink/SDLDialNumberResponse.m +++ b/SmartDeviceLink/SDLDialNumberResponse.m @@ -12,11 +12,14 @@ @implementation SDLDialNumberResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameDialNumber]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLDisplayCapabilities.m b/SmartDeviceLink/SDLDisplayCapabilities.m index 8667eafa8..b85208a83 100644 --- a/SmartDeviceLink/SDLDisplayCapabilities.m +++ b/SmartDeviceLink/SDLDisplayCapabilities.m @@ -14,79 +14,79 @@ @implementation SDLDisplayCapabilities - (void)setDisplayType:(SDLDisplayType)displayType { - [store sdl_setObject:displayType forName:SDLRPCParameterNameDisplayType]; + [self.store sdl_setObject:displayType forName:SDLRPCParameterNameDisplayType]; } - (SDLDisplayType)displayType { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDisplayType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDisplayType error:&error]; } - (void)setDisplayName:(nullable NSString *)displayName { - [store sdl_setObject:displayName forName:SDLRPCParameterNameDisplayName]; + [self.store sdl_setObject:displayName forName:SDLRPCParameterNameDisplayName]; } - (nullable NSString *)displayName { - return [store sdl_objectForName:SDLRPCParameterNameDisplayName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDisplayName ofClass:NSString.class error:nil]; } - (void)setTextFields:(NSArray *)textFields { - [store sdl_setObject:textFields forName:SDLRPCParameterNameTextFields]; + [self.store sdl_setObject:textFields forName:SDLRPCParameterNameTextFields]; } - (NSArray *)textFields { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameTextFields ofClass:SDLTextField.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameTextFields ofClass:SDLTextField.class error:&error]; } - (void)setImageFields:(nullable NSArray *)imageFields { - [store sdl_setObject:imageFields forName:SDLRPCParameterNameImageFields]; + [self.store sdl_setObject:imageFields forName:SDLRPCParameterNameImageFields]; } - (nullable NSArray *)imageFields { - return [store sdl_objectsForName:SDLRPCParameterNameImageFields ofClass:SDLImageField.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameImageFields ofClass:SDLImageField.class error:nil]; } - (void)setMediaClockFormats:(NSArray *)mediaClockFormats { - [store sdl_setObject:mediaClockFormats forName:SDLRPCParameterNameMediaClockFormats]; + [self.store sdl_setObject:mediaClockFormats forName:SDLRPCParameterNameMediaClockFormats]; } - (NSArray *)mediaClockFormats { NSError *error = nil; - return [store sdl_enumsForName:SDLRPCParameterNameMediaClockFormats error:&error]; + return [self.store sdl_enumsForName:SDLRPCParameterNameMediaClockFormats error:&error]; } - (void)setGraphicSupported:(NSNumber *)graphicSupported { - [store sdl_setObject:graphicSupported forName:SDLRPCParameterNameGraphicSupported]; + [self.store sdl_setObject:graphicSupported forName:SDLRPCParameterNameGraphicSupported]; } - (NSNumber *)graphicSupported { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameGraphicSupported ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameGraphicSupported ofClass:NSNumber.class error:&error]; } - (void)setTemplatesAvailable:(nullable NSArray *)templatesAvailable { - [store sdl_setObject:templatesAvailable forName:SDLRPCParameterNameTemplatesAvailable]; + [self.store sdl_setObject:templatesAvailable forName:SDLRPCParameterNameTemplatesAvailable]; } - (nullable NSArray *)templatesAvailable { - return [store sdl_objectsForName:SDLRPCParameterNameTemplatesAvailable ofClass:NSString.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameTemplatesAvailable ofClass:NSString.class error:nil]; } - (void)setScreenParams:(nullable SDLScreenParams *)screenParams { - [store sdl_setObject:screenParams forName:SDLRPCParameterNameScreenParams]; + [self.store sdl_setObject:screenParams forName:SDLRPCParameterNameScreenParams]; } - (nullable SDLScreenParams *)screenParams { - return [store sdl_objectForName:SDLRPCParameterNameScreenParams ofClass:SDLScreenParams.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameScreenParams ofClass:SDLScreenParams.class error:nil]; } - (void)setNumCustomPresetsAvailable:(nullable NSNumber *)numCustomPresetsAvailable { - [store sdl_setObject:numCustomPresetsAvailable forName:SDLRPCParameterNameNumberCustomPresetsAvailable]; + [self.store sdl_setObject:numCustomPresetsAvailable forName:SDLRPCParameterNameNumberCustomPresetsAvailable]; } - (nullable NSNumber *)numCustomPresetsAvailable { - return [store sdl_objectForName:SDLRPCParameterNameNumberCustomPresetsAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNumberCustomPresetsAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLECallInfo.m b/SmartDeviceLink/SDLECallInfo.m index 4b77e3e3d..61820ed2e 100644 --- a/SmartDeviceLink/SDLECallInfo.m +++ b/SmartDeviceLink/SDLECallInfo.m @@ -11,30 +11,30 @@ @implementation SDLECallInfo - (void)setECallNotificationStatus:(SDLVehicleDataNotificationStatus)eCallNotificationStatus { - [store sdl_setObject:eCallNotificationStatus forName:SDLRPCParameterNameECallNotificationStatus]; + [self.store sdl_setObject:eCallNotificationStatus forName:SDLRPCParameterNameECallNotificationStatus]; } - (SDLVehicleDataNotificationStatus)eCallNotificationStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameECallNotificationStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameECallNotificationStatus error:&error]; } - (void)setAuxECallNotificationStatus:(SDLVehicleDataNotificationStatus)auxECallNotificationStatus { - [store sdl_setObject:auxECallNotificationStatus forName:SDLRPCParameterNameAuxECallNotificationStatus]; + [self.store sdl_setObject:auxECallNotificationStatus forName:SDLRPCParameterNameAuxECallNotificationStatus]; } - (SDLVehicleDataNotificationStatus)auxECallNotificationStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameAuxECallNotificationStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameAuxECallNotificationStatus error:&error]; } - (void)setECallConfirmationStatus:(SDLECallConfirmationStatus)eCallConfirmationStatus { - [store sdl_setObject:eCallConfirmationStatus forName:SDLRPCParameterNameECallConfirmationStatus]; + [self.store sdl_setObject:eCallConfirmationStatus forName:SDLRPCParameterNameECallConfirmationStatus]; } - (SDLECallConfirmationStatus)eCallConfirmationStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameECallConfirmationStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameECallConfirmationStatus error:&error]; } @end diff --git a/SmartDeviceLink/SDLEmergencyEvent.m b/SmartDeviceLink/SDLEmergencyEvent.m index e2869823c..0052ac078 100644 --- a/SmartDeviceLink/SDLEmergencyEvent.m +++ b/SmartDeviceLink/SDLEmergencyEvent.m @@ -11,48 +11,48 @@ @implementation SDLEmergencyEvent - (void)setEmergencyEventType:(SDLEmergencyEventType)emergencyEventType { - [store sdl_setObject:emergencyEventType forName:SDLRPCParameterNameEmergencyEventType]; + [self.store sdl_setObject:emergencyEventType forName:SDLRPCParameterNameEmergencyEventType]; } - (SDLEmergencyEventType)emergencyEventType { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameEmergencyEventType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameEmergencyEventType error:&error]; } - (void)setFuelCutoffStatus:(SDLFuelCutoffStatus)fuelCutoffStatus { - [store sdl_setObject:fuelCutoffStatus forName:SDLRPCParameterNameFuelCutoffStatus]; + [self.store sdl_setObject:fuelCutoffStatus forName:SDLRPCParameterNameFuelCutoffStatus]; } - (SDLFuelCutoffStatus)fuelCutoffStatus { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameFuelCutoffStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameFuelCutoffStatus error:&error]; } - (void)setRolloverEvent:(SDLVehicleDataEventStatus)rolloverEvent { - [store sdl_setObject:rolloverEvent forName:SDLRPCParameterNameRolloverEvent]; + [self.store sdl_setObject:rolloverEvent forName:SDLRPCParameterNameRolloverEvent]; } - (SDLVehicleDataEventStatus)rolloverEvent { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameRolloverEvent error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameRolloverEvent error:&error]; } - (void)setMaximumChangeVelocity:(NSNumber *)maximumChangeVelocity { - [store sdl_setObject:maximumChangeVelocity forName:SDLRPCParameterNameMaximumChangeVelocity]; + [self.store sdl_setObject:maximumChangeVelocity forName:SDLRPCParameterNameMaximumChangeVelocity]; } - (NSNumber *)maximumChangeVelocity { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMaximumChangeVelocity ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMaximumChangeVelocity ofClass:NSNumber.class error:&error]; } - (void)setMultipleEvents:(SDLVehicleDataEventStatus)multipleEvents { - [store sdl_setObject:multipleEvents forName:SDLRPCParameterNameMultipleEvents]; + [self.store sdl_setObject:multipleEvents forName:SDLRPCParameterNameMultipleEvents]; } - (SDLVehicleDataEventStatus)multipleEvents { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMultipleEvents error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMultipleEvents error:&error]; } @end diff --git a/SmartDeviceLink/SDLEncodedSyncPData.m b/SmartDeviceLink/SDLEncodedSyncPData.m index 913e2f53a..1d03e2c99 100644 --- a/SmartDeviceLink/SDLEncodedSyncPData.m +++ b/SmartDeviceLink/SDLEncodedSyncPData.m @@ -12,19 +12,22 @@ @implementation SDLEncodedSyncPData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameEncodedSyncPData]) { } return self; } +#pragma clang diagnostic pop - (void)setData:(NSArray *)data { - [parameters sdl_setObject:data forName:SDLRPCParameterNameData]; + [self.parameters sdl_setObject:data forName:SDLRPCParameterNameData]; } - (NSArray *)data { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameData ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameData ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLEncodedSyncPDataResponse.m b/SmartDeviceLink/SDLEncodedSyncPDataResponse.m index c71ce9f11..d25d87d16 100644 --- a/SmartDeviceLink/SDLEncodedSyncPDataResponse.m +++ b/SmartDeviceLink/SDLEncodedSyncPDataResponse.m @@ -12,11 +12,14 @@ @implementation SDLEncodedSyncPDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameEncodedSyncPData]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLEndAudioPassThru.m b/SmartDeviceLink/SDLEndAudioPassThru.m index 93e7afb4a..3bc00b4fb 100644 --- a/SmartDeviceLink/SDLEndAudioPassThru.m +++ b/SmartDeviceLink/SDLEndAudioPassThru.m @@ -12,11 +12,14 @@ @implementation SDLEndAudioPassThru +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameEndAudioPassThru]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLEndAudioPassThruResponse.m b/SmartDeviceLink/SDLEndAudioPassThruResponse.m index ff1b88da6..e6a99a143 100644 --- a/SmartDeviceLink/SDLEndAudioPassThruResponse.m +++ b/SmartDeviceLink/SDLEndAudioPassThruResponse.m @@ -12,11 +12,14 @@ @implementation SDLEndAudioPassThruResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameEndAudioPassThru]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLEqualizerSettings.m b/SmartDeviceLink/SDLEqualizerSettings.m index 988177006..7db9a3597 100644 --- a/SmartDeviceLink/SDLEqualizerSettings.m +++ b/SmartDeviceLink/SDLEqualizerSettings.m @@ -22,29 +22,29 @@ - (instancetype)initWithChannelId:(UInt8)channelId channelSetting:(UInt8)channel } - (void)setChannelId:(NSNumber *)channelId { - [store sdl_setObject:channelId forName:SDLRPCParameterNameChannelId]; + [self.store sdl_setObject:channelId forName:SDLRPCParameterNameChannelId]; } - (NSNumber *)channelId { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameChannelId ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameChannelId ofClass:NSNumber.class error:&error]; } - (void)setChannelName:(nullable NSString *)channelName { - [store sdl_setObject:channelName forName:SDLRPCParameterNameChannelName]; + [self.store sdl_setObject:channelName forName:SDLRPCParameterNameChannelName]; } - (nullable NSString *)channelName { - return [store sdl_objectForName:SDLRPCParameterNameChannelName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameChannelName ofClass:NSString.class error:nil]; } - (void)setChannelSetting:(NSNumber *)channelSetting { - [store sdl_setObject:channelSetting forName:SDLRPCParameterNameChannelSetting]; + [self.store sdl_setObject:channelSetting forName:SDLRPCParameterNameChannelSetting]; } - (NSNumber *)channelSetting { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameChannelSetting ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameChannelSetting ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLFuelRange.m b/SmartDeviceLink/SDLFuelRange.m index 01d704484..1512a0957 100644 --- a/SmartDeviceLink/SDLFuelRange.m +++ b/SmartDeviceLink/SDLFuelRange.m @@ -16,19 +16,19 @@ @implementation SDLFuelRange - (void)setType:(nullable SDLFuelType)type { - [store sdl_setObject:type forName:SDLRPCParameterNameType]; + [self.store sdl_setObject:type forName:SDLRPCParameterNameType]; } - (nullable SDLFuelType)type { - return [store sdl_enumForName:SDLRPCParameterNameType error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameType error:nil]; } - (void)setRange:(nullable NSNumber *)range { - [store sdl_setObject:range forName:SDLRPCParameterNameRange]; + [self.store sdl_setObject:range forName:SDLRPCParameterNameRange]; } - (nullable NSNumber *)range { - return [store sdl_objectForName:SDLRPCParameterNameRange ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRange ofClass:NSNumber.class error:nil]; } diff --git a/SmartDeviceLink/SDLGPSData.m b/SmartDeviceLink/SDLGPSData.m index 11caf5f5c..e6e68d8e3 100644 --- a/SmartDeviceLink/SDLGPSData.m +++ b/SmartDeviceLink/SDLGPSData.m @@ -11,149 +11,149 @@ @implementation SDLGPSData - (void)setLongitudeDegrees:(NSNumber *)longitudeDegrees { - [store sdl_setObject:longitudeDegrees forName:SDLRPCParameterNameLongitudeDegrees]; + [self.store sdl_setObject:longitudeDegrees forName:SDLRPCParameterNameLongitudeDegrees]; } - (NSNumber *)longitudeDegrees { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLongitudeDegrees ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLongitudeDegrees ofClass:NSNumber.class error:&error]; } - (void)setLatitudeDegrees:(NSNumber *)latitudeDegrees { - [store sdl_setObject:latitudeDegrees forName:SDLRPCParameterNameLatitudeDegrees]; + [self.store sdl_setObject:latitudeDegrees forName:SDLRPCParameterNameLatitudeDegrees]; } - (NSNumber *)latitudeDegrees { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLatitudeDegrees ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLatitudeDegrees ofClass:NSNumber.class error:&error]; } - (void)setUtcYear:(nullable NSNumber *)utcYear { - [store sdl_setObject:utcYear forName:SDLRPCParameterNameUTCYear]; + [self.store sdl_setObject:utcYear forName:SDLRPCParameterNameUTCYear]; } - (nullable NSNumber *)utcYear { - return [store sdl_objectForName:SDLRPCParameterNameUTCYear ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameUTCYear ofClass:NSNumber.class error:nil]; } - (void)setUtcMonth:(nullable NSNumber *)utcMonth { - [store sdl_setObject:utcMonth forName:SDLRPCParameterNameUTCMonth]; + [self.store sdl_setObject:utcMonth forName:SDLRPCParameterNameUTCMonth]; } - (nullable NSNumber *)utcMonth { - return [store sdl_objectForName:SDLRPCParameterNameUTCMonth ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameUTCMonth ofClass:NSNumber.class error:nil]; } - (void)setUtcDay:(nullable NSNumber *)utcDay { - [store sdl_setObject:utcDay forName:SDLRPCParameterNameUTCDay]; + [self.store sdl_setObject:utcDay forName:SDLRPCParameterNameUTCDay]; } - (nullable NSNumber *)utcDay { - return [store sdl_objectForName:SDLRPCParameterNameUTCDay ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameUTCDay ofClass:NSNumber.class error:nil]; } - (void)setUtcHours:(nullable NSNumber *)utcHours { - [store sdl_setObject:utcHours forName:SDLRPCParameterNameUTCHours]; + [self.store sdl_setObject:utcHours forName:SDLRPCParameterNameUTCHours]; } - (nullable NSNumber *)utcHours { - return [store sdl_objectForName:SDLRPCParameterNameUTCHours ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameUTCHours ofClass:NSNumber.class error:nil]; } - (void)setUtcMinutes:(nullable NSNumber *)utcMinutes { - [store sdl_setObject:utcMinutes forName:SDLRPCParameterNameUTCMinutes]; + [self.store sdl_setObject:utcMinutes forName:SDLRPCParameterNameUTCMinutes]; } - (nullable NSNumber *)utcMinutes { - return [store sdl_objectForName:SDLRPCParameterNameUTCMinutes ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameUTCMinutes ofClass:NSNumber.class error:nil]; } - (void)setUtcSeconds:(nullable NSNumber *)utcSeconds { - [store sdl_setObject:utcSeconds forName:SDLRPCParameterNameUTCSeconds]; + [self.store sdl_setObject:utcSeconds forName:SDLRPCParameterNameUTCSeconds]; } - (nullable NSNumber *)utcSeconds { - return [store sdl_objectForName:SDLRPCParameterNameUTCSeconds ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameUTCSeconds ofClass:NSNumber.class error:nil]; } - (void)setCompassDirection:(nullable SDLCompassDirection)compassDirection { - [store sdl_setObject:compassDirection forName:SDLRPCParameterNameCompassDirection]; + [self.store sdl_setObject:compassDirection forName:SDLRPCParameterNameCompassDirection]; } - (nullable SDLCompassDirection)compassDirection { - return [store sdl_enumForName:SDLRPCParameterNameCompassDirection error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameCompassDirection error:nil]; } - (void)setPdop:(nullable NSNumber *)pdop { - [store sdl_setObject:pdop forName:SDLRPCParameterNamePDOP]; + [self.store sdl_setObject:pdop forName:SDLRPCParameterNamePDOP]; } - (nullable NSNumber *)pdop { - return [store sdl_objectForName:SDLRPCParameterNamePDOP ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePDOP ofClass:NSNumber.class error:nil]; } - (void)setHdop:(nullable NSNumber *)hdop { - [store sdl_setObject:hdop forName:SDLRPCParameterNameHDOP]; + [self.store sdl_setObject:hdop forName:SDLRPCParameterNameHDOP]; } - (nullable NSNumber *)hdop { - return [store sdl_objectForName:SDLRPCParameterNameHDOP ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHDOP ofClass:NSNumber.class error:nil]; } - (void)setVdop:(nullable NSNumber *)vdop { - [store sdl_setObject:vdop forName:SDLRPCParameterNameVDOP]; + [self.store sdl_setObject:vdop forName:SDLRPCParameterNameVDOP]; } - (nullable NSNumber *)vdop { - return [store sdl_objectForName:SDLRPCParameterNameVDOP ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVDOP ofClass:NSNumber.class error:nil]; } - (void)setActual:(nullable NSNumber *)actual { - [store sdl_setObject:actual forName:SDLRPCParameterNameActual]; + [self.store sdl_setObject:actual forName:SDLRPCParameterNameActual]; } - (nullable NSNumber *)actual { - return [store sdl_objectForName:SDLRPCParameterNameActual ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameActual ofClass:NSNumber.class error:nil]; } - (void)setSatellites:(nullable NSNumber *)satellites { - [store sdl_setObject:satellites forName:SDLRPCParameterNameSatellites]; + [self.store sdl_setObject:satellites forName:SDLRPCParameterNameSatellites]; } - (nullable NSNumber *)satellites { - return [store sdl_objectForName:SDLRPCParameterNameSatellites ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSatellites ofClass:NSNumber.class error:nil]; } - (void)setDimension:(nullable SDLDimension)dimension { - [store sdl_setObject:dimension forName:SDLRPCParameterNameDimension]; + [self.store sdl_setObject:dimension forName:SDLRPCParameterNameDimension]; } - (nullable SDLDimension)dimension { - return [store sdl_enumForName:SDLRPCParameterNameDimension error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameDimension error:nil]; } - (void)setAltitude:(nullable NSNumber *)altitude { - [store sdl_setObject:altitude forName:SDLRPCParameterNameAltitude]; + [self.store sdl_setObject:altitude forName:SDLRPCParameterNameAltitude]; } - (nullable NSNumber *)altitude { - return [store sdl_objectForName:SDLRPCParameterNameAltitude ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAltitude ofClass:NSNumber.class error:nil]; } - (void)setHeading:(nullable NSNumber *)heading { - [store sdl_setObject:heading forName:SDLRPCParameterNameHeading]; + [self.store sdl_setObject:heading forName:SDLRPCParameterNameHeading]; } - (nullable NSNumber *)heading { - return [store sdl_objectForName:SDLRPCParameterNameHeading ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeading ofClass:NSNumber.class error:nil]; } - (void)setSpeed:(nullable NSNumber *)speed { - [store sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.store sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable NSNumber *)speed { - return [store sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGenericResponse.m b/SmartDeviceLink/SDLGenericResponse.m index 949c4c061..59cca10f2 100644 --- a/SmartDeviceLink/SDLGenericResponse.m +++ b/SmartDeviceLink/SDLGenericResponse.m @@ -12,11 +12,14 @@ @implementation SDLGenericResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGenericResponse]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLGetAppServiceData.m b/SmartDeviceLink/SDLGetAppServiceData.m index d8fb73e65..55efbbdd9 100644 --- a/SmartDeviceLink/SDLGetAppServiceData.m +++ b/SmartDeviceLink/SDLGetAppServiceData.m @@ -16,11 +16,14 @@ @implementation SDLGetAppServiceData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetAppServiceData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAppServiceType:(SDLAppServiceType)serviceType { self = [self init]; @@ -53,20 +56,20 @@ - (instancetype)initWithServiceType:(SDLAppServiceType)serviceType subscribe:(BO } - (void)setServiceType:(NSString *)serviceType { - [parameters sdl_setObject:serviceType forName:SDLRPCParameterNameServiceType]; + [self.parameters sdl_setObject:serviceType forName:SDLRPCParameterNameServiceType]; } - (NSString *)serviceType { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameServiceType ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameServiceType ofClass:NSString.class error:&error]; } - (void)setSubscribe:(nullable NSNumber *)subscribe { - [parameters sdl_setObject:subscribe forName:SDLRPCParameterNameSubscribe]; + [self.parameters sdl_setObject:subscribe forName:SDLRPCParameterNameSubscribe]; } - (nullable NSNumber *)subscribe { - return [parameters sdl_objectForName:SDLRPCParameterNameSubscribe ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSubscribe ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetAppServiceDataResponse.m b/SmartDeviceLink/SDLGetAppServiceDataResponse.m index de67e4cc8..110d6732a 100644 --- a/SmartDeviceLink/SDLGetAppServiceDataResponse.m +++ b/SmartDeviceLink/SDLGetAppServiceDataResponse.m @@ -17,11 +17,14 @@ @implementation SDLGetAppServiceDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetAppServiceData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAppServiceData:(SDLAppServiceData *)serviceData { self = [self init]; @@ -35,11 +38,11 @@ - (instancetype)initWithAppServiceData:(SDLAppServiceData *)serviceData { } - (void)setServiceData:(nullable SDLAppServiceData *)serviceData { - [parameters sdl_setObject:serviceData forName:SDLRPCParameterNameServiceData]; + [self.parameters sdl_setObject:serviceData forName:SDLRPCParameterNameServiceData]; } - (nullable SDLAppServiceData *)serviceData { - return [parameters sdl_objectForName:SDLRPCParameterNameServiceData ofClass:SDLAppServiceData.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameServiceData ofClass:SDLAppServiceData.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetCloudAppProperties.m b/SmartDeviceLink/SDLGetCloudAppProperties.m index c6ab76e5c..030c2bdd8 100644 --- a/SmartDeviceLink/SDLGetCloudAppProperties.m +++ b/SmartDeviceLink/SDLGetCloudAppProperties.m @@ -16,11 +16,14 @@ @implementation SDLGetCloudAppProperties +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetCloudAppProperties]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAppID:(NSString *)appID { self = [self init]; @@ -34,12 +37,12 @@ - (instancetype)initWithAppID:(NSString *)appID { } - (void)setAppID:(NSString *)appID { - [parameters sdl_setObject:appID forName:SDLRPCParameterNameAppId]; + [self.parameters sdl_setObject:appID forName:SDLRPCParameterNameAppId]; } - (NSString *)appID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameAppId ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppId ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLGetCloudAppPropertiesResponse.m b/SmartDeviceLink/SDLGetCloudAppPropertiesResponse.m index 64d7a011d..6114c4636 100644 --- a/SmartDeviceLink/SDLGetCloudAppPropertiesResponse.m +++ b/SmartDeviceLink/SDLGetCloudAppPropertiesResponse.m @@ -18,11 +18,14 @@ @implementation SDLGetCloudAppPropertiesResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetCloudAppProperties]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithProperties:(SDLCloudAppProperties *)properties { self = [self init]; @@ -36,11 +39,11 @@ - (instancetype)initWithProperties:(SDLCloudAppProperties *)properties { } - (void)setProperties:(nullable SDLCloudAppProperties *)properties { - [parameters sdl_setObject:properties forName:SDLRPCParameterNameProperties]; + [self.parameters sdl_setObject:properties forName:SDLRPCParameterNameProperties]; } - (nullable SDLCloudAppProperties *)properties { - return [parameters sdl_objectForName:SDLRPCParameterNameProperties ofClass:SDLCloudAppProperties.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameProperties ofClass:SDLCloudAppProperties.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetDTCs.m b/SmartDeviceLink/SDLGetDTCs.m index 61b7e0b74..95fcff1b8 100644 --- a/SmartDeviceLink/SDLGetDTCs.m +++ b/SmartDeviceLink/SDLGetDTCs.m @@ -12,11 +12,14 @@ @implementation SDLGetDTCs +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetDTCs]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithECUName:(UInt16)name mask:(UInt8)mask { self = [self initWithECUName:name]; @@ -41,20 +44,20 @@ - (instancetype)initWithECUName:(UInt16)name { } - (void)setEcuName:(NSNumber *)ecuName { - [parameters sdl_setObject:ecuName forName:SDLRPCParameterNameECUName]; + [self.parameters sdl_setObject:ecuName forName:SDLRPCParameterNameECUName]; } - (NSNumber *)ecuName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameECUName ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECUName ofClass:NSNumber.class error:&error]; } - (void)setDtcMask:(nullable NSNumber *)dtcMask { - [parameters sdl_setObject:dtcMask forName:SDLRPCParameterNameDTCMask]; + [self.parameters sdl_setObject:dtcMask forName:SDLRPCParameterNameDTCMask]; } - (nullable NSNumber *)dtcMask { - return [parameters sdl_objectForName:SDLRPCParameterNameDTCMask ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDTCMask ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetDTCsResponse.m b/SmartDeviceLink/SDLGetDTCsResponse.m index ce31face1..087990a88 100644 --- a/SmartDeviceLink/SDLGetDTCsResponse.m +++ b/SmartDeviceLink/SDLGetDTCsResponse.m @@ -12,28 +12,31 @@ @implementation SDLGetDTCsResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetDTCs]) { } return self; } +#pragma clang diagnostic pop - (void)setEcuHeader:(NSNumber *)ecuHeader { - [parameters sdl_setObject:ecuHeader forName:SDLRPCParameterNameECUHeader]; + [self.parameters sdl_setObject:ecuHeader forName:SDLRPCParameterNameECUHeader]; } - (NSNumber *)ecuHeader { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameECUHeader ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECUHeader ofClass:NSNumber.class error:&error]; } - (void)setDtc:(NSArray *)dtc { - [parameters sdl_setObject:dtc forName:SDLRPCParameterNameDTC]; + [self.parameters sdl_setObject:dtc forName:SDLRPCParameterNameDTC]; } - (NSArray *)dtc { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameDTC ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameDTC ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLGetFile.m b/SmartDeviceLink/SDLGetFile.m index 3bd11d2e9..239a034ba 100644 --- a/SmartDeviceLink/SDLGetFile.m +++ b/SmartDeviceLink/SDLGetFile.m @@ -17,11 +17,14 @@ @implementation SDLGetFile +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetFile]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithFileName:(NSString *)fileName { self = [self init]; @@ -59,44 +62,44 @@ - (instancetype)initWithFileName:(NSString *)fileName appServiceId:(nullable NSS } - (void)setFileName:(NSString *)fileName { - [parameters sdl_setObject:fileName forName:SDLRPCParameterNameFilename]; + [self.parameters sdl_setObject:fileName forName:SDLRPCParameterNameFilename]; } - (NSString *)fileName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameFilename ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFilename ofClass:NSString.class error:&error]; } - (void)setAppServiceId:(nullable NSString *)appServiceId { - [parameters sdl_setObject:appServiceId forName:SDLRPCParameterNameAppServiceId]; + [self.parameters sdl_setObject:appServiceId forName:SDLRPCParameterNameAppServiceId]; } - (nullable NSString *)appServiceId { - return [parameters sdl_objectForName:SDLRPCParameterNameAppServiceId ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppServiceId ofClass:NSString.class error:nil]; } - (void)setFileType:(nullable SDLFileType)fileType { - [parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; + [self.parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; } - (nullable SDLFileType)fileType { - return [parameters sdl_enumForName:SDLRPCParameterNameFileType error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameFileType error:nil]; } - (void)setOffset:(nullable NSNumber *)offset { - [parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; + [self.parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; } - (nullable NSNumber *)offset { - return [parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; } - (void)setLength:(nullable NSNumber *)length { - [parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; + [self.parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; } - (nullable NSNumber *)length { - return [parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetFileResponse.m b/SmartDeviceLink/SDLGetFileResponse.m index 14e86e8ce..57a2b3f7f 100644 --- a/SmartDeviceLink/SDLGetFileResponse.m +++ b/SmartDeviceLink/SDLGetFileResponse.m @@ -16,11 +16,14 @@ @implementation SDLGetFileResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetFile]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithOffset:(UInt32)offset length:(UInt32)length fileType:(nullable SDLFileType)fileType crc:(UInt32)crc { self = [self init]; @@ -37,35 +40,35 @@ - (instancetype)initWithOffset:(UInt32)offset length:(UInt32)length fileType:(nu } - (void)setOffset:(nullable NSNumber *)offset { - [parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; + [self.parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; } - (nullable NSNumber *)offset { - return [parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; } - (void)setLength:(nullable NSNumber *)length { - [parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; + [self.parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; } - (nullable NSNumber *)length { - return [parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; } - (void)setFileType:(nullable SDLFileType)fileType { - [parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; + [self.parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; } - (nullable SDLFileType)fileType { - return [parameters sdl_enumForName:SDLRPCParameterNameFileType error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameFileType error:nil]; } - (void)setCrc:(nullable NSNumber *)crc { - [parameters sdl_setObject:crc forName:SDLRPCParameterNameCRC]; + [self.parameters sdl_setObject:crc forName:SDLRPCParameterNameCRC]; } - (nullable NSNumber *)crc { - return [parameters sdl_objectForName:SDLRPCParameterNameCRC ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCRC ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetInteriorVehicleData.m b/SmartDeviceLink/SDLGetInteriorVehicleData.m index f91938fa3..4f283fb49 100755 --- a/SmartDeviceLink/SDLGetInteriorVehicleData.m +++ b/SmartDeviceLink/SDLGetInteriorVehicleData.m @@ -11,11 +11,14 @@ @implementation SDLGetInteriorVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetInteriorVehicleData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithModuleType:(SDLModuleType)moduleType; { self = [self init]; @@ -53,20 +56,20 @@ - (instancetype)initAndUnsubscribeToModuleType:(SDLModuleType)moduleType { } - (void)setModuleType:(SDLModuleType)moduleType { - [parameters sdl_setObject:moduleType forName:SDLRPCParameterNameModuleType]; + [self.parameters sdl_setObject:moduleType forName:SDLRPCParameterNameModuleType]; } - (SDLModuleType)moduleType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameModuleType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameModuleType error:&error]; } - (void)setSubscribe:(nullable NSNumber *)subscribe { - [parameters sdl_setObject:subscribe forName:SDLRPCParameterNameSubscribe]; + [self.parameters sdl_setObject:subscribe forName:SDLRPCParameterNameSubscribe]; } - (nullable NSNumber *)subscribe { - return [parameters sdl_objectForName:SDLRPCParameterNameSubscribe ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSubscribe ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetInteriorVehicleDataResponse.m b/SmartDeviceLink/SDLGetInteriorVehicleDataResponse.m index 3a7096cb3..d57c35ad8 100644 --- a/SmartDeviceLink/SDLGetInteriorVehicleDataResponse.m +++ b/SmartDeviceLink/SDLGetInteriorVehicleDataResponse.m @@ -13,27 +13,30 @@ @implementation SDLGetInteriorVehicleDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetInteriorVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setModuleData:(SDLModuleData *)moduleData { - [parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; + [self.parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; } - (SDLModuleData *)moduleData { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; } - (void)setIsSubscribed:(nullable NSNumber *)isSubscribed { - [parameters sdl_setObject:isSubscribed forName:SDLRPCParameterNameIsSubscribed]; + [self.parameters sdl_setObject:isSubscribed forName:SDLRPCParameterNameIsSubscribed]; } - (nullable NSNumber *)isSubscribed { - return [parameters sdl_objectForName:SDLRPCParameterNameIsSubscribed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameIsSubscribed ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetSystemCapability.m b/SmartDeviceLink/SDLGetSystemCapability.m index df14d5212..0e966de18 100644 --- a/SmartDeviceLink/SDLGetSystemCapability.m +++ b/SmartDeviceLink/SDLGetSystemCapability.m @@ -17,11 +17,14 @@ @implementation SDLGetSystemCapability +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetSystemCapability]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithType:(SDLSystemCapabilityType)type { self = [self init]; @@ -46,20 +49,20 @@ - (instancetype)initWithType:(SDLSystemCapabilityType)type subscribe:(BOOL)subsc } - (void)setSystemCapabilityType:(SDLSystemCapabilityType)type { - [parameters sdl_setObject:type forName:SDLRPCParameterNameSystemCapabilityType]; + [self.parameters sdl_setObject:type forName:SDLRPCParameterNameSystemCapabilityType]; } - (SDLSystemCapabilityType)systemCapabilityType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameSystemCapabilityType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameSystemCapabilityType error:&error]; } - (void)setSubscribe:(nullable NSNumber *)subscribe { - [parameters sdl_setObject:subscribe forName:SDLRPCParameterNameSubscribe]; + [self.parameters sdl_setObject:subscribe forName:SDLRPCParameterNameSubscribe]; } - (nullable NSNumber *)subscribe { - return [parameters sdl_objectForName:SDLRPCParameterNameSubscribe ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSubscribe ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetSystemCapabilityResponse.m b/SmartDeviceLink/SDLGetSystemCapabilityResponse.m index e1cd63f90..c3abcc757 100644 --- a/SmartDeviceLink/SDLGetSystemCapabilityResponse.m +++ b/SmartDeviceLink/SDLGetSystemCapabilityResponse.m @@ -18,6 +18,8 @@ @implementation SDLGetSystemCapabilityResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { self = [super initWithName:SDLRPCFunctionNameGetSystemCapability]; if (!self) { @@ -26,14 +28,15 @@ - (instancetype)init { return self; } +#pragma clang diagnostic pop - (void)setSystemCapability:(SDLSystemCapability *)systemCapability { - [parameters sdl_setObject:systemCapability forName:SDLRPCParameterNameSystemCapability]; + [self.parameters sdl_setObject:systemCapability forName:SDLRPCParameterNameSystemCapability]; } - (SDLSystemCapability *)systemCapability { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSystemCapability ofClass:SDLSystemCapability.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSystemCapability ofClass:SDLSystemCapability.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLGetVehicleData.m b/SmartDeviceLink/SDLGetVehicleData.m index 9856e2443..7ed2bb189 100644 --- a/SmartDeviceLink/SDLGetVehicleData.m +++ b/SmartDeviceLink/SDLGetVehicleData.m @@ -12,11 +12,14 @@ @implementation SDLGetVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetVehicleData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure vin:(BOOL)vin wiperStatus:(BOOL)wiperStatus { return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo electronicParkBrakeStatus:NO emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure turnSignal:NO vin:vin wiperStatus:wiperStatus]; @@ -67,243 +70,243 @@ - (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPositio } - (void)setGps:(nullable NSNumber *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable NSNumber *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:NSNumber.class error:nil]; } - (void)setSpeed:(nullable NSNumber *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable NSNumber *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; } - (void)setRpm:(nullable NSNumber *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable NSNumber *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel:(nullable NSNumber *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable NSNumber *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel_State:(nullable NSNumber *)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable NSNumber *)fuelLevel_State { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:NSNumber.class error:nil]; } - (void)setFuelRange:(nullable NSNumber *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable NSNumber *)fuelRange { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:NSNumber.class error:nil]; } - (void)setInstantFuelConsumption:(nullable NSNumber *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (nullable NSNumber *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; } - (void)setExternalTemperature:(nullable NSNumber *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable NSNumber *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; } - (void)setVin:(nullable NSNumber *)vin { - [parameters sdl_setObject:vin forName:SDLRPCParameterNameVIN]; + [self.parameters sdl_setObject:vin forName:SDLRPCParameterNameVIN]; } - (nullable NSNumber *)vin { - return [parameters sdl_objectForName:SDLRPCParameterNameVIN ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameVIN ofClass:NSNumber.class error:nil]; } - (void)setPrndl:(nullable NSNumber *)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable NSNumber *)prndl { - return [parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:NSNumber.class error:nil]; } - (void)setTirePressure:(nullable NSNumber *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable NSNumber *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:NSNumber.class error:nil]; } - (void)setOdometer:(nullable NSNumber *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable NSNumber *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; } - (void)setBeltStatus:(nullable NSNumber *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable NSNumber *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:NSNumber.class error:nil]; } - (void)setBodyInformation:(nullable NSNumber *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable NSNumber *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:NSNumber.class error:nil]; } - (void)setDeviceStatus:(nullable NSNumber *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable NSNumber *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:NSNumber.class error:nil]; } - (void)setDriverBraking:(nullable NSNumber *)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable NSNumber *)driverBraking { - return [parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:NSNumber.class error:nil]; } - (void)setWiperStatus:(nullable NSNumber *)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable NSNumber *)wiperStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:NSNumber.class error:nil]; } - (void)setHeadLampStatus:(nullable NSNumber *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable NSNumber *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:NSNumber.class error:nil]; } - (void)setEngineOilLife:(nullable NSNumber *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable NSNumber *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; } - (void)setEngineTorque:(nullable NSNumber *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable NSNumber *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; } - (void)setAccPedalPosition:(nullable NSNumber *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable NSNumber *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; } - (void)setSteeringWheelAngle:(nullable NSNumber *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable NSNumber *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; } - (void)setECallInfo:(nullable NSNumber *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable NSNumber *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:NSNumber.class error:nil]; } - (void)setAirbagStatus:(nullable NSNumber *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable NSNumber *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:NSNumber.class error:nil]; } - (void)setEmergencyEvent:(nullable NSNumber *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable NSNumber *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:NSNumber.class error:nil]; } - (void)setClusterModeStatus:(nullable NSNumber *)clusterModeStatus { - [parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; + [self.parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; } - (nullable NSNumber *)clusterModeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:NSNumber.class error:nil]; } - (void)setMyKey:(nullable NSNumber *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable NSNumber *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:NSNumber.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable NSNumber *)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable NSNumber *)electronicParkBrakeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:NSNumber.class error:nil]; } - (void)setTurnSignal:(nullable NSNumber *)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable NSNumber *)turnSignal { - return [parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:NSNumber.class error:nil]; } - (void)setCloudAppVehicleID:(nullable NSNumber *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable NSNumber *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetVehicleDataResponse.m b/SmartDeviceLink/SDLGetVehicleDataResponse.m index 6e7266a34..2b47a92b3 100644 --- a/SmartDeviceLink/SDLGetVehicleDataResponse.m +++ b/SmartDeviceLink/SDLGetVehicleDataResponse.m @@ -24,250 +24,253 @@ @implementation SDLGetVehicleDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setGps:(nullable SDLGPSData *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable SDLGPSData *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLGPSData.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLGPSData.class error:nil]; } - (void)setSpeed:(nullable NSNumber *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable NSNumber *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; } - (void)setRpm:(nullable NSNumber *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable NSNumber *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel:(nullable NSNumber *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable NSNumber *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel_State:(nullable SDLComponentVolumeStatus)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable SDLComponentVolumeStatus)fuelLevel_State { - return [parameters sdl_enumForName:SDLRPCParameterNameFuelLevelState error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameFuelLevelState error:nil]; } - (void)setInstantFuelConsumption:(nullable NSNumber *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (void)setFuelRange:(nullable NSArray *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable NSArray *)fuelRange { - return [parameters sdl_objectsForName:SDLRPCParameterNameFuelRange ofClass:SDLFuelRange.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameFuelRange ofClass:SDLFuelRange.class error:nil]; } - (nullable NSNumber *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; } - (void)setExternalTemperature:(nullable NSNumber *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable NSNumber *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; } - (void)setVin:(nullable NSString *)vin { - [parameters sdl_setObject:vin forName:SDLRPCParameterNameVIN]; + [self.parameters sdl_setObject:vin forName:SDLRPCParameterNameVIN]; } - (nullable NSString *)vin { - return [parameters sdl_objectForName:SDLRPCParameterNameVIN ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameVIN ofClass:NSString.class error:nil]; } - (void)setPrndl:(nullable SDLPRNDL)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable SDLPRNDL)prndl { - return [parameters sdl_enumForName:SDLRPCParameterNamePRNDL error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNamePRNDL error:nil]; } - (void)setTirePressure:(nullable SDLTireStatus *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable SDLTireStatus *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLTireStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLTireStatus.class error:nil]; } - (void)setOdometer:(nullable NSNumber *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable NSNumber *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; } - (void)setBeltStatus:(nullable SDLBeltStatus *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable SDLBeltStatus *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLBeltStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLBeltStatus.class error:nil]; } - (void)setBodyInformation:(nullable SDLBodyInformation *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable SDLBodyInformation *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLBodyInformation.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLBodyInformation.class error:nil]; } - (void)setDeviceStatus:(nullable SDLDeviceStatus *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable SDLDeviceStatus *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLDeviceStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLDeviceStatus.class error:nil]; } - (void)setDriverBraking:(nullable SDLVehicleDataEventStatus)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable SDLVehicleDataEventStatus)driverBraking { - return [parameters sdl_enumForName:SDLRPCParameterNameDriverBraking error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameDriverBraking error:nil]; } - (void)setWiperStatus:(nullable SDLWiperStatus)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable SDLWiperStatus)wiperStatus { - return [parameters sdl_enumForName:SDLRPCParameterNameWiperStatus error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameWiperStatus error:nil]; } - (void)setHeadLampStatus:(nullable SDLHeadLampStatus *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable SDLHeadLampStatus *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLHeadLampStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLHeadLampStatus.class error:nil]; } - (void)setEngineOilLife:(nullable NSNumber *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable NSNumber *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; } - (void)setEngineTorque:(nullable NSNumber *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable NSNumber *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; } - (void)setAccPedalPosition:(nullable NSNumber *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable NSNumber *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; } - (void)setSteeringWheelAngle:(nullable NSNumber *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable NSNumber *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; } - (void)setECallInfo:(nullable SDLECallInfo *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable SDLECallInfo *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLECallInfo.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLECallInfo.class error:nil]; } - (void)setAirbagStatus:(nullable SDLAirbagStatus *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable SDLAirbagStatus *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLAirbagStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLAirbagStatus.class error:nil]; } - (void)setEmergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable SDLEmergencyEvent *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLEmergencyEvent.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLEmergencyEvent.class error:nil]; } - (void)setClusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus { - [parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; + [self.parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; } - (nullable SDLClusterModeStatus *)clusterModeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:SDLClusterModeStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:SDLClusterModeStatus.class error:nil]; } - (void)setMyKey:(nullable SDLMyKey *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable SDLMyKey *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLMyKey.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLMyKey.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus { - return [parameters sdl_enumForName:SDLRPCParameterNameElectronicParkBrakeStatus error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameElectronicParkBrakeStatus error:nil]; } - (void)setTurnSignal:(nullable SDLTurnSignal)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable SDLTurnSignal)turnSignal { - return [parameters sdl_enumForName:SDLRPCParameterNameTurnSignal error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameTurnSignal error:nil]; } - (void)setCloudAppVehicleID:(nullable NSString *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable NSString *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetWayPoints.m b/SmartDeviceLink/SDLGetWayPoints.m index 1c3ebe700..6e7f7a489 100644 --- a/SmartDeviceLink/SDLGetWayPoints.m +++ b/SmartDeviceLink/SDLGetWayPoints.m @@ -11,11 +11,14 @@ @implementation SDLGetWayPoints +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetWayPoints]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithType:(SDLWayPointType)type { @@ -30,11 +33,11 @@ - (instancetype)initWithType:(SDLWayPointType)type { } - (void)setWaypointType:(nullable SDLWayPointType)waypointType { - [parameters sdl_setObject:waypointType forName:SDLRPCParameterNameWayPointType]; + [self.parameters sdl_setObject:waypointType forName:SDLRPCParameterNameWayPointType]; } - (nullable SDLWayPointType)waypointType { - return [parameters sdl_enumForName:SDLRPCParameterNameWayPointType error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameWayPointType error:nil]; } @end diff --git a/SmartDeviceLink/SDLGetWayPointsResponse.m b/SmartDeviceLink/SDLGetWayPointsResponse.m index 19e5ca6cb..fec11281a 100644 --- a/SmartDeviceLink/SDLGetWayPointsResponse.m +++ b/SmartDeviceLink/SDLGetWayPointsResponse.m @@ -12,18 +12,21 @@ @implementation SDLGetWayPointsResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameGetWayPoints]) { } return self; } +#pragma clang diagnostic pop - (void)setWaypoints:(nullable NSArray *)waypoints { - [parameters sdl_setObject:waypoints forName:SDLRPCParameterNameWayPoints]; + [self.parameters sdl_setObject:waypoints forName:SDLRPCParameterNameWayPoints]; } - (nullable NSArray *)waypoints { - return [parameters sdl_objectsForName:SDLRPCParameterNameWayPoints ofClass:SDLLocationDetails.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameWayPoints ofClass:SDLLocationDetails.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLHMICapabilities.m b/SmartDeviceLink/SDLHMICapabilities.m index 11fa60306..353d90a27 100644 --- a/SmartDeviceLink/SDLHMICapabilities.m +++ b/SmartDeviceLink/SDLHMICapabilities.m @@ -12,27 +12,27 @@ @implementation SDLHMICapabilities - (void)setNavigation:(nullable NSNumber *)navigation { - [store sdl_setObject:navigation forName:SDLRPCParameterNameNavigation]; + [self.store sdl_setObject:navigation forName:SDLRPCParameterNameNavigation]; } - (nullable NSNumber *)navigation { - return [store sdl_objectForName:SDLRPCParameterNameNavigation ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNavigation ofClass:NSNumber.class error:nil]; } - (void)setPhoneCall:(nullable NSNumber *)phoneCall { - [store sdl_setObject:phoneCall forName:SDLRPCParameterNamePhoneCall]; + [self.store sdl_setObject:phoneCall forName:SDLRPCParameterNamePhoneCall]; } - (nullable NSNumber *)phoneCall { - return [store sdl_objectForName:SDLRPCParameterNamePhoneCall ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePhoneCall ofClass:NSNumber.class error:nil]; } - (void)setVideoStreaming:(nullable NSNumber *)videoStreaming { - [store sdl_setObject:videoStreaming forName:SDLRPCParameterNameVideoStreaming]; + [self.store sdl_setObject:videoStreaming forName:SDLRPCParameterNameVideoStreaming]; } - (nullable NSNumber *)videoStreaming { - return [store sdl_objectForName:SDLRPCParameterNameVideoStreaming ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVideoStreaming ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLHMIPermissions.m b/SmartDeviceLink/SDLHMIPermissions.m index b48ca2be4..5cd8bb8a7 100644 --- a/SmartDeviceLink/SDLHMIPermissions.m +++ b/SmartDeviceLink/SDLHMIPermissions.m @@ -12,21 +12,21 @@ @implementation SDLHMIPermissions - (void)setAllowed:(NSArray *)allowed { - [store sdl_setObject:allowed forName:SDLRPCParameterNameAllowed]; + [self.store sdl_setObject:allowed forName:SDLRPCParameterNameAllowed]; } - (NSArray *)allowed { NSError *error = nil; - return [store sdl_enumsForName:SDLRPCParameterNameAllowed error:&error]; + return [self.store sdl_enumsForName:SDLRPCParameterNameAllowed error:&error]; } - (void)setUserDisallowed:(NSArray *)userDisallowed { - [store sdl_setObject:userDisallowed forName:SDLRPCParameterNameUserDisallowed]; + [self.store sdl_setObject:userDisallowed forName:SDLRPCParameterNameUserDisallowed]; } - (NSArray *)userDisallowed { NSError *error = nil; - return [store sdl_enumsForName:SDLRPCParameterNameUserDisallowed error:&error]; + return [self.store sdl_enumsForName:SDLRPCParameterNameUserDisallowed error:&error]; } @end diff --git a/SmartDeviceLink/SDLHMISettingsControlCapabilities.m b/SmartDeviceLink/SDLHMISettingsControlCapabilities.m index fc93c8005..82eff7c81 100644 --- a/SmartDeviceLink/SDLHMISettingsControlCapabilities.m +++ b/SmartDeviceLink/SDLHMISettingsControlCapabilities.m @@ -33,37 +33,37 @@ - (instancetype)initWithModuleName:(NSString *)moduleName distanceUnitAvailable: } - (void)setModuleName:(NSString *)moduleName { - [store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; + [self.store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; } - (NSString *)moduleName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; } - (void)setDistanceUnitAvailable:(nullable NSNumber *)distanceUnitAvailable { - [store sdl_setObject:distanceUnitAvailable forName:SDLRPCParameterNameDistanceUnitAvailable]; + [self.store sdl_setObject:distanceUnitAvailable forName:SDLRPCParameterNameDistanceUnitAvailable]; } - (nullable NSNumber *)distanceUnitAvailable { - return [store sdl_objectForName:SDLRPCParameterNameDistanceUnitAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDistanceUnitAvailable ofClass:NSNumber.class error:nil]; } - (void)setTemperatureUnitAvailable:(nullable NSNumber *)temperatureUnitAvailable { - [store sdl_setObject:temperatureUnitAvailable forName:SDLRPCParameterNameTemperatureUnitAvailable]; + [self.store sdl_setObject:temperatureUnitAvailable forName:SDLRPCParameterNameTemperatureUnitAvailable]; } - (nullable NSNumber *)temperatureUnitAvailable { - return [store sdl_objectForName:SDLRPCParameterNameTemperatureUnitAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTemperatureUnitAvailable ofClass:NSNumber.class error:nil]; } - (void)setDisplayModeUnitAvailable:(nullable NSNumber *)displayModeUnitAvailable { - [store sdl_setObject:displayModeUnitAvailable forName:SDLRPCParameterNameDisplayModeUnitAvailable]; + [self.store sdl_setObject:displayModeUnitAvailable forName:SDLRPCParameterNameDisplayModeUnitAvailable]; } - (nullable NSNumber *)displayModeUnitAvailable { - return [store sdl_objectForName:SDLRPCParameterNameDisplayModeUnitAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDisplayModeUnitAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLHMISettingsControlData.m b/SmartDeviceLink/SDLHMISettingsControlData.m index 15a36ed52..df7982e85 100644 --- a/SmartDeviceLink/SDLHMISettingsControlData.m +++ b/SmartDeviceLink/SDLHMISettingsControlData.m @@ -22,27 +22,27 @@ - (instancetype)initWithDisplaymode:(SDLDisplayMode)displayMode temperatureUnit: } - (void)setDisplayMode:(nullable SDLDisplayMode)displayMode { - [store sdl_setObject:displayMode forName:SDLRPCParameterNameDisplayMode]; + [self.store sdl_setObject:displayMode forName:SDLRPCParameterNameDisplayMode]; } - (nullable SDLDisplayMode)displayMode { - return [store sdl_enumForName:SDLRPCParameterNameDisplayMode error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameDisplayMode error:nil]; } - (void)setDistanceUnit:(nullable SDLDistanceUnit)distanceUnit { - [store sdl_setObject:distanceUnit forName:SDLRPCParameterNameDistanceUnit]; + [self.store sdl_setObject:distanceUnit forName:SDLRPCParameterNameDistanceUnit]; } - (nullable SDLDistanceUnit)distanceUnit { - return [store sdl_enumForName:SDLRPCParameterNameDistanceUnit error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameDistanceUnit error:nil]; } - (void)setTemperatureUnit:(nullable SDLTemperatureUnit)temperatureUnit { - [store sdl_setObject:temperatureUnit forName:SDLRPCParameterNameTemperatureUnit]; + [self.store sdl_setObject:temperatureUnit forName:SDLRPCParameterNameTemperatureUnit]; } - (nullable SDLTemperatureUnit)temperatureUnit { - return [store sdl_enumForName:SDLRPCParameterNameTemperatureUnit error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameTemperatureUnit error:nil]; } @end diff --git a/SmartDeviceLink/SDLHapticRect.m b/SmartDeviceLink/SDLHapticRect.m index b7d74c3a3..6641f528c 100644 --- a/SmartDeviceLink/SDLHapticRect.m +++ b/SmartDeviceLink/SDLHapticRect.m @@ -28,20 +28,20 @@ - (instancetype)initWithId:(UInt32)id rect:(nonnull SDLRectangle *)rect { } - (void)setId:(NSNumber *)id { - [store sdl_setObject:id forName:SDLRPCParameterNameId]; + [self.store sdl_setObject:id forName:SDLRPCParameterNameId]; } - (NSNumber *)id { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameId ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameId ofClass:NSNumber.class error:&error]; } - (void)setRect:(SDLRectangle *)rect { - [store sdl_setObject:rect forName:SDLRPCParameterNameRect]; + [self.store sdl_setObject:rect forName:SDLRPCParameterNameRect]; } - (SDLRectangle *)rect { - return [store sdl_objectForName:SDLRPCParameterNameRect ofClass:SDLRectangle.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRect ofClass:SDLRectangle.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLHeadLampStatus.m b/SmartDeviceLink/SDLHeadLampStatus.m index 89bad48ee..e9f018f02 100644 --- a/SmartDeviceLink/SDLHeadLampStatus.m +++ b/SmartDeviceLink/SDLHeadLampStatus.m @@ -12,29 +12,29 @@ @implementation SDLHeadLampStatus - (void)setLowBeamsOn:(NSNumber *)lowBeamsOn { - [store sdl_setObject:lowBeamsOn forName:SDLRPCParameterNameLowBeamsOn]; + [self.store sdl_setObject:lowBeamsOn forName:SDLRPCParameterNameLowBeamsOn]; } - (NSNumber *)lowBeamsOn { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLowBeamsOn ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLowBeamsOn ofClass:NSNumber.class error:&error]; } - (void)setHighBeamsOn:(NSNumber *)highBeamsOn { - [store sdl_setObject:highBeamsOn forName:SDLRPCParameterNameHighBeamsOn]; + [self.store sdl_setObject:highBeamsOn forName:SDLRPCParameterNameHighBeamsOn]; } - (NSNumber *)highBeamsOn { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameHighBeamsOn ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameHighBeamsOn ofClass:NSNumber.class error:&error]; } - (void)setAmbientLightSensorStatus:(nullable SDLAmbientLightStatus)ambientLightSensorStatus { - [store sdl_setObject:ambientLightSensorStatus forName:SDLRPCParameterNameAmbientLightSensorStatus]; + [self.store sdl_setObject:ambientLightSensorStatus forName:SDLRPCParameterNameAmbientLightSensorStatus]; } - (nullable SDLAmbientLightStatus)ambientLightSensorStatus { - return [store sdl_enumForName:SDLRPCParameterNameAmbientLightSensorStatus error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameAmbientLightSensorStatus error:nil]; } @end diff --git a/SmartDeviceLink/SDLImage.m b/SmartDeviceLink/SDLImage.m index 7a2dd72cd..740cb4584 100644 --- a/SmartDeviceLink/SDLImage.m +++ b/SmartDeviceLink/SDLImage.m @@ -57,29 +57,29 @@ - (instancetype)initWithStaticIconName:(SDLStaticIconName)staticIconName { #pragma mark - Getters / Setters - (void)setValue:(NSString *)value { - [store sdl_setObject:value forName:SDLRPCParameterNameValue]; + [self.store sdl_setObject:value forName:SDLRPCParameterNameValue]; } - (NSString *)value { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameValue ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameValue ofClass:NSString.class error:&error]; } - (void)setImageType:(SDLImageType)imageType { - [store sdl_setObject:imageType forName:SDLRPCParameterNameImageType]; + [self.store sdl_setObject:imageType forName:SDLRPCParameterNameImageType]; } - (SDLImageType)imageType { - return [store sdl_enumForName:SDLRPCParameterNameImageType error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameImageType error:nil]; } - (void)setIsTemplate:(NSNumber *)isTemplate { - [store sdl_setObject:isTemplate forName:SDLRPCParameterNameImageTemplate]; + [self.store sdl_setObject:isTemplate forName:SDLRPCParameterNameImageTemplate]; } - (NSNumber *)isTemplate { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameImageTemplate ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameImageTemplate ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLImageField.m b/SmartDeviceLink/SDLImageField.m index 94a6ccedc..e866db1d7 100644 --- a/SmartDeviceLink/SDLImageField.m +++ b/SmartDeviceLink/SDLImageField.m @@ -13,29 +13,29 @@ @implementation SDLImageField - (void)setName:(SDLImageFieldName)name { - [store sdl_setObject:name forName:SDLRPCParameterNameName]; + [self.store sdl_setObject:name forName:SDLRPCParameterNameName]; } - (SDLImageFieldName)name { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameName error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameName error:&error]; } - (void)setImageTypeSupported:(NSArray *)imageTypeSupported { - [store sdl_setObject:imageTypeSupported forName:SDLRPCParameterNameImageTypeSupported]; + [self.store sdl_setObject:imageTypeSupported forName:SDLRPCParameterNameImageTypeSupported]; } - (NSArray *)imageTypeSupported { NSError *error = nil; - return [store sdl_enumsForName:SDLRPCParameterNameImageTypeSupported error:&error]; + return [self.store sdl_enumsForName:SDLRPCParameterNameImageTypeSupported error:&error]; } - (void)setImageResolution:(nullable SDLImageResolution *)imageResolution { - [store sdl_setObject:imageResolution forName:SDLRPCParameterNameImageResolution]; + [self.store sdl_setObject:imageResolution forName:SDLRPCParameterNameImageResolution]; } - (nullable SDLImageResolution *)imageResolution { - return [store sdl_objectForName:SDLRPCParameterNameImageResolution ofClass:SDLImageResolution.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameImageResolution ofClass:SDLImageResolution.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLImageResolution.m b/SmartDeviceLink/SDLImageResolution.m index b85bf8e9b..b94e81996 100644 --- a/SmartDeviceLink/SDLImageResolution.m +++ b/SmartDeviceLink/SDLImageResolution.m @@ -22,21 +22,21 @@ - (instancetype)initWithWidth:(uint16_t)width height:(uint16_t)height { } - (void)setResolutionWidth:(NSNumber *)resolutionWidth { - [store sdl_setObject:resolutionWidth forName:SDLRPCParameterNameResolutionWidth]; + [self.store sdl_setObject:resolutionWidth forName:SDLRPCParameterNameResolutionWidth]; } - (NSNumber *)resolutionWidth { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameResolutionWidth ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameResolutionWidth ofClass:NSNumber.class error:&error]; } - (void)setResolutionHeight:(NSNumber *)resolutionHeight { - [store sdl_setObject:resolutionHeight forName:SDLRPCParameterNameResolutionHeight]; + [self.store sdl_setObject:resolutionHeight forName:SDLRPCParameterNameResolutionHeight]; } - (NSNumber *)resolutionHeight { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameResolutionHeight ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameResolutionHeight ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLKeyboardProperties.m b/SmartDeviceLink/SDLKeyboardProperties.m index 1e6376f24..2e90ad4c1 100644 --- a/SmartDeviceLink/SDLKeyboardProperties.m +++ b/SmartDeviceLink/SDLKeyboardProperties.m @@ -26,43 +26,43 @@ - (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable } - (void)setLanguage:(nullable SDLLanguage)language { - [store sdl_setObject:language forName:SDLRPCParameterNameLanguage]; + [self.store sdl_setObject:language forName:SDLRPCParameterNameLanguage]; } - (nullable SDLLanguage)language { - return [store sdl_enumForName:SDLRPCParameterNameLanguage error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameLanguage error:nil]; } - (void)setKeyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout { - [store sdl_setObject:keyboardLayout forName:SDLRPCParameterNameKeyboardLayout]; + [self.store sdl_setObject:keyboardLayout forName:SDLRPCParameterNameKeyboardLayout]; } - (nullable SDLKeyboardLayout)keyboardLayout { - return [store sdl_enumForName:SDLRPCParameterNameKeyboardLayout error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameKeyboardLayout error:nil]; } - (void)setKeypressMode:(nullable SDLKeypressMode)keypressMode { - [store sdl_setObject:keypressMode forName:SDLRPCParameterNameKeypressMode]; + [self.store sdl_setObject:keypressMode forName:SDLRPCParameterNameKeypressMode]; } - (nullable SDLKeypressMode)keypressMode { - return [store sdl_enumForName:SDLRPCParameterNameKeypressMode error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameKeypressMode error:nil]; } - (void)setLimitedCharacterList:(nullable NSArray *)limitedCharacterList { - [store sdl_setObject:limitedCharacterList forName:SDLRPCParameterNameLimitedCharacterList]; + [self.store sdl_setObject:limitedCharacterList forName:SDLRPCParameterNameLimitedCharacterList]; } - (nullable NSArray *)limitedCharacterList { - return [store sdl_objectsForName:SDLRPCParameterNameLimitedCharacterList ofClass:NSString.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameLimitedCharacterList ofClass:NSString.class error:nil]; } - (void)setAutoCompleteText:(nullable NSString *)autoCompleteText { - [store sdl_setObject:autoCompleteText forName:SDLRPCParameterNameAutoCompleteText]; + [self.store sdl_setObject:autoCompleteText forName:SDLRPCParameterNameAutoCompleteText]; } - (nullable NSString *)autoCompleteText { - return [store sdl_objectForName:SDLRPCParameterNameAutoCompleteText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAutoCompleteText ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLLightCapabilities.m b/SmartDeviceLink/SDLLightCapabilities.m index cd24fe9a2..e2ea77793 100644 --- a/SmartDeviceLink/SDLLightCapabilities.m +++ b/SmartDeviceLink/SDLLightCapabilities.m @@ -33,36 +33,36 @@ - (instancetype)initWithName:(SDLLightName)name densityAvailable:(BOOL)densityAv } - (void)setName:(SDLLightName)name { - [store sdl_setObject:name forName:SDLRPCParameterNameName]; + [self.store sdl_setObject:name forName:SDLRPCParameterNameName]; } - (SDLLightName)name { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameName error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameName error:&error]; } - (void)setDensityAvailable:(nullable NSNumber *)densityAvailable { - [store sdl_setObject:densityAvailable forName:SDLRPCParameterNameDensityAvailable]; + [self.store sdl_setObject:densityAvailable forName:SDLRPCParameterNameDensityAvailable]; } - (nullable NSNumber *)densityAvailable { - return [store sdl_objectForName:SDLRPCParameterNameDensityAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDensityAvailable ofClass:NSNumber.class error:nil]; } - (void)setColorAvailable:(nullable NSNumber *)colorAvailable { - [store sdl_setObject:colorAvailable forName:SDLRPCParameterNameRGBColorSpaceAvailable]; + [self.store sdl_setObject:colorAvailable forName:SDLRPCParameterNameRGBColorSpaceAvailable]; } - (nullable NSNumber *)colorAvailable { - return [store sdl_objectForName:SDLRPCParameterNameRGBColorSpaceAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRGBColorSpaceAvailable ofClass:NSNumber.class error:nil]; } - (void)setStatusAvailable:(nullable NSNumber *)statusAvailable { - [store sdl_setObject:statusAvailable forName:SDLRPCParameterNameStatusAvailable]; + [self.store sdl_setObject:statusAvailable forName:SDLRPCParameterNameStatusAvailable]; } - (nullable NSNumber *)statusAvailable { - return [store sdl_objectForName:SDLRPCParameterNameStatusAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameStatusAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLLightControlCapabilities.m b/SmartDeviceLink/SDLLightControlCapabilities.m index 478e60f29..88c38e437 100644 --- a/SmartDeviceLink/SDLLightControlCapabilities.m +++ b/SmartDeviceLink/SDLLightControlCapabilities.m @@ -23,22 +23,22 @@ - (instancetype)initWithModuleName:(NSString *)moduleName supportedLights:(NSArr } - (void)setModuleName:(NSString *)moduleName { - [store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; + [self.store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; } - (NSString *)moduleName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; } - (void)setSupportedLights:(NSArray *)supportedLights { - [store sdl_setObject:supportedLights forName:SDLRPCParameterNameSupportedLights]; + [self.store sdl_setObject:supportedLights forName:SDLRPCParameterNameSupportedLights]; } - (NSArray *)supportedLights { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameSupportedLights ofClass:SDLLightCapabilities.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameSupportedLights ofClass:SDLLightCapabilities.class error:&error]; } diff --git a/SmartDeviceLink/SDLLightControlData.m b/SmartDeviceLink/SDLLightControlData.m index 586fe9a2d..f9699d805 100644 --- a/SmartDeviceLink/SDLLightControlData.m +++ b/SmartDeviceLink/SDLLightControlData.m @@ -21,12 +21,12 @@ -(instancetype)initWithLightStates:(NSArray *)lightState { } - (void)setLightState:(NSArray *)lightState { - [store sdl_setObject:lightState forName:SDLRPCParameterNameLightState]; + [self.store sdl_setObject:lightState forName:SDLRPCParameterNameLightState]; } - (NSArray *)lightState { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameLightState ofClass:SDLLightState.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameLightState ofClass:SDLLightState.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLLightState.m b/SmartDeviceLink/SDLLightState.m index 28357d3ef..cfd13c2f9 100644 --- a/SmartDeviceLink/SDLLightState.m +++ b/SmartDeviceLink/SDLLightState.m @@ -48,37 +48,37 @@ - (instancetype)initWithId:(SDLLightName)id lightStatus:(SDLLightStatus)lightSta } - (void)setId:(SDLLightName)id { - [store sdl_setObject:id forName:SDLRPCParameterNameId]; + [self.store sdl_setObject:id forName:SDLRPCParameterNameId]; } - (SDLLightName)id { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameId error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameId error:&error]; } - (void)setStatus:(SDLLightStatus)status { - [store sdl_setObject:status forName:SDLRPCParameterNameStatus]; + [self.store sdl_setObject:status forName:SDLRPCParameterNameStatus]; } - (SDLLightStatus)status { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameStatus error:&error]; } - (void)setDensity:(nullable NSNumber *)density { - [store sdl_setObject:density forName:SDLRPCParameterNameDensity]; + [self.store sdl_setObject:density forName:SDLRPCParameterNameDensity]; } - (nullable NSNumber *)density { - return [store sdl_objectForName:SDLRPCParameterNameDensity ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDensity ofClass:NSNumber.class error:nil]; } - (void)setColor:(nullable SDLRGBColor *)color { - [store sdl_setObject:color forName:SDLRPCParameterNameColor]; + [self.store sdl_setObject:color forName:SDLRPCParameterNameColor]; } - (nullable SDLRGBColor *)color { - return [store sdl_objectForName:SDLRPCParameterNameColor ofClass:SDLRGBColor.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameColor ofClass:SDLRGBColor.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLListFiles.m b/SmartDeviceLink/SDLListFiles.m index f9ee924ed..2dd53639e 100644 --- a/SmartDeviceLink/SDLListFiles.m +++ b/SmartDeviceLink/SDLListFiles.m @@ -12,11 +12,14 @@ @implementation SDLListFiles +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameListFiles]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLListFilesResponse.m b/SmartDeviceLink/SDLListFilesResponse.m index e3ef9e8b0..a70c842b1 100644 --- a/SmartDeviceLink/SDLListFilesResponse.m +++ b/SmartDeviceLink/SDLListFilesResponse.m @@ -12,26 +12,29 @@ @implementation SDLListFilesResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameListFiles]) { } return self; } +#pragma clang diagnostic pop - (void)setFilenames:(nullable NSArray *)filenames { - [parameters sdl_setObject:filenames forName:SDLRPCParameterNameFilenames]; + [self.parameters sdl_setObject:filenames forName:SDLRPCParameterNameFilenames]; } - (nullable NSArray *)filenames { - return [parameters sdl_objectsForName:SDLRPCParameterNameFilenames ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameFilenames ofClass:NSString.class error:nil]; } - (void)setSpaceAvailable:(nullable NSNumber *)spaceAvailable { - [parameters sdl_setObject:spaceAvailable forName:SDLRPCParameterNameSpaceAvailable]; + [self.parameters sdl_setObject:spaceAvailable forName:SDLRPCParameterNameSpaceAvailable]; } - (nullable NSNumber *)spaceAvailable { - return [parameters sdl_objectForName:SDLRPCParameterNameSpaceAvailable ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpaceAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLLocationCoordinate.m b/SmartDeviceLink/SDLLocationCoordinate.m index 79bd42028..5130f75c7 100644 --- a/SmartDeviceLink/SDLLocationCoordinate.m +++ b/SmartDeviceLink/SDLLocationCoordinate.m @@ -23,21 +23,21 @@ - (instancetype)initWithLatitudeDegrees:(float)latitudeDegrees longitudeDegrees: } - (void)setLongitudeDegrees:(NSNumber *)longitudeDegrees { - [store sdl_setObject:longitudeDegrees forName:SDLRPCParameterNameLongitudeDegrees]; + [self.store sdl_setObject:longitudeDegrees forName:SDLRPCParameterNameLongitudeDegrees]; } - (NSNumber *)longitudeDegrees { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLongitudeDegrees ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLongitudeDegrees ofClass:NSNumber.class error:&error]; } - (void)setLatitudeDegrees:(NSNumber *)latitudeDegrees { - [store sdl_setObject:latitudeDegrees forName:SDLRPCParameterNameLatitudeDegrees]; + [self.store sdl_setObject:latitudeDegrees forName:SDLRPCParameterNameLatitudeDegrees]; } - (NSNumber *)latitudeDegrees { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLatitudeDegrees ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLatitudeDegrees ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLLocationDetails.m b/SmartDeviceLink/SDLLocationDetails.m index 8de7aa7ea..6d34852e8 100644 --- a/SmartDeviceLink/SDLLocationDetails.m +++ b/SmartDeviceLink/SDLLocationDetails.m @@ -41,59 +41,59 @@ - (instancetype)initWithCoordinate:(SDLLocationCoordinate *)coordinate locationN } - (void)setCoordinate:(nullable SDLLocationCoordinate *)coordinate { - [store sdl_setObject:coordinate forName:SDLRPCParameterNameLocationCoordinate]; + [self.store sdl_setObject:coordinate forName:SDLRPCParameterNameLocationCoordinate]; } - (nullable SDLLocationCoordinate *)coordinate { - return [store sdl_objectForName:SDLRPCParameterNameLocationCoordinate ofClass:SDLLocationCoordinate.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocationCoordinate ofClass:SDLLocationCoordinate.class error:nil]; } - (void)setLocationName:(nullable NSString *)locationName { - [store sdl_setObject:locationName forName:SDLRPCParameterNameLocationName]; + [self.store sdl_setObject:locationName forName:SDLRPCParameterNameLocationName]; } - (nullable NSString *)locationName { - return [store sdl_objectForName:SDLRPCParameterNameLocationName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocationName ofClass:NSString.class error:nil]; } - (void)setAddressLines:(nullable NSArray *)addressLines { - [store sdl_setObject:addressLines forName:SDLRPCParameterNameAddressLines]; + [self.store sdl_setObject:addressLines forName:SDLRPCParameterNameAddressLines]; } - (nullable NSArray *)addressLines { - return [store sdl_objectsForName:SDLRPCParameterNameAddressLines ofClass:NSString.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameAddressLines ofClass:NSString.class error:nil]; } - (void)setLocationDescription:(nullable NSString *)locationDescription { - [store sdl_setObject:locationDescription forName:SDLRPCParameterNameLocationDescription]; + [self.store sdl_setObject:locationDescription forName:SDLRPCParameterNameLocationDescription]; } - (nullable NSString *)locationDescription { - return [store sdl_objectForName:SDLRPCParameterNameLocationDescription ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocationDescription ofClass:NSString.class error:nil]; } - (void)setPhoneNumber:(nullable NSString *)phoneNumber { - [store sdl_setObject:phoneNumber forName:SDLRPCParameterNamePhoneNumber]; + [self.store sdl_setObject:phoneNumber forName:SDLRPCParameterNamePhoneNumber]; } - (nullable NSString *)phoneNumber { - return [store sdl_objectForName:SDLRPCParameterNamePhoneNumber ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePhoneNumber ofClass:NSString.class error:nil]; } - (void)setLocationImage:(nullable SDLImage *)locationImage { - [store sdl_setObject:locationImage forName:SDLRPCParameterNameLocationImage]; + [self.store sdl_setObject:locationImage forName:SDLRPCParameterNameLocationImage]; } - (nullable SDLImage *)locationImage { - return [store sdl_objectForName:SDLRPCParameterNameLocationImage ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocationImage ofClass:SDLImage.class error:nil]; } - (void)setSearchAddress:(nullable SDLOasisAddress *)searchAddress { - [store sdl_setObject:searchAddress forName:SDLRPCParameterNameSearchAddress]; + [self.store sdl_setObject:searchAddress forName:SDLRPCParameterNameSearchAddress]; } - (nullable SDLOasisAddress *)searchAddress { - return [store sdl_objectForName:SDLRPCParameterNameSearchAddress ofClass:SDLOasisAddress.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSearchAddress ofClass:SDLOasisAddress.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLMassageCushionFirmness.m b/SmartDeviceLink/SDLMassageCushionFirmness.m index fe3bc6335..96dacd0fc 100644 --- a/SmartDeviceLink/SDLMassageCushionFirmness.m +++ b/SmartDeviceLink/SDLMassageCushionFirmness.m @@ -22,21 +22,21 @@ - (instancetype)initWithMassageCushion:(SDLMassageCushion)cushion firmness:(UInt } - (void)setCushion:(SDLMassageCushion)cushion { - [store sdl_setObject:cushion forName:SDLRPCParameterNameCushion]; + [self.store sdl_setObject:cushion forName:SDLRPCParameterNameCushion]; } - (SDLMassageCushion)cushion { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameCushion error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameCushion error:&error]; } - (void)setFirmness:(NSNumber *)firmness { - [store sdl_setObject:firmness forName:SDLRPCParameterNameFirmness]; + [self.store sdl_setObject:firmness forName:SDLRPCParameterNameFirmness]; } - (NSNumber *)firmness { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameFirmness ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameFirmness ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLMassageModeData.m b/SmartDeviceLink/SDLMassageModeData.m index 35fa3a8b3..fbcd4dde7 100644 --- a/SmartDeviceLink/SDLMassageModeData.m +++ b/SmartDeviceLink/SDLMassageModeData.m @@ -22,21 +22,21 @@ - (instancetype)initWithMassageMode:(SDLMassageMode)massageMode massageZone:(SDL } - (void)setMassageMode:(SDLMassageMode)massageMode { - [store sdl_setObject:massageMode forName:SDLRPCParameterNameMassageMode]; + [self.store sdl_setObject:massageMode forName:SDLRPCParameterNameMassageMode]; } - (SDLMassageMode)massageMode { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMassageMode error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMassageMode error:&error]; } - (void)setMassageZone:(SDLMassageZone)massageZone { - [store sdl_setObject:massageZone forName:SDLRPCParameterNameMassageZone]; + [self.store sdl_setObject:massageZone forName:SDLRPCParameterNameMassageZone]; } - (SDLMassageZone)massageZone { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameMassageZone error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameMassageZone error:&error]; } @end diff --git a/SmartDeviceLink/SDLMediaServiceData.m b/SmartDeviceLink/SDLMediaServiceData.m index 4abb6c5d2..a605e9bf6 100644 --- a/SmartDeviceLink/SDLMediaServiceData.m +++ b/SmartDeviceLink/SDLMediaServiceData.m @@ -38,99 +38,99 @@ - (instancetype)initWithMediaType:(nullable SDLMediaType)mediaType mediaTitle:(n } - (void)setMediaType:(nullable SDLMediaType)mediaType { - [store sdl_setObject:mediaType forName:SDLRPCParameterNameMediaType]; + [self.store sdl_setObject:mediaType forName:SDLRPCParameterNameMediaType]; } - (nullable SDLMediaType)mediaType { - return [store sdl_enumForName:SDLRPCParameterNameMediaType error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameMediaType error:nil]; } - (void)setMediaTitle:(nullable NSString *)mediaTitle { - [store sdl_setObject:mediaTitle forName:SDLRPCParameterNameMediaTitle]; + [self.store sdl_setObject:mediaTitle forName:SDLRPCParameterNameMediaTitle]; } - (nullable NSString *)mediaTitle { - return [store sdl_objectForName:SDLRPCParameterNameMediaTitle ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMediaTitle ofClass:NSString.class error:nil]; } - (void)setMediaArtist:(nullable NSString *)mediaArtist { - [store sdl_setObject:mediaArtist forName:SDLRPCParameterNameMediaArtist]; + [self.store sdl_setObject:mediaArtist forName:SDLRPCParameterNameMediaArtist]; } - (nullable NSString *)mediaArtist { - return [store sdl_objectForName:SDLRPCParameterNameMediaArtist ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMediaArtist ofClass:NSString.class error:nil]; } - (void)setMediaAlbum:(nullable NSString *)mediaAlbum { - [store sdl_setObject:mediaAlbum forName:SDLRPCParameterNameMediaAlbum]; + [self.store sdl_setObject:mediaAlbum forName:SDLRPCParameterNameMediaAlbum]; } - (nullable NSString *)mediaAlbum { - return [store sdl_objectForName:SDLRPCParameterNameMediaAlbum ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMediaAlbum ofClass:NSString.class error:nil]; } - (void)setPlaylistName:(nullable NSString *)playlistName { - [store sdl_setObject:playlistName forName:SDLRPCParameterNamePlaylistName]; + [self.store sdl_setObject:playlistName forName:SDLRPCParameterNamePlaylistName]; } - (nullable NSString *)playlistName { - return [store sdl_objectForName:SDLRPCParameterNamePlaylistName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePlaylistName ofClass:NSString.class error:nil]; } - (void)setIsExplicit:(nullable NSNumber *)isExplicit { - [store sdl_setObject:isExplicit forName:SDLRPCParameterNameIsExplicit]; + [self.store sdl_setObject:isExplicit forName:SDLRPCParameterNameIsExplicit]; } - (nullable NSNumber *)isExplicit { - return [store sdl_objectForName:SDLRPCParameterNameIsExplicit ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameIsExplicit ofClass:NSNumber.class error:nil]; } - (void)setTrackPlaybackProgress:(nullable NSNumber *)trackPlaybackProgress { - [store sdl_setObject:trackPlaybackProgress forName:SDLRPCParameterNameTrackPlaybackProgress]; + [self.store sdl_setObject:trackPlaybackProgress forName:SDLRPCParameterNameTrackPlaybackProgress]; } - (nullable NSNumber *)trackPlaybackProgress { - return [store sdl_objectForName:SDLRPCParameterNameTrackPlaybackProgress ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTrackPlaybackProgress ofClass:NSNumber.class error:nil]; } - (void)setTrackPlaybackDuration:(nullable NSNumber *)trackPlaybackDuration { - [store sdl_setObject:trackPlaybackDuration forName:SDLRPCParameterNameTrackPlaybackDuration]; + [self.store sdl_setObject:trackPlaybackDuration forName:SDLRPCParameterNameTrackPlaybackDuration]; } - (nullable NSNumber *)trackPlaybackDuration { - return [store sdl_objectForName:SDLRPCParameterNameTrackPlaybackDuration ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTrackPlaybackDuration ofClass:NSNumber.class error:nil]; } - (void)setQueuePlaybackProgress:(nullable NSNumber *)queuePlaybackProgress { - [store sdl_setObject:queuePlaybackProgress forName:SDLRPCParameterNameQueuePlaybackProgress]; + [self.store sdl_setObject:queuePlaybackProgress forName:SDLRPCParameterNameQueuePlaybackProgress]; } - (nullable NSNumber *)queuePlaybackProgress { - return [store sdl_objectForName:SDLRPCParameterNameQueuePlaybackProgress ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameQueuePlaybackProgress ofClass:NSNumber.class error:nil]; } - (void)setQueuePlaybackDuration:(nullable NSNumber *)queuePlaybackDuration { - [store sdl_setObject:queuePlaybackDuration forName:SDLRPCParameterNameQueuePlaybackDuration]; + [self.store sdl_setObject:queuePlaybackDuration forName:SDLRPCParameterNameQueuePlaybackDuration]; } - (nullable NSNumber *)queuePlaybackDuration { - return [store sdl_objectForName:SDLRPCParameterNameQueuePlaybackDuration ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameQueuePlaybackDuration ofClass:NSNumber.class error:nil]; } - (void)setQueueCurrentTrackNumber:(nullable NSNumber *)queueCurrentTrackNumber { - [store sdl_setObject:queueCurrentTrackNumber forName:SDLRPCParameterNameQueueCurrentTrackNumber]; + [self.store sdl_setObject:queueCurrentTrackNumber forName:SDLRPCParameterNameQueueCurrentTrackNumber]; } - (nullable NSNumber *)queueCurrentTrackNumber { - return [store sdl_objectForName:SDLRPCParameterNameQueueCurrentTrackNumber ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameQueueCurrentTrackNumber ofClass:NSNumber.class error:nil]; } - (void)setQueueTotalTrackCount:(nullable NSNumber *)queueTotalTrackCount { - [store sdl_setObject:queueTotalTrackCount forName:SDLRPCParameterNameQueueTotalTrackCount]; + [self.store sdl_setObject:queueTotalTrackCount forName:SDLRPCParameterNameQueueTotalTrackCount]; } - (nullable NSNumber *)queueTotalTrackCount { - return [store sdl_objectForName:SDLRPCParameterNameQueueTotalTrackCount ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameQueueTotalTrackCount ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLMenuParams.m b/SmartDeviceLink/SDLMenuParams.m index 89242ffdb..0fcfbd60e 100644 --- a/SmartDeviceLink/SDLMenuParams.m +++ b/SmartDeviceLink/SDLMenuParams.m @@ -35,27 +35,27 @@ - (instancetype)initWithMenuName:(NSString *)menuName { } - (void)setParentID:(nullable NSNumber *)parentID { - [store sdl_setObject:parentID forName:SDLRPCParameterNameParentId]; + [self.store sdl_setObject:parentID forName:SDLRPCParameterNameParentId]; } - (nullable NSNumber *)parentID { - return [store sdl_objectForName:SDLRPCParameterNameParentId ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameParentId ofClass:NSNumber.class error:nil]; } - (void)setPosition:(nullable NSNumber *)position { - [store sdl_setObject:position forName:SDLRPCParameterNamePosition]; + [self.store sdl_setObject:position forName:SDLRPCParameterNamePosition]; } - (nullable NSNumber *)position { - return [store sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:nil]; } - (void)setMenuName:(NSString *)menuName { - [store sdl_setObject:menuName forName:SDLRPCParameterNameMenuName]; + [self.store sdl_setObject:menuName forName:SDLRPCParameterNameMenuName]; } - (NSString *)menuName { - return [store sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMenuName ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLMetadataTags.m b/SmartDeviceLink/SDLMetadataTags.m index 0b5850d07..d61d7237a 100644 --- a/SmartDeviceLink/SDLMetadataTags.m +++ b/SmartDeviceLink/SDLMetadataTags.m @@ -42,35 +42,35 @@ - (instancetype)initWithTextFieldTypes:(nullable NSArray *)main } - (void)setMainField1:(nullable NSArray *)mainField1 { - [store sdl_setObject:mainField1 forName:SDLRPCParameterNameMainField1]; + [self.store sdl_setObject:mainField1 forName:SDLRPCParameterNameMainField1]; } - (nullable NSArray *)mainField1 { - return [store sdl_enumsForName:SDLRPCParameterNameMainField1 error:nil]; + return [self.store sdl_enumsForName:SDLRPCParameterNameMainField1 error:nil]; } - (void)setMainField2:(nullable NSArray *)mainField2 { - [store sdl_setObject:mainField2 forName:SDLRPCParameterNameMainField2]; + [self.store sdl_setObject:mainField2 forName:SDLRPCParameterNameMainField2]; } - (nullable NSArray *)mainField2 { - return [store sdl_enumsForName:SDLRPCParameterNameMainField2 error:nil]; + return [self.store sdl_enumsForName:SDLRPCParameterNameMainField2 error:nil]; } - (void)setMainField3:(nullable NSArray *)mainField3 { - [store sdl_setObject:mainField3 forName:SDLRPCParameterNameMainField3]; + [self.store sdl_setObject:mainField3 forName:SDLRPCParameterNameMainField3]; } - (nullable NSArray *)mainField3 { - return [store sdl_enumsForName:SDLRPCParameterNameMainField3 error:nil]; + return [self.store sdl_enumsForName:SDLRPCParameterNameMainField3 error:nil]; } - (void)setMainField4:(nullable NSArray *)mainField4 { - [store sdl_setObject:mainField4 forName:SDLRPCParameterNameMainField4]; + [self.store sdl_setObject:mainField4 forName:SDLRPCParameterNameMainField4]; } - (nullable NSArray *)mainField4 { - return [store sdl_enumsForName:SDLRPCParameterNameMainField4 error:nil]; + return [self.store sdl_enumsForName:SDLRPCParameterNameMainField4 error:nil]; } @end diff --git a/SmartDeviceLink/SDLModuleData.m b/SmartDeviceLink/SDLModuleData.m index 64d2a5bf0..09ae37864 100644 --- a/SmartDeviceLink/SDLModuleData.m +++ b/SmartDeviceLink/SDLModuleData.m @@ -89,60 +89,60 @@ - (instancetype)initWithSeatControlData:(SDLSeatControlData *)seatControlData { } - (void)setModuleType:(SDLModuleType)moduleType { - [store sdl_setObject:moduleType forName:SDLRPCParameterNameModuleType]; + [self.store sdl_setObject:moduleType forName:SDLRPCParameterNameModuleType]; } - (SDLModuleType)moduleType { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameModuleType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameModuleType error:&error]; } - (void)setRadioControlData:(nullable SDLRadioControlData *)radioControlData { - [store sdl_setObject:radioControlData forName:SDLRPCParameterNameRadioControlData]; + [self.store sdl_setObject:radioControlData forName:SDLRPCParameterNameRadioControlData]; } - (nullable SDLRadioControlData *)radioControlData { - return [store sdl_objectForName:SDLRPCParameterNameRadioControlData ofClass:SDLRadioControlData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRadioControlData ofClass:SDLRadioControlData.class error:nil]; } - (void)setClimateControlData:(nullable SDLClimateControlData *)climateControlData { - [store sdl_setObject:climateControlData forName:SDLRPCParameterNameClimateControlData]; + [self.store sdl_setObject:climateControlData forName:SDLRPCParameterNameClimateControlData]; } - (nullable SDLClimateControlData *)climateControlData { - return [store sdl_objectForName:SDLRPCParameterNameClimateControlData ofClass:SDLClimateControlData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameClimateControlData ofClass:SDLClimateControlData.class error:nil]; } - (void)setSeatControlData:(nullable SDLSeatControlData *)seatControlData { - [store sdl_setObject:seatControlData forName:SDLRPCParameterNameSeatControlData]; + [self.store sdl_setObject:seatControlData forName:SDLRPCParameterNameSeatControlData]; } - (nullable SDLSeatControlData *)seatControlData { - return [store sdl_objectForName:SDLRPCParameterNameSeatControlData ofClass:SDLSeatControlData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSeatControlData ofClass:SDLSeatControlData.class error:nil]; } - (void)setAudioControlData:(nullable SDLAudioControlData *)audioControlData { - [store sdl_setObject:audioControlData forName:SDLRPCParameterNameAudioControlData]; + [self.store sdl_setObject:audioControlData forName:SDLRPCParameterNameAudioControlData]; } - (nullable SDLAudioControlData *)audioControlData { - return [store sdl_objectForName:SDLRPCParameterNameAudioControlData ofClass:SDLAudioControlData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAudioControlData ofClass:SDLAudioControlData.class error:nil]; } - (void)setLightControlData:(nullable SDLLightControlData *)lightControlData { - [store sdl_setObject:lightControlData forName:SDLRPCParameterNameLightControlData]; + [self.store sdl_setObject:lightControlData forName:SDLRPCParameterNameLightControlData]; } - (nullable SDLLightControlData *)lightControlData { - return [store sdl_objectForName:SDLRPCParameterNameLightControlData ofClass:SDLLightControlData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLightControlData ofClass:SDLLightControlData.class error:nil]; } - (void)setHmiSettingsControlData:(nullable SDLHMISettingsControlData *)hmiSettingsControlData { - [store sdl_setObject:hmiSettingsControlData forName:SDLRPCParameterNameHmiSettingsControlData]; + [self.store sdl_setObject:hmiSettingsControlData forName:SDLRPCParameterNameHmiSettingsControlData]; } - (nullable SDLHMISettingsControlData *)hmiSettingsControlData { - return [store sdl_objectForName:SDLRPCParameterNameHmiSettingsControlData ofClass:SDLHMISettingsControlData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHmiSettingsControlData ofClass:SDLHMISettingsControlData.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLMyKey.m b/SmartDeviceLink/SDLMyKey.m index 0d79bc07a..6ed384039 100644 --- a/SmartDeviceLink/SDLMyKey.m +++ b/SmartDeviceLink/SDLMyKey.m @@ -12,12 +12,12 @@ @implementation SDLMyKey - (void)setE911Override:(SDLVehicleDataStatus)e911Override { - [store sdl_setObject:e911Override forName:SDLRPCParameterNameE911Override]; + [self.store sdl_setObject:e911Override forName:SDLRPCParameterNameE911Override]; } - (SDLVehicleDataStatus)e911Override { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameE911Override error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameE911Override error:&error]; } @end diff --git a/SmartDeviceLink/SDLNavigationCapability.m b/SmartDeviceLink/SDLNavigationCapability.m index 60c2034d4..7f536bc5a 100644 --- a/SmartDeviceLink/SDLNavigationCapability.m +++ b/SmartDeviceLink/SDLNavigationCapability.m @@ -28,19 +28,19 @@ - (instancetype)initWithSendLocation:(BOOL)sendLocationEnabled waypoints:(BOOL)w } - (void)setSendLocationEnabled:(nullable NSNumber *)sendLocationEnabled { - [store sdl_setObject:sendLocationEnabled forName:SDLRPCParameterNameSendLocationEnabled]; + [self.store sdl_setObject:sendLocationEnabled forName:SDLRPCParameterNameSendLocationEnabled]; } - (nullable NSNumber *)sendLocationEnabled { - return [store sdl_objectForName:SDLRPCParameterNameSendLocationEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSendLocationEnabled ofClass:NSNumber.class error:nil]; } - (void)setGetWayPointsEnabled:(nullable NSNumber *)getWayPointsEnabled { - [store sdl_setObject:getWayPointsEnabled forName:SDLRPCParameterNameGetWayPointsEnabled]; + [self.store sdl_setObject:getWayPointsEnabled forName:SDLRPCParameterNameGetWayPointsEnabled]; } - (nullable NSNumber *)getWayPointsEnabled { - return [store sdl_objectForName:SDLRPCParameterNameGetWayPointsEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameGetWayPointsEnabled ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLNavigationInstruction.m b/SmartDeviceLink/SDLNavigationInstruction.m index 701ed2453..d6e8e66d0 100644 --- a/SmartDeviceLink/SDLNavigationInstruction.m +++ b/SmartDeviceLink/SDLNavigationInstruction.m @@ -48,67 +48,67 @@ - (instancetype)initWithLocationDetails:(SDLLocationDetails *)locationDetails ac } - (void)setLocationDetails:(SDLLocationDetails *)locationDetails { - [store sdl_setObject:locationDetails forName:SDLRPCParameterNameLocationDetails]; + [self.store sdl_setObject:locationDetails forName:SDLRPCParameterNameLocationDetails]; } - (SDLLocationDetails *)locationDetails { - return [store sdl_objectForName:SDLRPCParameterNameLocationDetails ofClass:SDLLocationDetails.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocationDetails ofClass:SDLLocationDetails.class error:nil]; } - (void)setAction:(SDLNavigationAction)action { - [store sdl_setObject:action forName:SDLRPCParameterNameAction]; + [self.store sdl_setObject:action forName:SDLRPCParameterNameAction]; } - (SDLNavigationAction)action { - return [store sdl_enumForName:SDLRPCParameterNameAction error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameAction error:nil]; } - (void)setEta:(nullable SDLDateTime *)eta { - [store sdl_setObject:eta forName:SDLRPCParameterNameETA]; + [self.store sdl_setObject:eta forName:SDLRPCParameterNameETA]; } - (nullable SDLDateTime *)eta { - return [store sdl_objectForName:SDLRPCParameterNameETA ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameETA ofClass:SDLDateTime.class error:nil]; } - (void)setBearing:(nullable NSNumber *)bearing { - [store sdl_setObject:bearing forName:SDLRPCParameterNameBearing]; + [self.store sdl_setObject:bearing forName:SDLRPCParameterNameBearing]; } - (nullable NSNumber *)bearing { - return [store sdl_objectForName:SDLRPCParameterNameBearing ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameBearing ofClass:NSNumber.class error:nil]; } - (void)setJunctionType:(nullable SDLNavigationJunction)junctionType { - [store sdl_setObject:junctionType forName:SDLRPCParameterNameJunctionType]; + [self.store sdl_setObject:junctionType forName:SDLRPCParameterNameJunctionType]; } - (nullable SDLNavigationJunction)junctionType { - return [store sdl_enumForName:SDLRPCParameterNameJunctionType error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameJunctionType error:nil]; } - (void)setDrivingSide:(nullable SDLDirection)drivingSide { - [store sdl_setObject:drivingSide forName:SDLRPCParameterNameDrivingSide]; + [self.store sdl_setObject:drivingSide forName:SDLRPCParameterNameDrivingSide]; } - (nullable SDLDirection)drivingSide { - return [store sdl_enumForName:SDLRPCParameterNameDrivingSide error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameDrivingSide error:nil]; } - (void)setDetails:(nullable NSString *)details { - [store sdl_setObject:details forName:SDLRPCParameterNameDetails]; + [self.store sdl_setObject:details forName:SDLRPCParameterNameDetails]; } - (nullable NSString *)details { - return [store sdl_objectForName:SDLRPCParameterNameDetails ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDetails ofClass:NSString.class error:nil]; } - (void)setImage:(nullable SDLImage *)image { - [store sdl_setObject:image forName:SDLRPCParameterNameImage]; + [self.store sdl_setObject:image forName:SDLRPCParameterNameImage]; } - (nullable SDLImage *)image { - return [store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLNavigationServiceData.m b/SmartDeviceLink/SDLNavigationServiceData.m index e1ef35a9a..6143c47ee 100644 --- a/SmartDeviceLink/SDLNavigationServiceData.m +++ b/SmartDeviceLink/SDLNavigationServiceData.m @@ -48,75 +48,75 @@ - (instancetype)initWithTimestamp:(SDLDateTime *)timestamp origin:(nullable SDLL } - (void)setTimestamp:(SDLDateTime *)timestamp { - [store sdl_setObject:timestamp forName:SDLRPCParameterNameTimeStamp]; + [self.store sdl_setObject:timestamp forName:SDLRPCParameterNameTimeStamp]; } - (SDLDateTime *)timestamp { - return [store sdl_objectForName:SDLRPCParameterNameTimeStamp ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTimeStamp ofClass:SDLDateTime.class error:nil]; } - (void)setOrigin:(nullable SDLLocationDetails *)origin { - [store sdl_setObject:origin forName:SDLRPCParameterNameOrigin]; + [self.store sdl_setObject:origin forName:SDLRPCParameterNameOrigin]; } - (nullable SDLLocationDetails *)origin { - return [store sdl_objectForName:SDLRPCParameterNameOrigin ofClass:SDLLocationDetails.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameOrigin ofClass:SDLLocationDetails.class error:nil]; } - (void)setDestination:(nullable SDLLocationDetails *)destination { - [store sdl_setObject:destination forName:SDLRPCParameterNameDestination]; + [self.store sdl_setObject:destination forName:SDLRPCParameterNameDestination]; } - (nullable SDLLocationDetails *)destination { - return [store sdl_objectForName:SDLRPCParameterNameDestination ofClass:SDLLocationDetails.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDestination ofClass:SDLLocationDetails.class error:nil]; } - (void)setDestinationETA:(nullable SDLDateTime *)destinationETA { - [store sdl_setObject:destinationETA forName:SDLRPCParameterNameDestinationETA]; + [self.store sdl_setObject:destinationETA forName:SDLRPCParameterNameDestinationETA]; } - (nullable SDLDateTime *)destinationETA { - return [store sdl_objectForName:SDLRPCParameterNameDestinationETA ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDestinationETA ofClass:SDLDateTime.class error:nil]; } - (void)setInstructions:(nullable NSArray *)instructions { - [store sdl_setObject:instructions forName:SDLRPCParameterNameInstructions]; + [self.store sdl_setObject:instructions forName:SDLRPCParameterNameInstructions]; } - (nullable NSArray *)instructions { - return [store sdl_objectsForName:SDLRPCParameterNameInstructions ofClass:SDLNavigationInstruction.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameInstructions ofClass:SDLNavigationInstruction.class error:nil]; } - (void)setNextInstructionETA:(nullable SDLDateTime *)nextInstructionETA { - [store sdl_setObject:nextInstructionETA forName:SDLRPCParameterNameNextInstructionETA]; + [self.store sdl_setObject:nextInstructionETA forName:SDLRPCParameterNameNextInstructionETA]; } - (nullable SDLDateTime *)nextInstructionETA { - return [store sdl_objectForName:SDLRPCParameterNameNextInstructionETA ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNextInstructionETA ofClass:SDLDateTime.class error:nil]; } - (void)setNextInstructionDistance:(nullable NSNumber *)nextInstructionDistance { - [store sdl_setObject:nextInstructionDistance forName:SDLRPCParameterNameNextInstructionDistance]; + [self.store sdl_setObject:nextInstructionDistance forName:SDLRPCParameterNameNextInstructionDistance]; } - (nullable NSNumber *)nextInstructionDistance { - return [store sdl_objectForName:SDLRPCParameterNameNextInstructionDistance ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNextInstructionDistance ofClass:NSNumber.class error:nil]; } - (void)setNextInstructionDistanceScale:(nullable NSNumber *)nextInstructionDistanceScale { - [store sdl_setObject:nextInstructionDistanceScale forName:SDLRPCParameterNameNextInstructionDistanceScale]; + [self.store sdl_setObject:nextInstructionDistanceScale forName:SDLRPCParameterNameNextInstructionDistanceScale]; } - (nullable NSNumber *)nextInstructionDistanceScale { - return [store sdl_objectForName:SDLRPCParameterNameNextInstructionDistanceScale ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNextInstructionDistanceScale ofClass:NSNumber.class error:nil]; } - (void)setPrompt:(nullable NSString *)prompt { - [store sdl_setObject:prompt forName:SDLRPCParameterNamePrompt]; + [self.store sdl_setObject:prompt forName:SDLRPCParameterNamePrompt]; } - (nullable NSString *)prompt { - return [store sdl_objectForName:SDLRPCParameterNamePrompt ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePrompt ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLNavigationServiceManifest.m b/SmartDeviceLink/SDLNavigationServiceManifest.m index 4211227f0..576946722 100644 --- a/SmartDeviceLink/SDLNavigationServiceManifest.m +++ b/SmartDeviceLink/SDLNavigationServiceManifest.m @@ -27,11 +27,11 @@ - (instancetype)initWithAcceptsWayPoints:(BOOL)acceptsWayPoints { } - (void)setAcceptsWayPoints:(nullable NSNumber *)acceptsWayPoints { - [store sdl_setObject:acceptsWayPoints forName:SDLRPCParameterNameAcceptsWayPoints]; + [self.store sdl_setObject:acceptsWayPoints forName:SDLRPCParameterNameAcceptsWayPoints]; } - (nullable NSNumber *)acceptsWayPoints { - return [store sdl_objectForName:SDLRPCParameterNameAcceptsWayPoints ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAcceptsWayPoints ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOasisAddress.m b/SmartDeviceLink/SDLOasisAddress.m index 634695db9..798804bd6 100644 --- a/SmartDeviceLink/SDLOasisAddress.m +++ b/SmartDeviceLink/SDLOasisAddress.m @@ -34,75 +34,75 @@ - (instancetype)initWithSubThoroughfare:(nullable NSString *)subThoroughfare tho } - (void)setCountryName:(nullable NSString *)countryName { - [store sdl_setObject:countryName forName:SDLRPCParameterNameCountryName]; + [self.store sdl_setObject:countryName forName:SDLRPCParameterNameCountryName]; } - (nullable NSString *)countryName { - return [store sdl_objectForName:SDLRPCParameterNameCountryName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCountryName ofClass:NSString.class error:nil]; } - (void)setCountryCode:(nullable NSString *)countryCode { - [store sdl_setObject:countryCode forName:SDLRPCParameterNameCountryCode]; + [self.store sdl_setObject:countryCode forName:SDLRPCParameterNameCountryCode]; } - (nullable NSString *)countryCode { - return [store sdl_objectForName:SDLRPCParameterNameCountryCode ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCountryCode ofClass:NSString.class error:nil]; } - (void)setPostalCode:(nullable NSString *)postalCode { - [store sdl_setObject:postalCode forName:SDLRPCParameterNamePostalCode]; + [self.store sdl_setObject:postalCode forName:SDLRPCParameterNamePostalCode]; } - (nullable NSString *)postalCode { - return [store sdl_objectForName:SDLRPCParameterNamePostalCode ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePostalCode ofClass:NSString.class error:nil]; } - (void)setAdministrativeArea:(nullable NSString *)administrativeArea { - [store sdl_setObject:administrativeArea forName:SDLRPCParameterNameAdministrativeArea]; + [self.store sdl_setObject:administrativeArea forName:SDLRPCParameterNameAdministrativeArea]; } - (nullable NSString *)administrativeArea { - return [store sdl_objectForName:SDLRPCParameterNameAdministrativeArea ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAdministrativeArea ofClass:NSString.class error:nil]; } - (void)setSubAdministrativeArea:(nullable NSString *)subAdministrativeArea { - [store sdl_setObject:subAdministrativeArea forName:SDLRPCParameterNameSubAdministrativeArea]; + [self.store sdl_setObject:subAdministrativeArea forName:SDLRPCParameterNameSubAdministrativeArea]; } - (nullable NSString *)subAdministrativeArea { - return [store sdl_objectForName:SDLRPCParameterNameSubAdministrativeArea ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSubAdministrativeArea ofClass:NSString.class error:nil]; } - (void)setLocality:(nullable NSString *)locality { - [store sdl_setObject:locality forName:SDLRPCParameterNameLocality]; + [self.store sdl_setObject:locality forName:SDLRPCParameterNameLocality]; } - (nullable NSString *)locality { - return [store sdl_objectForName:SDLRPCParameterNameLocality ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocality ofClass:NSString.class error:nil]; } - (void)setSubLocality:(nullable NSString *)subLocality { - [store sdl_setObject:subLocality forName:SDLRPCParameterNameSubLocality]; + [self.store sdl_setObject:subLocality forName:SDLRPCParameterNameSubLocality]; } - (nullable NSString *)subLocality { - return [store sdl_objectForName:SDLRPCParameterNameSubLocality ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSubLocality ofClass:NSString.class error:nil]; } - (void)setThoroughfare:(nullable NSString *)thoroughfare { - [store sdl_setObject:thoroughfare forName:SDLRPCParameterNameThoroughfare]; + [self.store sdl_setObject:thoroughfare forName:SDLRPCParameterNameThoroughfare]; } - (nullable NSString *)thoroughfare { - return [store sdl_objectForName:SDLRPCParameterNameThoroughfare ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameThoroughfare ofClass:NSString.class error:nil]; } - (void)setSubThoroughfare:(nullable NSString *)subThoroughfare { - [store sdl_setObject:subThoroughfare forName:SDLRPCParameterNameSubThoroughfare]; + [self.store sdl_setObject:subThoroughfare forName:SDLRPCParameterNameSubThoroughfare]; } - (nullable NSString *)subThoroughfare { - return [store sdl_objectForName:SDLRPCParameterNameSubThoroughfare ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSubThoroughfare ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnAppInterfaceUnregistered.m b/SmartDeviceLink/SDLOnAppInterfaceUnregistered.m index 39cd7acb1..c99ab7571 100644 --- a/SmartDeviceLink/SDLOnAppInterfaceUnregistered.m +++ b/SmartDeviceLink/SDLOnAppInterfaceUnregistered.m @@ -11,19 +11,22 @@ @implementation SDLOnAppInterfaceUnregistered +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnAppInterfaceUnregistered]) { } return self; } +#pragma clang diagnostic pop - (void)setReason:(SDLAppInterfaceUnregisteredReason)reason { - [parameters sdl_setObject:reason forName:SDLRPCParameterNameReason]; + [self.parameters sdl_setObject:reason forName:SDLRPCParameterNameReason]; } - (SDLAppInterfaceUnregisteredReason)reason { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameReason error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameReason error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnAppServiceData.m b/SmartDeviceLink/SDLOnAppServiceData.m index c532ff4ea..792721bb2 100644 --- a/SmartDeviceLink/SDLOnAppServiceData.m +++ b/SmartDeviceLink/SDLOnAppServiceData.m @@ -17,11 +17,14 @@ @implementation SDLOnAppServiceData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnAppServiceData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithServiceData:(SDLAppServiceData *)serviceData { self = [self init]; @@ -35,12 +38,12 @@ - (instancetype)initWithServiceData:(SDLAppServiceData *)serviceData { } - (void)setServiceData:(SDLAppServiceData *)serviceData { - [parameters sdl_setObject:serviceData forName:SDLRPCParameterNameServiceData]; + [self.parameters sdl_setObject:serviceData forName:SDLRPCParameterNameServiceData]; } - (SDLAppServiceData *)serviceData { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameServiceData ofClass:SDLAppServiceData.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameServiceData ofClass:SDLAppServiceData.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnAudioPassThru.m b/SmartDeviceLink/SDLOnAudioPassThru.m index 3775b5040..c404fbaa8 100644 --- a/SmartDeviceLink/SDLOnAudioPassThru.m +++ b/SmartDeviceLink/SDLOnAudioPassThru.m @@ -12,11 +12,14 @@ @implementation SDLOnAudioPassThru +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnAudioPassThru]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLOnButtonEvent.m b/SmartDeviceLink/SDLOnButtonEvent.m index 61a033e8a..3e9c57cd6 100644 --- a/SmartDeviceLink/SDLOnButtonEvent.m +++ b/SmartDeviceLink/SDLOnButtonEvent.m @@ -11,36 +11,39 @@ @implementation SDLOnButtonEvent +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnButtonEvent]) { } return self; } +#pragma clang diagnostic pop - (void)setButtonName:(SDLButtonName)buttonName { - [parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; + [self.parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; } - (SDLButtonName)buttonName { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; } - (void)setButtonEventMode:(SDLButtonEventMode)buttonEventMode { - [parameters sdl_setObject:buttonEventMode forName:SDLRPCParameterNameButtonEventMode]; + [self.parameters sdl_setObject:buttonEventMode forName:SDLRPCParameterNameButtonEventMode]; } - (SDLButtonEventMode)buttonEventMode { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonEventMode error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonEventMode error:&error]; } - (void)setCustomButtonID:(nullable NSNumber *)customButtonID { - [parameters sdl_setObject:customButtonID forName:SDLRPCParameterNameCustomButtonId]; + [self.parameters sdl_setObject:customButtonID forName:SDLRPCParameterNameCustomButtonId]; } - (nullable NSNumber *)customButtonID { - return [parameters sdl_objectForName:SDLRPCParameterNameCustomButtonId ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCustomButtonId ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnButtonPress.m b/SmartDeviceLink/SDLOnButtonPress.m index 90dc42e4b..2acced3d0 100644 --- a/SmartDeviceLink/SDLOnButtonPress.m +++ b/SmartDeviceLink/SDLOnButtonPress.m @@ -11,36 +11,39 @@ @implementation SDLOnButtonPress +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnButtonPress]) { } return self; } +#pragma clang diagnostic pop - (void)setButtonName:(SDLButtonName)buttonName { - [parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; + [self.parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; } - (SDLButtonName)buttonName { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; } - (void)setButtonPressMode:(SDLButtonPressMode)buttonPressMode { - [parameters sdl_setObject:buttonPressMode forName:SDLRPCParameterNameButtonPressMode]; + [self.parameters sdl_setObject:buttonPressMode forName:SDLRPCParameterNameButtonPressMode]; } - (SDLButtonPressMode)buttonPressMode { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonPressMode error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonPressMode error:&error]; } - (void)setCustomButtonID:(nullable NSNumber *)customButtonID { - [parameters sdl_setObject:customButtonID forName:SDLRPCParameterNameCustomButtonId]; + [self.parameters sdl_setObject:customButtonID forName:SDLRPCParameterNameCustomButtonId]; } - (nullable NSNumber *)customButtonID { - return [parameters sdl_objectForName:SDLRPCParameterNameCustomButtonId ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCustomButtonId ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnCommand.m b/SmartDeviceLink/SDLOnCommand.m index b6048249e..40a975057 100644 --- a/SmartDeviceLink/SDLOnCommand.m +++ b/SmartDeviceLink/SDLOnCommand.m @@ -11,28 +11,31 @@ @implementation SDLOnCommand +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnCommand]) { } return self; } +#pragma clang diagnostic pop - (void)setCmdID:(NSNumber *)cmdID { - [parameters sdl_setObject:cmdID forName:SDLRPCParameterNameCommandId]; + [self.parameters sdl_setObject:cmdID forName:SDLRPCParameterNameCommandId]; } - (NSNumber *)cmdID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameCommandId ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCommandId ofClass:NSNumber.class error:&error]; } - (void)setTriggerSource:(SDLTriggerSource)triggerSource { - [parameters sdl_setObject:triggerSource forName:SDLRPCParameterNameTriggerSource]; + [self.parameters sdl_setObject:triggerSource forName:SDLRPCParameterNameTriggerSource]; } - (SDLTriggerSource)triggerSource { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameTriggerSource error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameTriggerSource error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnDriverDistraction.m b/SmartDeviceLink/SDLOnDriverDistraction.m index 147964af8..e65ef63d5 100644 --- a/SmartDeviceLink/SDLOnDriverDistraction.m +++ b/SmartDeviceLink/SDLOnDriverDistraction.m @@ -12,19 +12,22 @@ @implementation SDLOnDriverDistraction +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnDriverDistraction]) { } return self; } +#pragma clang diagnostic pop - (void)setState:(SDLDriverDistractionState)state { - [parameters sdl_setObject:state forName:SDLRPCParameterNameState]; + [self.parameters sdl_setObject:state forName:SDLRPCParameterNameState]; } - (SDLDriverDistractionState)state { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameState error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameState error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnEncodedSyncPData.m b/SmartDeviceLink/SDLOnEncodedSyncPData.m index 873411c80..b1526794e 100644 --- a/SmartDeviceLink/SDLOnEncodedSyncPData.m +++ b/SmartDeviceLink/SDLOnEncodedSyncPData.m @@ -11,35 +11,38 @@ @implementation SDLOnEncodedSyncPData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnEncodedSyncPData]) { } return self; } +#pragma clang diagnostic pop - (void)setData:(NSArray *)data { - [parameters sdl_setObject:data forName:SDLRPCParameterNameData]; + [self.parameters sdl_setObject:data forName:SDLRPCParameterNameData]; } - (NSArray *)data { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameData ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameData ofClass:NSString.class error:&error]; } - (void)setURL:(nullable NSString *)URL { - [parameters sdl_setObject:URL forName:SDLRPCParameterNameURLUppercase]; + [self.parameters sdl_setObject:URL forName:SDLRPCParameterNameURLUppercase]; } - (nullable NSString *)URL { - return [parameters sdl_objectForName:SDLRPCParameterNameURLUppercase ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameURLUppercase ofClass:NSString.class error:nil]; } - (void)setTimeout:(nullable NSNumber *)Timeout { - [parameters sdl_setObject:Timeout forName:SDLRPCParameterNameTimeoutCapitalized]; + [self.parameters sdl_setObject:Timeout forName:SDLRPCParameterNameTimeoutCapitalized]; } - (nullable NSNumber *)Timeout { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeoutCapitalized ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeoutCapitalized ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnHMIStatus.m b/SmartDeviceLink/SDLOnHMIStatus.m index 8ab94e60f..aa6b93e66 100644 --- a/SmartDeviceLink/SDLOnHMIStatus.m +++ b/SmartDeviceLink/SDLOnHMIStatus.m @@ -14,45 +14,48 @@ @implementation SDLOnHMIStatus +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnHMIStatus]) { } return self; } +#pragma clang diagnostic pop - (void)setHmiLevel:(SDLHMILevel)hmiLevel { - [parameters sdl_setObject:hmiLevel forName:SDLRPCParameterNameHMILevel]; + [self.parameters sdl_setObject:hmiLevel forName:SDLRPCParameterNameHMILevel]; } - (SDLHMILevel)hmiLevel { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameHMILevel error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameHMILevel error:&error]; } - (void)setAudioStreamingState:(SDLAudioStreamingState)audioStreamingState { - [parameters sdl_setObject:audioStreamingState forName:SDLRPCParameterNameAudioStreamingState]; + [self.parameters sdl_setObject:audioStreamingState forName:SDLRPCParameterNameAudioStreamingState]; } - (SDLAudioStreamingState)audioStreamingState { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameAudioStreamingState error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameAudioStreamingState error:&error]; } - (void)setVideoStreamingState:(nullable SDLVideoStreamingState)videoStreamingState { - [parameters sdl_setObject:videoStreamingState forName:SDLRPCParameterNameVideoStreamingState]; + [self.parameters sdl_setObject:videoStreamingState forName:SDLRPCParameterNameVideoStreamingState]; } - (nullable SDLVideoStreamingState)videoStreamingState { - return [parameters sdl_enumForName:SDLRPCParameterNameVideoStreamingState error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameVideoStreamingState error:nil]; } - (void)setSystemContext:(SDLSystemContext)systemContext { - [parameters sdl_setObject:systemContext forName:SDLRPCParameterNameSystemContext]; + [self.parameters sdl_setObject:systemContext forName:SDLRPCParameterNameSystemContext]; } - (SDLSystemContext)systemContext { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameSystemContext error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameSystemContext error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnHashChange.m b/SmartDeviceLink/SDLOnHashChange.m index 7f0f6e9b4..f7114a411 100644 --- a/SmartDeviceLink/SDLOnHashChange.m +++ b/SmartDeviceLink/SDLOnHashChange.m @@ -12,19 +12,22 @@ @implementation SDLOnHashChange +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnHashChange]) { } return self; } +#pragma clang diagnostic pop - (void)setHashID:(NSString *)hashID { - [parameters sdl_setObject:hashID forName:SDLRPCParameterNameHashId]; + [self.parameters sdl_setObject:hashID forName:SDLRPCParameterNameHashId]; } - (NSString *)hashID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameHashId ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHashId ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnInteriorVehicleData.m b/SmartDeviceLink/SDLOnInteriorVehicleData.m index f052ceaae..58eff5575 100644 --- a/SmartDeviceLink/SDLOnInteriorVehicleData.m +++ b/SmartDeviceLink/SDLOnInteriorVehicleData.m @@ -12,19 +12,22 @@ @implementation SDLOnInteriorVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnInteriorVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setModuleData:(SDLModuleData *)moduleData { - [parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; + [self.parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; } - (SDLModuleData *)moduleData { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnKeyboardInput.m b/SmartDeviceLink/SDLOnKeyboardInput.m index 6f781c377..57850321a 100644 --- a/SmartDeviceLink/SDLOnKeyboardInput.m +++ b/SmartDeviceLink/SDLOnKeyboardInput.m @@ -11,27 +11,30 @@ @implementation SDLOnKeyboardInput +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnKeyboardInput]) { } return self; } +#pragma clang diagnostic pop - (void)setEvent:(SDLKeyboardEvent)event { - [parameters sdl_setObject:event forName:SDLRPCParameterNameEvent]; + [self.parameters sdl_setObject:event forName:SDLRPCParameterNameEvent]; } - (SDLKeyboardEvent)event { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameEvent error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameEvent error:&error]; } - (void)setData:(nullable NSString *)data { - [parameters sdl_setObject:data forName:SDLRPCParameterNameData]; + [self.parameters sdl_setObject:data forName:SDLRPCParameterNameData]; } - (nullable NSString *)data { - return [parameters sdl_objectForName:SDLRPCParameterNameData ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameData ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnLanguageChange.m b/SmartDeviceLink/SDLOnLanguageChange.m index 922b86eec..cee3f7965 100644 --- a/SmartDeviceLink/SDLOnLanguageChange.m +++ b/SmartDeviceLink/SDLOnLanguageChange.m @@ -12,28 +12,31 @@ @implementation SDLOnLanguageChange +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnLanguageChange]) { } return self; } +#pragma clang diagnostic pop - (void)setLanguage:(SDLLanguage)language { - [parameters sdl_setObject:language forName:SDLRPCParameterNameLanguage]; + [self.parameters sdl_setObject:language forName:SDLRPCParameterNameLanguage]; } - (SDLLanguage)language { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameLanguage error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameLanguage error:&error]; } - (void)setHmiDisplayLanguage:(SDLLanguage)hmiDisplayLanguage { - [parameters sdl_setObject:hmiDisplayLanguage forName:SDLRPCParameterNameHMIDisplayLanguage]; + [self.parameters sdl_setObject:hmiDisplayLanguage forName:SDLRPCParameterNameHMIDisplayLanguage]; } - (SDLLanguage)hmiDisplayLanguage { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguage error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguage error:&error]; } diff --git a/SmartDeviceLink/SDLOnLockScreenStatus.m b/SmartDeviceLink/SDLOnLockScreenStatus.m index 7c24099e4..563b593bb 100644 --- a/SmartDeviceLink/SDLOnLockScreenStatus.m +++ b/SmartDeviceLink/SDLOnLockScreenStatus.m @@ -15,46 +15,49 @@ @implementation SDLOnLockScreenStatus +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnLockScreenStatus]) { } return self; } +#pragma clang diagnostic pop - (void)setLockScreenStatus:(SDLLockScreenStatus)lockScreenStatus { - [parameters sdl_setObject:lockScreenStatus forName:SDLRPCParameterNameOnLockScreenStatus]; + [self.parameters sdl_setObject:lockScreenStatus forName:SDLRPCParameterNameOnLockScreenStatus]; } - (SDLLockScreenStatus)lockScreenStatus { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameOnLockScreenStatus error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameOnLockScreenStatus error:&error]; } - (void)setHmiLevel:(SDLHMILevel)hmiLevel { - [parameters sdl_setObject:hmiLevel forName:SDLRPCParameterNameHMILevel]; + [self.parameters sdl_setObject:hmiLevel forName:SDLRPCParameterNameHMILevel]; } - (SDLHMILevel)hmiLevel { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameHMILevel error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameHMILevel error:&error]; } - (void)setUserSelected:(NSNumber *)userSelected { - [parameters sdl_setObject:userSelected forName:SDLRPCParameterNameUserSelected]; + [self.parameters sdl_setObject:userSelected forName:SDLRPCParameterNameUserSelected]; } - (NSNumber *)userSelected { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameUserSelected ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameUserSelected ofClass:NSNumber.class error:&error]; } - (void)setDriverDistractionStatus:(NSNumber *)driverDistractionStatus { - [parameters sdl_setObject:driverDistractionStatus forName:SDLRPCParameterNameDriverDistractionStatus]; + [self.parameters sdl_setObject:driverDistractionStatus forName:SDLRPCParameterNameDriverDistractionStatus]; } - (NSNumber *)driverDistractionStatus { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameDriverDistractionStatus ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDriverDistractionStatus ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnPermissionsChange.m b/SmartDeviceLink/SDLOnPermissionsChange.m index f517a197d..11250c209 100644 --- a/SmartDeviceLink/SDLOnPermissionsChange.m +++ b/SmartDeviceLink/SDLOnPermissionsChange.m @@ -12,19 +12,22 @@ @implementation SDLOnPermissionsChange +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnPermissionsChange]) { } return self; } +#pragma clang diagnostic pop - (void)setPermissionItem:(NSArray *)permissionItem { - [parameters sdl_setObject:permissionItem forName:SDLRPCParameterNamePermissionItem]; + [self.parameters sdl_setObject:permissionItem forName:SDLRPCParameterNamePermissionItem]; } - (NSArray *)permissionItem { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNamePermissionItem ofClass:SDLPermissionItem.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNamePermissionItem ofClass:SDLPermissionItem.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnRCStatus.m b/SmartDeviceLink/SDLOnRCStatus.m index 551131661..aa1295f3f 100644 --- a/SmartDeviceLink/SDLOnRCStatus.m +++ b/SmartDeviceLink/SDLOnRCStatus.m @@ -12,37 +12,40 @@ @implementation SDLOnRCStatus +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnRCStatus]) { } return self; } +#pragma clang diagnostic pop - (nullable NSNumber *)allowed { - return [parameters sdl_objectForName:SDLRPCParameterNameAllowed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAllowed ofClass:NSNumber.class error:nil]; } - (void)setAllowed:(nullable NSNumber *)allowed { - [parameters sdl_setObject:allowed forName:SDLRPCParameterNameAllowed]; + [self.parameters sdl_setObject:allowed forName:SDLRPCParameterNameAllowed]; } - (void)setAllocatedModules:(NSArray *)allocatedModules { - [parameters sdl_setObject:allocatedModules forName:SDLRPCParameterNameAllocatedModules]; + [self.parameters sdl_setObject:allocatedModules forName:SDLRPCParameterNameAllocatedModules]; } - (NSArray *)allocatedModules { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameAllocatedModules ofClass:SDLModuleData.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameAllocatedModules ofClass:SDLModuleData.class error:&error]; } - (void)setFreeModules:(NSArray *)freeModules { - [parameters sdl_setObject:freeModules forName:SDLRPCParameterNameFreeModules]; + [self.parameters sdl_setObject:freeModules forName:SDLRPCParameterNameFreeModules]; } - (NSArray *)freeModules { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameFreeModules ofClass:SDLModuleData.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameFreeModules ofClass:SDLModuleData.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnSyncPData.m b/SmartDeviceLink/SDLOnSyncPData.m index d470b80c2..89541683f 100644 --- a/SmartDeviceLink/SDLOnSyncPData.m +++ b/SmartDeviceLink/SDLOnSyncPData.m @@ -13,26 +13,29 @@ @implementation SDLOnSyncPData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnSyncPData]) { } return self; } +#pragma clang diagnostic pop - (void)setURL:(nullable NSString *)URL { - [parameters sdl_setObject:URL forName:SDLRPCParameterNameURLUppercase]; + [self.parameters sdl_setObject:URL forName:SDLRPCParameterNameURLUppercase]; } - (nullable NSString *)URL { - return [parameters sdl_objectForName:SDLRPCParameterNameURLUppercase ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameURLUppercase ofClass:NSString.class error:nil]; } - (void)setTimeout:(nullable NSNumber *)Timeout { - [parameters sdl_setObject:Timeout forName:SDLRPCParameterNameTimeoutCapitalized]; + [self.parameters sdl_setObject:Timeout forName:SDLRPCParameterNameTimeoutCapitalized]; } - (nullable NSNumber *)Timeout { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeoutCapitalized ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeoutCapitalized ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnSystemCapabilityUpdated.m b/SmartDeviceLink/SDLOnSystemCapabilityUpdated.m index f9809e12d..4c3de1e3a 100644 --- a/SmartDeviceLink/SDLOnSystemCapabilityUpdated.m +++ b/SmartDeviceLink/SDLOnSystemCapabilityUpdated.m @@ -17,11 +17,14 @@ @implementation SDLOnSystemCapabilityUpdated +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnSystemCapabilityUpdated]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithSystemCapability:(SDLSystemCapability *)systemCapability { self = [self init]; @@ -35,12 +38,12 @@ - (instancetype)initWithSystemCapability:(SDLSystemCapability *)systemCapability } - (void)setSystemCapability:(SDLSystemCapability *)systemCapability { - [parameters sdl_setObject:systemCapability forName:SDLRPCParameterNameSystemCapability]; + [self.parameters sdl_setObject:systemCapability forName:SDLRPCParameterNameSystemCapability]; } - (SDLSystemCapability *)systemCapability { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSystemCapability ofClass:SDLSystemCapability.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSystemCapability ofClass:SDLSystemCapability.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnSystemRequest.m b/SmartDeviceLink/SDLOnSystemRequest.m index 211d68528..174726c0d 100644 --- a/SmartDeviceLink/SDLOnSystemRequest.m +++ b/SmartDeviceLink/SDLOnSystemRequest.m @@ -11,67 +11,70 @@ @implementation SDLOnSystemRequest +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnSystemRequest]) { } return self; } +#pragma clang diagnostic pop - (void)setRequestType:(SDLRequestType)requestType { - [parameters sdl_setObject:requestType forName:SDLRPCParameterNameRequestType]; + [self.parameters sdl_setObject:requestType forName:SDLRPCParameterNameRequestType]; } - (SDLRequestType)requestType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameRequestType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameRequestType error:&error]; } - (void)setRequestSubType:(nullable NSString *)requestSubType { - [parameters sdl_setObject:requestSubType forName:SDLRPCParameterNameRequestSubType]; + [self.parameters sdl_setObject:requestSubType forName:SDLRPCParameterNameRequestSubType]; } - (nullable NSString *)requestSubType { - return [parameters sdl_objectForName:SDLRPCParameterNameRequestSubType ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRequestSubType ofClass:NSString.class error:nil]; } - (void)setUrl:(nullable NSString *)url { - [parameters sdl_setObject:url forName:SDLRPCParameterNameURL]; + [self.parameters sdl_setObject:url forName:SDLRPCParameterNameURL]; } - (nullable NSString *)url { - return [parameters sdl_objectForName:SDLRPCParameterNameURL ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameURL ofClass:NSString.class error:nil]; } - (void)setTimeout:(nullable NSNumber *)timeout { - [parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; + [self.parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; } - (nullable NSNumber *)timeout { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; } - (void)setFileType:(nullable SDLFileType)fileType { - [parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; + [self.parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; } - (nullable SDLFileType)fileType { - return [parameters sdl_enumForName:SDLRPCParameterNameFileType error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameFileType error:nil]; } - (void)setOffset:(nullable NSNumber *)offset { - [parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; + [self.parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; } - (nullable NSNumber *)offset { - return [parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; } - (void)setLength:(nullable NSNumber *)length { - [parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; + [self.parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; } - (nullable NSNumber *)length { - return [parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnTBTClientState.m b/SmartDeviceLink/SDLOnTBTClientState.m index de8017174..4a6695e06 100644 --- a/SmartDeviceLink/SDLOnTBTClientState.m +++ b/SmartDeviceLink/SDLOnTBTClientState.m @@ -11,19 +11,22 @@ @implementation SDLOnTBTClientState +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnTBTClientState]) { } return self; } +#pragma clang diagnostic pop - (void)setState:(SDLTBTState)state { - [parameters sdl_setObject:state forName:SDLRPCParameterNameState]; + [self.parameters sdl_setObject:state forName:SDLRPCParameterNameState]; } - (SDLTBTState)state { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameState error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameState error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnTouchEvent.m b/SmartDeviceLink/SDLOnTouchEvent.m index 0d8eea442..1995f7d86 100644 --- a/SmartDeviceLink/SDLOnTouchEvent.m +++ b/SmartDeviceLink/SDLOnTouchEvent.m @@ -12,28 +12,31 @@ @implementation SDLOnTouchEvent +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnTouchEvent]) { } return self; } +#pragma clang diagnostic pop - (void)setType:(SDLTouchType)type { - [parameters sdl_setObject:type forName:SDLRPCParameterNameType]; + [self.parameters sdl_setObject:type forName:SDLRPCParameterNameType]; } - (SDLTouchType)type { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameType error:&error]; } - (void)setEvent:(NSArray *)event { - [parameters sdl_setObject:event forName:SDLRPCParameterNameEvent]; + [self.parameters sdl_setObject:event forName:SDLRPCParameterNameEvent]; } - (NSArray *)event { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameEvent ofClass:SDLTouchEvent.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameEvent ofClass:SDLTouchEvent.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLOnVehicleData.m b/SmartDeviceLink/SDLOnVehicleData.m index 3e07fe7e9..6dc6b0aa5 100644 --- a/SmartDeviceLink/SDLOnVehicleData.m +++ b/SmartDeviceLink/SDLOnVehicleData.m @@ -23,250 +23,253 @@ @implementation SDLOnVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setGps:(nullable SDLGPSData *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable SDLGPSData *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLGPSData.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLGPSData.class error:nil]; } - (void)setSpeed:(nullable NSNumber *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable NSNumber *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; } - (void)setRpm:(nullable NSNumber *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable NSNumber *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel:(nullable NSNumber *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable NSNumber *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel_State:(nullable SDLComponentVolumeStatus)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable SDLComponentVolumeStatus)fuelLevel_State { - return [parameters sdl_enumForName:SDLRPCParameterNameFuelLevelState error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameFuelLevelState error:nil]; } - (void)setFuelRange:(nullable NSArray *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable NSArray *)fuelRange { - return [parameters sdl_objectsForName:SDLRPCParameterNameFuelRange ofClass:SDLFuelRange.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameFuelRange ofClass:SDLFuelRange.class error:nil]; } - (void)setInstantFuelConsumption:(nullable NSNumber *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (nullable NSNumber *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; } - (void)setExternalTemperature:(nullable NSNumber *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable NSNumber *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; } - (void)setVin:(nullable NSString *)vin { - [parameters sdl_setObject:vin forName:SDLRPCParameterNameVIN]; + [self.parameters sdl_setObject:vin forName:SDLRPCParameterNameVIN]; } - (nullable NSString *)vin { - return [parameters sdl_objectForName:SDLRPCParameterNameVIN ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameVIN ofClass:NSString.class error:nil]; } - (void)setPrndl:(nullable SDLPRNDL)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable SDLPRNDL)prndl { - return [parameters sdl_enumForName:SDLRPCParameterNamePRNDL error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNamePRNDL error:nil]; } - (void)setTirePressure:(nullable SDLTireStatus *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable SDLTireStatus *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLTireStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLTireStatus.class error:nil]; } - (void)setOdometer:(nullable NSNumber *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable NSNumber *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; } - (void)setBeltStatus:(nullable SDLBeltStatus *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable SDLBeltStatus *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLBeltStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLBeltStatus.class error:nil]; } - (void)setBodyInformation:(nullable SDLBodyInformation *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable SDLBodyInformation *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLBodyInformation.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLBodyInformation.class error:nil]; } - (void)setDeviceStatus:(nullable SDLDeviceStatus *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable SDLDeviceStatus *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLDeviceStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLDeviceStatus.class error:nil]; } - (void)setDriverBraking:(nullable SDLVehicleDataEventStatus)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable SDLVehicleDataEventStatus)driverBraking { - return [parameters sdl_enumForName:SDLRPCParameterNameDriverBraking error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameDriverBraking error:nil]; } - (void)setWiperStatus:(nullable SDLWiperStatus)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable SDLWiperStatus)wiperStatus { - return [parameters sdl_enumForName:SDLRPCParameterNameWiperStatus error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameWiperStatus error:nil]; } - (void)setHeadLampStatus:(nullable SDLHeadLampStatus *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable SDLHeadLampStatus *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLHeadLampStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLHeadLampStatus.class error:nil]; } - (void)setEngineOilLife:(nullable NSNumber *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable NSNumber *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; } - (void)setEngineTorque:(nullable NSNumber *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable NSNumber *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; } - (void)setAccPedalPosition:(nullable NSNumber *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable NSNumber *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; } - (void)setSteeringWheelAngle:(nullable NSNumber *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable NSNumber *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; } - (void)setECallInfo:(nullable SDLECallInfo *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable SDLECallInfo *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLECallInfo.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLECallInfo.class error:nil]; } - (void)setAirbagStatus:(nullable SDLAirbagStatus *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable SDLAirbagStatus *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLAirbagStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLAirbagStatus.class error:nil]; } - (void)setEmergencyEvent:(nullable SDLEmergencyEvent *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable SDLEmergencyEvent *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLEmergencyEvent.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLEmergencyEvent.class error:nil]; } - (void)setClusterModeStatus:(nullable SDLClusterModeStatus *)clusterModeStatus { - [parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; + [self.parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; } - (nullable SDLClusterModeStatus *)clusterModeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:SDLClusterModeStatus.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:SDLClusterModeStatus.class error:nil]; } - (void)setMyKey:(nullable SDLMyKey *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable SDLMyKey *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLMyKey.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLMyKey.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable SDLElectronicParkBrakeStatus)electronicParkBrakeStatus { - return [parameters sdl_enumForName:SDLRPCParameterNameElectronicParkBrakeStatus error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameElectronicParkBrakeStatus error:nil]; } - (void)setTurnSignal:(nullable SDLTurnSignal)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable SDLTurnSignal)turnSignal { - return [parameters sdl_enumForName:SDLRPCParameterNameTurnSignal error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameTurnSignal error:nil]; } - (void)setCloudAppVehicleID:(nullable NSString *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable NSString *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLOnWayPointChange.m b/SmartDeviceLink/SDLOnWayPointChange.m index bc7b5a492..b90033dcf 100644 --- a/SmartDeviceLink/SDLOnWayPointChange.m +++ b/SmartDeviceLink/SDLOnWayPointChange.m @@ -12,19 +12,22 @@ @implementation SDLOnWayPointChange +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameOnWayPointChange]) { } return self; } +#pragma clang diagnostic pop - (void)setWaypoints:(NSArray *)waypoints { - [parameters sdl_setObject:waypoints forName:SDLRPCParameterNameWayPoints]; + [self.parameters sdl_setObject:waypoints forName:SDLRPCParameterNameWayPoints]; } - (NSArray *)waypoints { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameWayPoints ofClass:SDLLocationDetails.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameWayPoints ofClass:SDLLocationDetails.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLParameterPermissions.m b/SmartDeviceLink/SDLParameterPermissions.m index 005955a50..5b83f66bf 100644 --- a/SmartDeviceLink/SDLParameterPermissions.m +++ b/SmartDeviceLink/SDLParameterPermissions.m @@ -12,21 +12,21 @@ @implementation SDLParameterPermissions - (void)setAllowed:(NSArray *)allowed { - [store sdl_setObject:allowed forName:SDLRPCParameterNameAllowed]; + [self.store sdl_setObject:allowed forName:SDLRPCParameterNameAllowed]; } - (NSArray *)allowed { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameAllowed ofClass:NSString.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameAllowed ofClass:NSString.class error:&error]; } - (void)setUserDisallowed:(NSArray *)userDisallowed { - [store sdl_setObject:userDisallowed forName:SDLRPCParameterNameUserDisallowed]; + [self.store sdl_setObject:userDisallowed forName:SDLRPCParameterNameUserDisallowed]; } - (NSArray *)userDisallowed { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameUserDisallowed ofClass:NSString.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameUserDisallowed ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLPerformAppServiceInteraction.m b/SmartDeviceLink/SDLPerformAppServiceInteraction.m index 292ae39b4..f401f7f28 100644 --- a/SmartDeviceLink/SDLPerformAppServiceInteraction.m +++ b/SmartDeviceLink/SDLPerformAppServiceInteraction.m @@ -17,11 +17,14 @@ @implementation SDLPerformAppServiceInteraction +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePerformAppServiceInteraction]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithServiceUri:(NSString *)serviceUri serviceID:(NSString *)serviceID originApp:(NSString *)originApp { self = [self init]; @@ -48,38 +51,38 @@ - (instancetype)initWithServiceUri:(NSString *)serviceUri serviceID:(NSString *) } - (void)setServiceUri:(NSString *)serviceUri { - [parameters sdl_setObject:serviceUri forName:SDLRPCParameterNameServiceUri]; + [self.parameters sdl_setObject:serviceUri forName:SDLRPCParameterNameServiceUri]; } - (NSString *)serviceUri { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameServiceUri ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameServiceUri ofClass:NSString.class error:&error]; } - (void)setServiceID:(NSString *)serviceID { - [parameters sdl_setObject:serviceID forName:SDLRPCParameterNameServiceID]; + [self.parameters sdl_setObject:serviceID forName:SDLRPCParameterNameServiceID]; } - (NSString *)serviceID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameServiceID ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameServiceID ofClass:NSString.class error:&error]; } - (void)setOriginApp:(NSString *)originApp { - [parameters sdl_setObject:originApp forName:SDLRPCParameterNameOriginApp]; + [self.parameters sdl_setObject:originApp forName:SDLRPCParameterNameOriginApp]; } - (NSString *)originApp { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameOriginApp ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOriginApp ofClass:NSString.class error:&error]; } - (void)setRequestServiceActive:(nullable NSNumber *)requestServiceActive { - [parameters sdl_setObject:requestServiceActive forName:SDLRPCParameterNameRequestServiceActive]; + [self.parameters sdl_setObject:requestServiceActive forName:SDLRPCParameterNameRequestServiceActive]; } - (nullable NSNumber *)requestServiceActive { - return [parameters sdl_objectForName:SDLRPCParameterNameRequestServiceActive ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRequestServiceActive ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLPerformAppServiceInteractionResponse.m b/SmartDeviceLink/SDLPerformAppServiceInteractionResponse.m index 112d7c209..35bd58bf7 100644 --- a/SmartDeviceLink/SDLPerformAppServiceInteractionResponse.m +++ b/SmartDeviceLink/SDLPerformAppServiceInteractionResponse.m @@ -16,11 +16,14 @@ @implementation SDLPerformAppServiceInteractionResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePerformAppServiceInteraction]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithServiceSpecificResult:(NSString *)serviceSpecificResult { self = [self init]; @@ -34,11 +37,11 @@ - (instancetype)initWithServiceSpecificResult:(NSString *)serviceSpecificResult } - (void)setServiceSpecificResult:(nullable NSString *)serviceSpecificResult { - [parameters sdl_setObject:serviceSpecificResult forName:SDLRPCParameterNameServiceSpecificResult]; + [self.parameters sdl_setObject:serviceSpecificResult forName:SDLRPCParameterNameServiceSpecificResult]; } - (nullable NSString *)serviceSpecificResult { - return [parameters sdl_objectForName:SDLRPCParameterNameServiceSpecificResult ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameServiceSpecificResult ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLPerformAudioPassThru.m b/SmartDeviceLink/SDLPerformAudioPassThru.m index 85917babe..6bcea8fc7 100644 --- a/SmartDeviceLink/SDLPerformAudioPassThru.m +++ b/SmartDeviceLink/SDLPerformAudioPassThru.m @@ -13,11 +13,14 @@ @implementation SDLPerformAudioPassThru +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePerformAudioPassThru]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithInitialPrompt:(nullable NSString *)initialPrompt audioPassThruDisplayText1:(nullable NSString *)audioPassThruDisplayText1 audioPassThruDisplayText2:(nullable NSString *)audioPassThruDisplayText2 samplingRate:(SDLSamplingRate)samplingRate bitsPerSample:(SDLBitsPerSample)bitsPerSample audioType:(SDLAudioType)audioType maxDuration:(UInt32)maxDuration muteAudio:(BOOL)muteAudio { return [self initWithInitialPrompt:initialPrompt audioPassThruDisplayText1:audioPassThruDisplayText1 audioPassThruDisplayText2:audioPassThruDisplayText2 samplingRate:samplingRate bitsPerSample:bitsPerSample audioType:audioType maxDuration:maxDuration muteAudio:muteAudio audioDataHandler:nil]; @@ -58,71 +61,71 @@ - (instancetype)initWithSamplingRate:(SDLSamplingRate)samplingRate bitsPerSample - (void)setInitialPrompt:(nullable NSArray *)initialPrompt { - [parameters sdl_setObject:initialPrompt forName:SDLRPCParameterNameInitialPrompt]; + [self.parameters sdl_setObject:initialPrompt forName:SDLRPCParameterNameInitialPrompt]; } - (nullable NSArray *)initialPrompt { - return [parameters sdl_objectsForName:SDLRPCParameterNameInitialPrompt ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameInitialPrompt ofClass:SDLTTSChunk.class error:nil]; } - (void)setAudioPassThruDisplayText1:(nullable NSString *)audioPassThruDisplayText1 { - [parameters sdl_setObject:audioPassThruDisplayText1 forName:SDLRPCParameterNameAudioPassThruDisplayText1]; + [self.parameters sdl_setObject:audioPassThruDisplayText1 forName:SDLRPCParameterNameAudioPassThruDisplayText1]; } - (nullable NSString *)audioPassThruDisplayText1 { - return [parameters sdl_objectForName:SDLRPCParameterNameAudioPassThruDisplayText1 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAudioPassThruDisplayText1 ofClass:NSString.class error:nil]; } - (void)setAudioPassThruDisplayText2:(nullable NSString *)audioPassThruDisplayText2 { - [parameters sdl_setObject:audioPassThruDisplayText2 forName:SDLRPCParameterNameAudioPassThruDisplayText2]; + [self.parameters sdl_setObject:audioPassThruDisplayText2 forName:SDLRPCParameterNameAudioPassThruDisplayText2]; } - (nullable NSString *)audioPassThruDisplayText2 { - return [parameters sdl_objectForName:SDLRPCParameterNameAudioPassThruDisplayText2 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAudioPassThruDisplayText2 ofClass:NSString.class error:nil]; } - (void)setSamplingRate:(SDLSamplingRate)samplingRate { - [parameters sdl_setObject:samplingRate forName:SDLRPCParameterNameSamplingRate]; + [self.parameters sdl_setObject:samplingRate forName:SDLRPCParameterNameSamplingRate]; } - (SDLSamplingRate)samplingRate { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameSamplingRate error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameSamplingRate error:&error]; } - (void)setMaxDuration:(NSNumber *)maxDuration { - [parameters sdl_setObject:maxDuration forName:SDLRPCParameterNameMaxDuration]; + [self.parameters sdl_setObject:maxDuration forName:SDLRPCParameterNameMaxDuration]; } - (NSNumber *)maxDuration { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameMaxDuration ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMaxDuration ofClass:NSNumber.class error:&error]; } - (void)setBitsPerSample:(SDLBitsPerSample)bitsPerSample { - [parameters sdl_setObject:bitsPerSample forName:SDLRPCParameterNameBitsPerSample]; + [self.parameters sdl_setObject:bitsPerSample forName:SDLRPCParameterNameBitsPerSample]; } - (SDLBitsPerSample)bitsPerSample { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameBitsPerSample error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameBitsPerSample error:&error]; } - (void)setAudioType:(SDLAudioType)audioType { - [parameters sdl_setObject:audioType forName:SDLRPCParameterNameAudioType]; + [self.parameters sdl_setObject:audioType forName:SDLRPCParameterNameAudioType]; } - (SDLAudioType)audioType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameAudioType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameAudioType error:&error]; } - (void)setMuteAudio:(nullable NSNumber *)muteAudio { - [parameters sdl_setObject:muteAudio forName:SDLRPCParameterNameMuteAudio]; + [self.parameters sdl_setObject:muteAudio forName:SDLRPCParameterNameMuteAudio]; } - (nullable NSNumber *)muteAudio { - return [parameters sdl_objectForName:SDLRPCParameterNameMuteAudio ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMuteAudio ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLPerformAudioPassThruResponse.m b/SmartDeviceLink/SDLPerformAudioPassThruResponse.m index 66d2f72e1..a33310be7 100644 --- a/SmartDeviceLink/SDLPerformAudioPassThruResponse.m +++ b/SmartDeviceLink/SDLPerformAudioPassThruResponse.m @@ -12,11 +12,14 @@ @implementation SDLPerformAudioPassThruResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePerformAudioPassThru]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLPerformInteraction.m b/SmartDeviceLink/SDLPerformInteraction.m index b80e1bed6..d44ac3e16 100644 --- a/SmartDeviceLink/SDLPerformInteraction.m +++ b/SmartDeviceLink/SDLPerformInteraction.m @@ -14,11 +14,14 @@ @implementation SDLPerformInteraction +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePerformInteraction]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithInteractionChoiceSetId:(UInt16)interactionChoiceSetId { return [self initWithInteractionChoiceSetIdList:@[@(interactionChoiceSetId)]]; @@ -92,78 +95,78 @@ - (instancetype)initWithInteractionChoiceSetIdList:(NSArray *> } - (void)setInitialText:(NSString *)initialText { - [parameters sdl_setObject:initialText forName:SDLRPCParameterNameInitialText]; + [self.parameters sdl_setObject:initialText forName:SDLRPCParameterNameInitialText]; } - (NSString *)initialText { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameInitialText ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInitialText ofClass:NSString.class error:&error]; } - (void)setInitialPrompt:(nullable NSArray *)initialPrompt { - [parameters sdl_setObject:initialPrompt forName:SDLRPCParameterNameInitialPrompt]; + [self.parameters sdl_setObject:initialPrompt forName:SDLRPCParameterNameInitialPrompt]; } - (nullable NSArray *)initialPrompt { - return [parameters sdl_objectsForName:SDLRPCParameterNameInitialPrompt ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameInitialPrompt ofClass:SDLTTSChunk.class error:nil]; } - (void)setInteractionMode:(SDLInteractionMode)interactionMode { - [parameters sdl_setObject:interactionMode forName:SDLRPCParameterNameInteractionMode]; + [self.parameters sdl_setObject:interactionMode forName:SDLRPCParameterNameInteractionMode]; } - (SDLInteractionMode)interactionMode { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameInteractionMode error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameInteractionMode error:&error]; } - (void)setInteractionChoiceSetIDList:(NSArray *> *)interactionChoiceSetIDList { - [parameters sdl_setObject:interactionChoiceSetIDList forName:SDLRPCParameterNameInteractionChoiceSetIdList]; + [self.parameters sdl_setObject:interactionChoiceSetIDList forName:SDLRPCParameterNameInteractionChoiceSetIdList]; } - (NSArray *> *)interactionChoiceSetIDList { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameInteractionChoiceSetIdList ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameInteractionChoiceSetIdList ofClass:NSNumber.class error:&error]; } - (void)setHelpPrompt:(nullable NSArray *)helpPrompt { - [parameters sdl_setObject:helpPrompt forName:SDLRPCParameterNameHelpPrompt]; + [self.parameters sdl_setObject:helpPrompt forName:SDLRPCParameterNameHelpPrompt]; } - (nullable NSArray *)helpPrompt { - return [parameters sdl_objectsForName:SDLRPCParameterNameHelpPrompt ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameHelpPrompt ofClass:SDLTTSChunk.class error:nil]; } - (void)setTimeoutPrompt:(nullable NSArray *)timeoutPrompt { - [parameters sdl_setObject:timeoutPrompt forName:SDLRPCParameterNameTimeoutPrompt]; + [self.parameters sdl_setObject:timeoutPrompt forName:SDLRPCParameterNameTimeoutPrompt]; } - (nullable NSArray *)timeoutPrompt { - return [parameters sdl_objectsForName:SDLRPCParameterNameTimeoutPrompt ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTimeoutPrompt ofClass:SDLTTSChunk.class error:nil]; } - (void)setTimeout:(nullable NSNumber *)timeout { - [parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; + [self.parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; } - (nullable NSNumber *)timeout { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; } - (void)setVrHelp:(nullable NSArray *)vrHelp { - [parameters sdl_setObject:vrHelp forName:SDLRPCParameterNameVRHelp]; + [self.parameters sdl_setObject:vrHelp forName:SDLRPCParameterNameVRHelp]; } - (nullable NSArray *)vrHelp { - return [parameters sdl_objectsForName:SDLRPCParameterNameVRHelp ofClass:SDLVRHelpItem.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameVRHelp ofClass:SDLVRHelpItem.class error:nil]; } - (void)setInteractionLayout:(nullable SDLLayoutMode)interactionLayout { - [parameters sdl_setObject:interactionLayout forName:SDLRPCParameterNameInteractionLayout]; + [self.parameters sdl_setObject:interactionLayout forName:SDLRPCParameterNameInteractionLayout]; } - (nullable SDLLayoutMode)interactionLayout { - return [parameters sdl_enumForName:SDLRPCParameterNameInteractionLayout error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameInteractionLayout error:nil]; } @end diff --git a/SmartDeviceLink/SDLPerformInteractionResponse.m b/SmartDeviceLink/SDLPerformInteractionResponse.m index 8da3c6bfe..fc9723073 100644 --- a/SmartDeviceLink/SDLPerformInteractionResponse.m +++ b/SmartDeviceLink/SDLPerformInteractionResponse.m @@ -12,34 +12,37 @@ @implementation SDLPerformInteractionResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePerformInteraction]) { } return self; } +#pragma clang diagnostic pop - (void)setChoiceID:(nullable NSNumber *)choiceID { - [parameters sdl_setObject:choiceID forName:SDLRPCParameterNameChoiceId]; + [self.parameters sdl_setObject:choiceID forName:SDLRPCParameterNameChoiceId]; } - (nullable NSNumber *)choiceID { - return [parameters sdl_objectForName:SDLRPCParameterNameChoiceId ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameChoiceId ofClass:NSNumber.class error:nil]; } - (void)setManualTextEntry:(nullable NSString *)manualTextEntry { - [parameters sdl_setObject:manualTextEntry forName:SDLRPCParameterNameManualTextEntry]; + [self.parameters sdl_setObject:manualTextEntry forName:SDLRPCParameterNameManualTextEntry]; } - (nullable NSString *)manualTextEntry { - return [parameters sdl_objectForName:SDLRPCParameterNameManualTextEntry ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameManualTextEntry ofClass:NSString.class error:nil]; } - (void)setTriggerSource:(nullable SDLTriggerSource)triggerSource { - [parameters sdl_setObject:triggerSource forName:SDLRPCParameterNameTriggerSource]; + [self.parameters sdl_setObject:triggerSource forName:SDLRPCParameterNameTriggerSource]; } - (nullable SDLTriggerSource)triggerSource { - return [parameters sdl_enumForName:SDLRPCParameterNameTriggerSource error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameTriggerSource error:nil]; } @end diff --git a/SmartDeviceLink/SDLPermissionItem.m b/SmartDeviceLink/SDLPermissionItem.m index 462f7aaf3..501ad20f5 100644 --- a/SmartDeviceLink/SDLPermissionItem.m +++ b/SmartDeviceLink/SDLPermissionItem.m @@ -13,30 +13,30 @@ @implementation SDLPermissionItem - (void)setRpcName:(NSString *)rpcName { - [store sdl_setObject:rpcName forName:SDLRPCParameterNameRPCName]; + [self.store sdl_setObject:rpcName forName:SDLRPCParameterNameRPCName]; } - (NSString *)rpcName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameRPCName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameRPCName ofClass:NSString.class error:&error]; } - (void)setHmiPermissions:(SDLHMIPermissions *)hmiPermissions { - [store sdl_setObject:hmiPermissions forName:SDLRPCParameterNameHMIPermissions]; + [self.store sdl_setObject:hmiPermissions forName:SDLRPCParameterNameHMIPermissions]; } - (SDLHMIPermissions *)hmiPermissions { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameHMIPermissions ofClass:SDLHMIPermissions.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameHMIPermissions ofClass:SDLHMIPermissions.class error:&error]; } - (void)setParameterPermissions:(SDLParameterPermissions *)parameterPermissions { - [store sdl_setObject:parameterPermissions forName:SDLRPCParameterNameParameterPermissions]; + [self.store sdl_setObject:parameterPermissions forName:SDLRPCParameterNameParameterPermissions]; } - (SDLParameterPermissions *)parameterPermissions { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameParameterPermissions ofClass:SDLParameterPermissions.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameParameterPermissions ofClass:SDLParameterPermissions.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLPhoneCapability.m b/SmartDeviceLink/SDLPhoneCapability.m index 0d19a7957..514b8e216 100644 --- a/SmartDeviceLink/SDLPhoneCapability.m +++ b/SmartDeviceLink/SDLPhoneCapability.m @@ -27,11 +27,11 @@ - (instancetype)initWithDialNumber:(BOOL)dialNumberEnabled { } - (void)setDialNumberEnabled:(nullable NSNumber *)dialNumberEnabled { - [store sdl_setObject:dialNumberEnabled forName:SDLRPCParameterNameDialNumberEnabled]; + [self.store sdl_setObject:dialNumberEnabled forName:SDLRPCParameterNameDialNumberEnabled]; } - (nullable NSNumber *)dialNumberEnabled { - return [store sdl_objectForName:SDLRPCParameterNameDialNumberEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameDialNumberEnabled ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLPresetBankCapabilities.m b/SmartDeviceLink/SDLPresetBankCapabilities.m index ac11666ed..218a46285 100644 --- a/SmartDeviceLink/SDLPresetBankCapabilities.m +++ b/SmartDeviceLink/SDLPresetBankCapabilities.m @@ -12,12 +12,12 @@ @implementation SDLPresetBankCapabilities - (void)setOnScreenPresetsAvailable:(NSNumber *)onScreenPresetsAvailable { - [store sdl_setObject:onScreenPresetsAvailable forName:SDLRPCParameterNameOnScreenPresetsAvailable]; + [self.store sdl_setObject:onScreenPresetsAvailable forName:SDLRPCParameterNameOnScreenPresetsAvailable]; } - (NSNumber *)onScreenPresetsAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameOnScreenPresetsAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameOnScreenPresetsAvailable ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLProtocol.m b/SmartDeviceLink/SDLProtocol.m index 2e95ccf3c..3f1996e92 100644 --- a/SmartDeviceLink/SDLProtocol.m +++ b/SmartDeviceLink/SDLProtocol.m @@ -266,8 +266,12 @@ - (void)sendRPC:(SDLRPCMessage *)message { - (BOOL)sendRPC:(SDLRPCMessage *)message encrypted:(BOOL)encryption error:(NSError *__autoreleasing *)error { NSParameterAssert(message != nil); - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[message serializeAsDictionary:(Byte)[SDLGlobals sharedGlobals].protocolVersion.major] options:kNilOptions error:error]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[message serializeAsDictionary:(Byte)[SDLGlobals sharedGlobals].protocolVersion.major] options:kNilOptions error:error]; +#pragma clang diagnostic pop + if (error != nil) { SDLLogW(@"Error encoding JSON data: %@", *error); } @@ -289,7 +293,7 @@ - (BOOL)sendRPC:(SDLRPCMessage *)message encrypted:(BOOL)encryption error:(NSErr // Build a binary header // Serialize the RPC data into an NSData SDLRPCPayload *rpcPayload = [[SDLRPCPayload alloc] init]; - rpcPayload.functionID = [[[SDLFunctionID sharedInstance] functionIdForName:[message getFunctionName]] unsignedIntValue]; + rpcPayload.functionID = [[[SDLFunctionID sharedInstance] functionIdForName:message.name] unsignedIntValue]; rpcPayload.jsonData = jsonData; rpcPayload.binaryData = message.bulkData; diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index 8a1e6b344..3dae01670 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -282,10 +282,10 @@ - (void)onProtocolMessageReceived:(SDLProtocolMessage *)msgData { #pragma mark - Message sending - (void)sendRPC:(SDLRPCMessage *)message { - if ([message.getFunctionName isEqualToString:@"SubscribeButton"]) { + if ([message.name isEqualToString:SDLRPCFunctionNameSubscribeButton]) { BOOL handledRPC = [self sdl_adaptButtonSubscribeMessage:(SDLSubscribeButton *)message]; if (handledRPC) { return; } - } else if ([message.getFunctionName isEqualToString:@"UnsubscribeButton"]) { + } else if ([message.name isEqualToString:SDLRPCFunctionNameUnsubscribeButton]) { BOOL handledRPC = [self sdl_adaptButtonUnsubscribeMessage:(SDLUnsubscribeButton *)message]; if (handledRPC) { return; } } @@ -383,13 +383,16 @@ - (void)handleProtocolMessage:(SDLProtocolMessage *)incomingMessage { } - (void)handleRPCDictionary:(NSDictionary *)dict { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage *message = [[SDLRPCMessage alloc] initWithDictionary:[dict mutableCopy]]; - NSString *functionName = [message getFunctionName]; - NSString *messageType = [message messageType]; +#pragma clang diagnostic pop + NSString *functionName = message.name; + NSString *messageType = message.messageType; // If it's a response, append response if ([messageType isEqualToString:SDLRPCParameterNameResponse]) { - BOOL notGenericResponseMessage = ![functionName isEqualToString:@"GenericResponse"]; + BOOL notGenericResponseMessage = ![functionName isEqualToString:SDLRPCFunctionNameGenericResponse]; if (notGenericResponseMessage) { functionName = [NSString stringWithFormat:@"%@Response", functionName]; } @@ -496,9 +499,9 @@ - (void)handleSyncPData:(SDLRPCMessage *)message { // If URL != nil, perform HTTP Post and don't pass the notification to proxy listeners SDLLogV(@"OnEncodedSyncPData: %@", message); - NSString *urlString = (NSString *)[message getParameters:@"URL"]; - NSDictionary *encodedSyncPData = (NSDictionary *)[message getParameters:@"data"]; - NSNumber *encodedSyncPTimeout = (NSNumber *)[message getParameters:@"Timeout"]; + NSString *urlString = (NSString *)message.parameters[SDLRPCParameterNameURLUppercase]; + NSDictionary *encodedSyncPData = (NSDictionary *)message.parameters[SDLRPCParameterNameData]; + NSNumber *encodedSyncPTimeout = (NSNumber *)message.parameters[SDLRPCParameterNameTimeoutCapitalized]; if (urlString && encodedSyncPData && encodedSyncPTimeout) { [self sendEncodedSyncPData:encodedSyncPData toURL:urlString withTimeout:encodedSyncPTimeout]; @@ -508,8 +511,11 @@ - (void)handleSyncPData:(SDLRPCMessage *)message { - (void)handleSystemRequest:(NSDictionary *)dict { SDLLogV(@"OnSystemRequest"); +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnSystemRequest *systemRequest = [[SDLOnSystemRequest alloc] initWithDictionary:[dict mutableCopy]]; SDLRequestType requestType = systemRequest.requestType; +#pragma clang diagnostic pop // Handle the various OnSystemRequest types if ([requestType isEqualToEnum:SDLRequestTypeProprietary]) { @@ -615,7 +621,7 @@ - (BOOL)sdl_handleOnButtonEventPostV5:(SDLOnButtonEvent *)message { #pragma mark Handle Post-Invoke of Delegate Methods - (void)handleAfterHMIStatus:(SDLRPCMessage *)message { - SDLHMILevel hmiLevel = (SDLHMILevel)[message getParameters:SDLRPCParameterNameHMILevel]; + SDLHMILevel hmiLevel = (SDLHMILevel)message.parameters[SDLRPCParameterNameHMILevel]; _lsm.hmiLevel = hmiLevel; SEL callbackSelector = NSSelectorFromString(@"onOnLockScreenNotification:"); @@ -623,7 +629,7 @@ - (void)handleAfterHMIStatus:(SDLRPCMessage *)message { } - (void)handleAfterDriverDistraction:(SDLRPCMessage *)message { - NSString *stateString = (NSString *)[message getParameters:SDLRPCParameterNameState]; + NSString *stateString = (NSString *)message.parameters[SDLRPCParameterNameState]; BOOL state = [stateString isEqualToString:@"DD_ON"] ? YES : NO; _lsm.driverDistracted = state; diff --git a/SmartDeviceLink/SDLPublishAppService.m b/SmartDeviceLink/SDLPublishAppService.m index de365af41..dad78f11d 100644 --- a/SmartDeviceLink/SDLPublishAppService.m +++ b/SmartDeviceLink/SDLPublishAppService.m @@ -18,11 +18,14 @@ @implementation SDLPublishAppService +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePublishAppService]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAppServiceManifest:(SDLAppServiceManifest *)appServiceManifest { self = [self init]; @@ -36,12 +39,12 @@ - (instancetype)initWithAppServiceManifest:(SDLAppServiceManifest *)appServiceMa } - (void)setAppServiceManifest:(SDLAppServiceManifest *)appServiceManifest { - [parameters sdl_setObject:appServiceManifest forName:SDLRPCParameterNameAppServiceManifest]; + [self.parameters sdl_setObject:appServiceManifest forName:SDLRPCParameterNameAppServiceManifest]; } - (SDLAppServiceManifest *)appServiceManifest { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameAppServiceManifest ofClass:SDLAppServiceManifest.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppServiceManifest ofClass:SDLAppServiceManifest.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLPublishAppServiceResponse.m b/SmartDeviceLink/SDLPublishAppServiceResponse.m index 094a044ef..fb7449949 100644 --- a/SmartDeviceLink/SDLPublishAppServiceResponse.m +++ b/SmartDeviceLink/SDLPublishAppServiceResponse.m @@ -17,11 +17,14 @@ @implementation SDLPublishAppServiceResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePublishAppService]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAppServiceRecord:(SDLAppServiceRecord *)appServiceRecord { self = [self init]; @@ -35,11 +38,11 @@ - (instancetype)initWithAppServiceRecord:(SDLAppServiceRecord *)appServiceRecord } - (void)setAppServiceRecord:(nullable SDLAppServiceRecord *)appServiceRecord { - [parameters sdl_setObject:appServiceRecord forName:SDLRPCParameterNameAppServiceRecord]; + [self.parameters sdl_setObject:appServiceRecord forName:SDLRPCParameterNameAppServiceRecord]; } - (nullable SDLAppServiceRecord *)appServiceRecord { - return [parameters sdl_objectForName:SDLRPCParameterNameAppServiceRecord ofClass:SDLAppServiceRecord.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppServiceRecord ofClass:SDLAppServiceRecord.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLPutFile.m b/SmartDeviceLink/SDLPutFile.m index 5c54a712f..162ca5b6d 100644 --- a/SmartDeviceLink/SDLPutFile.m +++ b/SmartDeviceLink/SDLPutFile.m @@ -13,11 +13,14 @@ @implementation SDLPutFile +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePutFile]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType)fileType { self = [self init]; @@ -84,61 +87,61 @@ - (instancetype)initWithFileName:(NSString *)fileName fileType:(SDLFileType)file #pragma mark - Getters and Setters - (void)setSyncFileName:(NSString *)syncFileName { - [parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName]; + [self.parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName]; } - (NSString *)syncFileName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error]; } - (void)setFileType:(SDLFileType)fileType { - [parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; + [self.parameters sdl_setObject:fileType forName:SDLRPCParameterNameFileType]; } - (SDLFileType)fileType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameFileType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameFileType error:&error]; } - (void)setPersistentFile:(nullable NSNumber *)persistentFile { - [parameters sdl_setObject:persistentFile forName:SDLRPCParameterNamePersistentFile]; + [self.parameters sdl_setObject:persistentFile forName:SDLRPCParameterNamePersistentFile]; } - (nullable NSNumber *)persistentFile { - return [parameters sdl_objectForName:SDLRPCParameterNamePersistentFile ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePersistentFile ofClass:NSNumber.class error:nil]; } - (void)setSystemFile:(nullable NSNumber *)systemFile { - [parameters sdl_setObject:systemFile forName:SDLRPCParameterNameSystemFile]; + [self.parameters sdl_setObject:systemFile forName:SDLRPCParameterNameSystemFile]; } - (nullable NSNumber *)systemFile { - return [parameters sdl_objectForName:SDLRPCParameterNameSystemFile ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSystemFile ofClass:NSNumber.class error:nil]; } - (void)setOffset:(nullable NSNumber *)offset { - [parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; + [self.parameters sdl_setObject:offset forName:SDLRPCParameterNameOffset]; } - (nullable NSNumber *)offset { - return [parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOffset ofClass:NSNumber.class error:nil]; } - (void)setLength:(nullable NSNumber *)length { - [parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; + [self.parameters sdl_setObject:length forName:SDLRPCParameterNameLength]; } - (nullable NSNumber *)length { - return [parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLength ofClass:NSNumber.class error:nil]; } - (void)setCrc:(nullable NSNumber *)crc { - [parameters sdl_setObject:crc forName:SDLRPCParameterNameCRC]; + [self.parameters sdl_setObject:crc forName:SDLRPCParameterNameCRC]; } - (nullable NSNumber *)crc { - return [parameters sdl_objectForName:SDLRPCParameterNameCRC ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCRC ofClass:NSNumber.class error:nil]; } #pragma mark - Helpers diff --git a/SmartDeviceLink/SDLPutFileResponse.m b/SmartDeviceLink/SDLPutFileResponse.m index 906f9a5bb..aecbf9bb1 100644 --- a/SmartDeviceLink/SDLPutFileResponse.m +++ b/SmartDeviceLink/SDLPutFileResponse.m @@ -12,18 +12,21 @@ @implementation SDLPutFileResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNamePutFile]) { } return self; } +#pragma clang diagnostic pop - (void)setSpaceAvailable:(nullable NSNumber *)spaceAvailable { - [parameters sdl_setObject:spaceAvailable forName:SDLRPCParameterNameSpaceAvailable]; + [self.parameters sdl_setObject:spaceAvailable forName:SDLRPCParameterNameSpaceAvailable]; } - (nullable NSNumber *)spaceAvailable { - return [parameters sdl_objectForName:SDLRPCParameterNameSpaceAvailable ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpaceAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRDSData.m b/SmartDeviceLink/SDLRDSData.m index 14219ba34..2d177e6aa 100755 --- a/SmartDeviceLink/SDLRDSData.m +++ b/SmartDeviceLink/SDLRDSData.m @@ -27,67 +27,67 @@ - (instancetype)initWithProgramService:(nullable NSString *)programService radio } - (void)setProgramService:(nullable NSString *)programService { - [store sdl_setObject:programService forName:SDLRPCParameterNameProgramService]; + [self.store sdl_setObject:programService forName:SDLRPCParameterNameProgramService]; } - (nullable NSString *)programService { - return [store sdl_objectForName:SDLRPCParameterNameProgramService ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameProgramService ofClass:NSString.class error:nil]; } - (void)setRadioText:(nullable NSString *)radioText { - [store sdl_setObject:radioText forName:SDLRPCParameterNameRadioText]; + [self.store sdl_setObject:radioText forName:SDLRPCParameterNameRadioText]; } - (nullable NSString *)radioText { - return [store sdl_objectForName:SDLRPCParameterNameRadioText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRadioText ofClass:NSString.class error:nil]; } - (void)setClockText:(nullable NSString *)clockText { - [store sdl_setObject:clockText forName:SDLRPCParameterNameClockText]; + [self.store sdl_setObject:clockText forName:SDLRPCParameterNameClockText]; } - (nullable NSString *)clockText { - return [store sdl_objectForName:SDLRPCParameterNameClockText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameClockText ofClass:NSString.class error:nil]; } - (void)setProgramIdentification:(nullable NSString *)programIdentification { - [store sdl_setObject:programIdentification forName:SDLRPCParameterNameProgramIdentification]; + [self.store sdl_setObject:programIdentification forName:SDLRPCParameterNameProgramIdentification]; } - (nullable NSString *)programIdentification { - return [store sdl_objectForName:SDLRPCParameterNameProgramIdentification ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameProgramIdentification ofClass:NSString.class error:nil]; } - (void)setProgramType:(nullable NSNumber *)programType { - [store sdl_setObject:programType forName:SDLRPCParameterNameProgramType]; + [self.store sdl_setObject:programType forName:SDLRPCParameterNameProgramType]; } - (nullable NSNumber *)programType { - return [store sdl_objectForName:SDLRPCParameterNameProgramType ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameProgramType ofClass:NSNumber.class error:nil]; } - (void)setTrafficProgramIdentification:(nullable NSNumber *)trafficProgramIdentification { - [store sdl_setObject:trafficProgramIdentification forName:SDLRPCParameterNameTrafficProgramIdentification]; + [self.store sdl_setObject:trafficProgramIdentification forName:SDLRPCParameterNameTrafficProgramIdentification]; } - (nullable NSNumber *)trafficProgramIdentification { - return [store sdl_objectForName:SDLRPCParameterNameTrafficProgramIdentification ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTrafficProgramIdentification ofClass:NSNumber.class error:nil]; } - (void)setTrafficAnnouncementIdentification:(nullable NSNumber *)trafficAnnouncementIdentification { - [store sdl_setObject:trafficAnnouncementIdentification forName:SDLRPCParameterNameTrafficAnnouncementIdentification]; + [self.store sdl_setObject:trafficAnnouncementIdentification forName:SDLRPCParameterNameTrafficAnnouncementIdentification]; } - (nullable NSNumber *)trafficAnnouncementIdentification { - return [store sdl_objectForName:SDLRPCParameterNameTrafficAnnouncementIdentification ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTrafficAnnouncementIdentification ofClass:NSNumber.class error:nil]; } - (void)setRegion:(nullable NSString *)region { - [store sdl_setObject:region forName:SDLRPCParameterNameRegion]; + [self.store sdl_setObject:region forName:SDLRPCParameterNameRegion]; } - (nullable NSString *)region { - return [store sdl_objectForName:SDLRPCParameterNameRegion ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRegion ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRGBColor.m b/SmartDeviceLink/SDLRGBColor.m index ff2d4296e..1c611e076 100644 --- a/SmartDeviceLink/SDLRGBColor.m +++ b/SmartDeviceLink/SDLRGBColor.m @@ -41,30 +41,30 @@ - (instancetype)initWithColor:(UIColor *)color { #pragma mark - Setters - (void)setRed:(NSNumber *)red { - [store sdl_setObject:red forName:SDLRPCParameterNameRed]; + [self.store sdl_setObject:red forName:SDLRPCParameterNameRed]; } - (NSNumber *)red { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameRed ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameRed ofClass:NSNumber.class error:&error]; } - (void)setGreen:(NSNumber *)green { - [store sdl_setObject:green forName:SDLRPCParameterNameGreen]; + [self.store sdl_setObject:green forName:SDLRPCParameterNameGreen]; } - (NSNumber *)green { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameGreen ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameGreen ofClass:NSNumber.class error:&error]; } - (void)setBlue:(NSNumber *)blue { - [store sdl_setObject:blue forName:SDLRPCParameterNameBlue]; + [self.store sdl_setObject:blue forName:SDLRPCParameterNameBlue]; } - (NSNumber *)blue { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameBlue ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameBlue ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLRPCMessage.h b/SmartDeviceLink/SDLRPCMessage.h index dcc545715..1f2ad0e04 100644 --- a/SmartDeviceLink/SDLRPCMessage.h +++ b/SmartDeviceLink/SDLRPCMessage.h @@ -7,11 +7,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface SDLRPCMessage : SDLRPCStruct { - NSMutableDictionary *function; - NSMutableDictionary *parameters; - NSString *messageType; -} +@interface SDLRPCMessage : SDLRPCStruct /** * Convenience init @@ -19,29 +15,21 @@ NS_ASSUME_NONNULL_BEGIN * @param name The name of the message * @return A SDLRPCMessage object */ -- (instancetype)initWithName:(NSString *)name; - -/** - * Convenience init - * - * @param dict A dictionary with the format @{messageType: @{parameters}} - * @return A SDLRPCMessage object - */ -- (instancetype)initWithDictionary:(NSDictionary *)dict; +- (instancetype)initWithName:(NSString *)name __deprecated_msg("This is not intended to be a public facing API"); /** * Returns the function name. * * @return The function name */ -- (nullable NSString *)getFunctionName; +- (nullable NSString *)getFunctionName __deprecated_msg("Call the .name property instead"); /** * Sets the function name. * * @param functionName The function name */ -- (void)setFunctionName:(nullable NSString *)functionName; +- (void)setFunctionName:(nullable NSString *)functionName __deprecated_msg("This is not intended to be a public facing API"); /** * Returns the value associated with the provided key. If the key does not exist, null is returned. @@ -49,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN * @param functionName The key name * @return The value associated with the function name */ -- (nullable NSObject *)getParameters:(NSString *)functionName; +- (nullable NSObject *)getParameters:(NSString *)functionName __deprecated_msg("Call the .parameters property instead"); /** * Sets a key-value pair using the function name as the key. @@ -57,7 +45,7 @@ NS_ASSUME_NONNULL_BEGIN * @param functionName The name for the key * @param value The value associated with the function name */ -- (void)setParameters:(NSString *)functionName value:(nullable NSObject *)value; +- (void)setParameters:(NSString *)functionName value:(nullable NSObject *)value __deprecated_msg("This is not intended to be a public facing API"); /** * The data in the message @@ -69,6 +57,11 @@ NS_ASSUME_NONNULL_BEGIN */ @property (strong, nonatomic, readonly) NSString *name; +/** + The JSONRPC parameters + */ +@property (strong, nonatomic, readonly) NSMutableDictionary *parameters; + /** * The type of data in the message */ diff --git a/SmartDeviceLink/SDLRPCMessage.m b/SmartDeviceLink/SDLRPCMessage.m index 1d55d5f61..15a6dd49a 100644 --- a/SmartDeviceLink/SDLRPCMessage.m +++ b/SmartDeviceLink/SDLRPCMessage.m @@ -9,71 +9,90 @@ NS_ASSUME_NONNULL_BEGIN -@implementation SDLRPCMessage +@interface SDLRPCMessage () + +@property (strong, nonatomic, readwrite) NSString *messageType; +@property (strong, nonatomic) NSMutableDictionary *function; + +@end -@synthesize messageType; + +@implementation SDLRPCMessage - (instancetype)initWithName:(NSString *)name { - if (self = [super init]) { - function = [[NSMutableDictionary alloc] initWithCapacity:3]; - parameters = [[NSMutableDictionary alloc] init]; - messageType = SDLRPCParameterNameRequest; - [store setObject:function forKey:messageType]; - [function setObject:parameters forKey:SDLRPCParameterNameParameters]; - [function setObject:name forKey:SDLRPCParameterNameOperationName]; + self = [super init]; + if (!self) { + return nil; } + + _function = [NSMutableDictionary dictionaryWithCapacity:3]; + _parameters = [NSMutableDictionary dictionary]; + _messageType = SDLRPCParameterNameRequest; + self.store[_messageType] = _function; + + _function[SDLRPCParameterNameParameters] = _parameters; + _function[SDLRPCParameterNameOperationName] = name; + return self; } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (instancetype)initWithDictionary:(NSDictionary *)dict { - if (self = [super initWithDictionary:dict]) { - NSEnumerator *enumerator = [store keyEnumerator]; - while (messageType = [enumerator nextObject]) { - if (![messageType isEqualToString:SDLRPCParameterNameBulkData]) { - break; - } - } - if (messageType != nil) { - store[messageType] = [store[messageType] mutableCopy]; - function = store[messageType]; + self = [super initWithDictionary:dict]; + if (!self) { + return nil; + } - function[SDLRPCParameterNameParameters] = [function[SDLRPCParameterNameParameters] mutableCopy]; - parameters = function[SDLRPCParameterNameParameters]; + NSEnumerator *enumerator = [self.store keyEnumerator]; + while (_messageType = [enumerator nextObject]) { + if (![_messageType isEqualToString:SDLRPCParameterNameBulkData]) { + break; } - self.bulkData = dict[SDLRPCParameterNameBulkData]; } + + if (_messageType != nil) { + self.store[_messageType] = [self.store[_messageType] mutableCopy]; + _function = self.store[_messageType]; + + _function[SDLRPCParameterNameParameters] = [_function[SDLRPCParameterNameParameters] mutableCopy]; + _parameters = _function[SDLRPCParameterNameParameters]; + } + + _bulkData = dict[SDLRPCParameterNameBulkData]; return self; } +#pragma clang diagnostic pop - (nullable NSString *)getFunctionName { - return [function sdl_objectForName:SDLRPCParameterNameOperationName ofClass:NSString.class error:nil]; + return self.name; } - (void)setFunctionName:(nullable NSString *)functionName { - [function sdl_setObject:functionName forName:SDLRPCParameterNameOperationName]; + [_function sdl_setObject:functionName forName:SDLRPCParameterNameOperationName]; } - (nullable NSObject *)getParameters:(NSString *)functionName { - return [parameters sdl_objectForName:functionName ofClass:NSObject.class error:nil]; + return [_parameters sdl_objectForName:functionName ofClass:NSObject.class error:nil]; } - (void)setParameters:(NSString *)functionName value:(nullable NSObject *)value { - [parameters sdl_setObject:value forName:functionName]; + [_parameters sdl_setObject:value forName:functionName]; } - (NSString *)name { - return [self getFunctionName]; + return [_function sdl_objectForName:SDLRPCParameterNameOperationName ofClass:NSString.class error:nil]; } - (NSString *)description { - NSMutableString *description = [NSMutableString stringWithFormat:@"%@ (%@)\n%@", self.name, self.messageType, self->parameters]; + NSMutableString *description = [NSMutableString stringWithFormat:@"%@ (%@)\n%@", self.name, self.messageType, self.parameters]; return description; } - (id)copyWithZone:(nullable NSZone *)zone { - SDLRPCMessage *newMessage = [[self.class allocWithZone:zone] initWithDictionary:self->store]; + SDLRPCMessage *newMessage = [[self.class allocWithZone:zone] initWithDictionary:self.store]; return newMessage; } diff --git a/SmartDeviceLink/SDLRPCNotification.m b/SmartDeviceLink/SDLRPCNotification.m index 6bec6fd29..fa6ca7eec 100644 --- a/SmartDeviceLink/SDLRPCNotification.m +++ b/SmartDeviceLink/SDLRPCNotification.m @@ -9,16 +9,25 @@ NS_ASSUME_NONNULL_BEGIN +@interface SDLRPCMessage () + +@property (strong, nonatomic, readwrite) NSString *messageType; +@property (strong, nonatomic) NSMutableDictionary *function; + +@end + @implementation SDLRPCNotification +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (instancetype)initWithName:(NSString *)name { self = [super initWithName:name]; if (!self) { return nil; } - messageType = SDLRPCParameterNameNotification; - [store setObject:function forKey:messageType]; + self.messageType = SDLRPCParameterNameNotification; + [self.store setObject:self.function forKey:self.messageType]; return self; } @@ -29,11 +38,12 @@ - (instancetype)initWithDictionary:(NSDictionary *)dict { return nil; } - messageType = SDLRPCParameterNameNotification; - [store setObject:function forKey:messageType]; + self.messageType = SDLRPCParameterNameNotification; + [self.store setObject:self.function forKey:self.messageType]; return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLRPCRequest.m b/SmartDeviceLink/SDLRPCRequest.m index 7c3a7c618..1ce2186c1 100644 --- a/SmartDeviceLink/SDLRPCRequest.m +++ b/SmartDeviceLink/SDLRPCRequest.m @@ -9,15 +9,21 @@ NS_ASSUME_NONNULL_BEGIN +@interface SDLRPCMessage () + +@property (strong, nonatomic) NSMutableDictionary *function; + +@end + @implementation SDLRPCRequest - (NSNumber *)correlationID { NSError *error = nil; - return [function sdl_objectForName:SDLRPCParameterNameCorrelationId ofClass:NSNumber.class error:&error]; + return [self.function sdl_objectForName:SDLRPCParameterNameCorrelationId ofClass:NSNumber.class error:&error]; } - (void)setCorrelationID:(NSNumber *)corrID { - [function sdl_setObject:corrID forName:SDLRPCParameterNameCorrelationId]; + [self.function sdl_setObject:corrID forName:SDLRPCParameterNameCorrelationId]; } @end diff --git a/SmartDeviceLink/SDLRPCResponse.m b/SmartDeviceLink/SDLRPCResponse.m index d288da5c7..c996473e9 100644 --- a/SmartDeviceLink/SDLRPCResponse.m +++ b/SmartDeviceLink/SDLRPCResponse.m @@ -10,16 +10,25 @@ NS_ASSUME_NONNULL_BEGIN +@interface SDLRPCMessage () + +@property (strong, nonatomic, readwrite) NSString *messageType; +@property (strong, nonatomic) NSMutableDictionary *function; + +@end + @implementation SDLRPCResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" - (instancetype)initWithName:(NSString *)name { self = [super initWithName:name]; if (!self) { return nil; } - messageType = SDLRPCParameterNameResponse; - [store sdl_setObject:function forName:messageType]; + self.messageType = SDLRPCParameterNameResponse; + [self.store sdl_setObject:self.function forName:self.messageType]; return self; } @@ -30,45 +39,46 @@ - (instancetype)initWithDictionary:(NSMutableDictionary *)dict { return nil; } - messageType = SDLRPCParameterNameResponse; - [store sdl_setObject:function forName:messageType]; + self.messageType = SDLRPCParameterNameResponse; + [self.store sdl_setObject:self.function forName:self.messageType]; return self; } +#pragma clang diagnostic pop - (NSNumber *)correlationID { NSError *error = nil; - return [function sdl_objectForName:SDLRPCParameterNameCorrelationId ofClass:NSNumber.class error:&error]; + return [self.function sdl_objectForName:SDLRPCParameterNameCorrelationId ofClass:NSNumber.class error:&error]; } - (void)setCorrelationID:(NSNumber *)corrID { - [function sdl_setObject:corrID forName:SDLRPCParameterNameCorrelationId]; + [self.function sdl_setObject:corrID forName:SDLRPCParameterNameCorrelationId]; } - (void)setSuccess:(NSNumber *)success { - [parameters sdl_setObject:success forName:SDLRPCParameterNameSuccess]; + [self.parameters sdl_setObject:success forName:SDLRPCParameterNameSuccess]; } - (NSNumber *)success { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSuccess ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSuccess ofClass:NSNumber.class error:&error]; } - (void)setResultCode:(SDLResult)resultCode { - [parameters sdl_setObject:resultCode forName:SDLRPCParameterNameResultCode]; + [self.parameters sdl_setObject:resultCode forName:SDLRPCParameterNameResultCode]; } - (SDLResult)resultCode { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameResultCode error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameResultCode error:&error]; } - (void)setInfo:(nullable NSString *)info { - [parameters sdl_setObject:info forName:SDLRPCParameterNameInfo]; + [self.parameters sdl_setObject:info forName:SDLRPCParameterNameInfo]; } - (nullable NSString *)info { - return [parameters sdl_objectForName:SDLRPCParameterNameInfo ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInfo ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRPCStruct.h b/SmartDeviceLink/SDLRPCStruct.h index 2b05e745c..7813c960b 100644 --- a/SmartDeviceLink/SDLRPCStruct.h +++ b/SmartDeviceLink/SDLRPCStruct.h @@ -8,9 +8,9 @@ NS_ASSUME_NONNULL_BEGIN -@interface SDLRPCStruct : NSObject { - NSMutableDictionary *store; -} +@interface SDLRPCStruct : NSObject + +@property (strong, nonatomic, readonly) NSMutableDictionary *store; /** * Convenience init @@ -18,14 +18,7 @@ NS_ASSUME_NONNULL_BEGIN * @param dict A dictionary * @return A SDLRPCStruct object */ -- (instancetype)initWithDictionary:(NSDictionary *)dict; - -/** - * Init - * - * @return A SDLRPCStruct object - */ -- (instancetype)init; +- (instancetype)initWithDictionary:(NSDictionary *)dict __deprecated_msg("This is not intended for public use"); /** * Converts struct to JSON formatted data @@ -33,7 +26,7 @@ NS_ASSUME_NONNULL_BEGIN * @param version The protocol version * @return JSON formatted data */ -- (NSDictionary *)serializeAsDictionary:(Byte)version; +- (NSDictionary *)serializeAsDictionary:(Byte)version __deprecated_msg("This is not intended for public use"); @end diff --git a/SmartDeviceLink/SDLRPCStruct.m b/SmartDeviceLink/SDLRPCStruct.m index 9fd177e1d..4a634959a 100644 --- a/SmartDeviceLink/SDLRPCStruct.m +++ b/SmartDeviceLink/SDLRPCStruct.m @@ -11,43 +11,49 @@ @implementation SDLRPCStruct -- (id)initWithDictionary:(NSDictionary *)dict { - if (self = [super init]) { - if (dict != nil) { - store = [dict mutableCopy]; - } else { - store = [NSMutableDictionary dictionary]; - } +- (instancetype)initWithDictionary:(NSDictionary *)dict { + self = [super init]; + if (!self) { + return nil; } + + _store = [dict mutableCopy]; + return self; } -- (id)init { - if (self = [super init]) { - store = [NSMutableDictionary dictionary]; +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; } + + _store = [NSMutableDictionary dictionary]; + return self; } - (NSDictionary *)serializeAsDictionary:(Byte)version { if (version >= 2) { - NSString *messageType = store.keyEnumerator.nextObject; - NSMutableDictionary *function = store[messageType]; + NSString *messageType = self.store.keyEnumerator.nextObject; + NSMutableDictionary *function = _store[messageType]; if ([function isKindOfClass:NSMutableDictionary.class]) { NSMutableDictionary *parameters = function[SDLRPCParameterNameParameters]; return [self.class sdl_serializeDictionary:parameters version:version]; } else { - return [self.class sdl_serializeDictionary:store version:version]; + return [self.class sdl_serializeDictionary:self.store version:version]; } } else { - return [self.class sdl_serializeDictionary:store version:version]; + return [self.class sdl_serializeDictionary:self.store version:version]; } } - (NSString *)description { - return [store description]; + return [self.store description]; } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + (NSDictionary *)sdl_serializeDictionary:(NSDictionary *)dict version:(Byte)version { NSMutableDictionary *ret = [NSMutableDictionary dictionaryWithCapacity:dict.count]; for (NSString *key in dict.keyEnumerator) { @@ -74,16 +80,16 @@ - (NSString *)description { } return ret; } +#pragma clang diagnostic pop - (id)copyWithZone:(nullable NSZone *)zone { - SDLRPCStruct *newStruct = [[[self class] allocWithZone:zone] init]; - newStruct->store = [self->store mutableCopy]; + SDLRPCStruct *newStruct = [[[self class] allocWithZone:zone] initWithDictionary:_store]; return newStruct; } - (BOOL)isEqualToRPC:(SDLRPCStruct *)rpc { - return [rpc->store isEqualToDictionary:self->store]; + return [rpc.store isEqualToDictionary:_store]; } - (BOOL)isEqual:(id)object { diff --git a/SmartDeviceLink/SDLRadioControlCapabilities.m b/SmartDeviceLink/SDLRadioControlCapabilities.m index 58b9b7e79..993592296 100644 --- a/SmartDeviceLink/SDLRadioControlCapabilities.m +++ b/SmartDeviceLink/SDLRadioControlCapabilities.m @@ -38,108 +38,108 @@ - (instancetype)initWithModuleName:(NSString *)moduleName radioEnableAvailable:( } - (void)setModuleName:(NSString *)moduleName { - [store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; + [self.store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; } - (NSString *)moduleName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; } - (void)setRadioEnableAvailable:(nullable NSNumber *)radioEnableAvailable { - [store sdl_setObject:radioEnableAvailable forName:SDLRPCParameterNameRadioEnableAvailable]; + [self.store sdl_setObject:radioEnableAvailable forName:SDLRPCParameterNameRadioEnableAvailable]; } - (nullable NSNumber *)radioEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameRadioEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRadioEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setRadioBandAvailable:(nullable NSNumber *)radioBandAvailable { - [store sdl_setObject:radioBandAvailable forName:SDLRPCParameterNameRadioBandAvailable]; + [self.store sdl_setObject:radioBandAvailable forName:SDLRPCParameterNameRadioBandAvailable]; } - (nullable NSNumber *)radioBandAvailable { - return [store sdl_objectForName:SDLRPCParameterNameRadioBandAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRadioBandAvailable ofClass:NSNumber.class error:nil]; } - (void)setRadioFrequencyAvailable:(nullable NSNumber *)radioFrequencyAvailable { - [store sdl_setObject:radioFrequencyAvailable forName:SDLRPCParameterNameRadioFrequencyAvailable]; + [self.store sdl_setObject:radioFrequencyAvailable forName:SDLRPCParameterNameRadioFrequencyAvailable]; } - (nullable NSNumber *)radioFrequencyAvailable { - return [store sdl_objectForName:SDLRPCParameterNameRadioFrequencyAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRadioFrequencyAvailable ofClass:NSNumber.class error:nil]; } - (void)setHdChannelAvailable:(nullable NSNumber *)hdChannelAvailable { - [store sdl_setObject:hdChannelAvailable forName:SDLRPCParameterNameHDChannelAvailable]; + [self.store sdl_setObject:hdChannelAvailable forName:SDLRPCParameterNameHDChannelAvailable]; } - (nullable NSNumber *)hdChannelAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHDChannelAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHDChannelAvailable ofClass:NSNumber.class error:nil]; } - (void)setRdsDataAvailable:(nullable NSNumber *)rdsDataAvailable { - [store sdl_setObject:rdsDataAvailable forName:SDLRPCParameterNameRDSDataAvailable]; + [self.store sdl_setObject:rdsDataAvailable forName:SDLRPCParameterNameRDSDataAvailable]; } - (nullable NSNumber *)rdsDataAvailable { - return [store sdl_objectForName:SDLRPCParameterNameRDSDataAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRDSDataAvailable ofClass:NSNumber.class error:nil]; } - (void)setAvailableHDsAvailable:(nullable NSNumber *)availableHDsAvailable { - [store sdl_setObject:availableHDsAvailable forName:SDLRPCParameterNameAvailableHDsAvailable]; + [self.store sdl_setObject:availableHDsAvailable forName:SDLRPCParameterNameAvailableHDsAvailable]; } - (nullable NSNumber *)availableHDsAvailable { - return [store sdl_objectForName:SDLRPCParameterNameAvailableHDsAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAvailableHDsAvailable ofClass:NSNumber.class error:nil]; } - (void)setStateAvailable:(nullable NSNumber *)stateAvailable { - [store sdl_setObject:stateAvailable forName:SDLRPCParameterNameStateAvailable]; + [self.store sdl_setObject:stateAvailable forName:SDLRPCParameterNameStateAvailable]; } - (nullable NSNumber *)stateAvailable { - return [store sdl_objectForName:SDLRPCParameterNameStateAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameStateAvailable ofClass:NSNumber.class error:nil]; } - (void)setSignalStrengthAvailable:(nullable NSNumber *)signalStrengthAvailable { - [store sdl_setObject:signalStrengthAvailable forName:SDLRPCParameterNameSignalStrengthAvailable]; + [self.store sdl_setObject:signalStrengthAvailable forName:SDLRPCParameterNameSignalStrengthAvailable]; } - (nullable NSNumber *)signalStrengthAvailable { - return [store sdl_objectForName:SDLRPCParameterNameSignalStrengthAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSignalStrengthAvailable ofClass:NSNumber.class error:nil]; } - (void)setSignalChangeThresholdAvailable:(nullable NSNumber *)signalChangeThresholdAvailable { - [store sdl_setObject:signalChangeThresholdAvailable forName:SDLRPCParameterNameSignalChangeThresholdAvailable]; + [self.store sdl_setObject:signalChangeThresholdAvailable forName:SDLRPCParameterNameSignalChangeThresholdAvailable]; } - (nullable NSNumber *)signalChangeThresholdAvailable { - return [store sdl_objectForName:SDLRPCParameterNameSignalChangeThresholdAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSignalChangeThresholdAvailable ofClass:NSNumber.class error:nil]; } - (void)setHdRadioEnableAvailable:(nullable NSNumber *)hdRadioEnableAvailable { - [store sdl_setObject:hdRadioEnableAvailable forName:SDLRPCParameterNameHDRadioEnableAvailable]; + [self.store sdl_setObject:hdRadioEnableAvailable forName:SDLRPCParameterNameHDRadioEnableAvailable]; } - (nullable NSNumber *)hdRadioEnableAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHDRadioEnableAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHDRadioEnableAvailable ofClass:NSNumber.class error:nil]; } - (void)setSiriusXMRadioAvailable:(nullable NSNumber *)siriusXMRadioAvailable { - [store sdl_setObject:siriusXMRadioAvailable forName:SDLRPCParameterNameSiriusXMRadioAvailable]; + [self.store sdl_setObject:siriusXMRadioAvailable forName:SDLRPCParameterNameSiriusXMRadioAvailable]; } - (nullable NSNumber *)siriusXMRadioAvailable { - return [store sdl_objectForName:SDLRPCParameterNameSiriusXMRadioAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSiriusXMRadioAvailable ofClass:NSNumber.class error:nil]; } - (void)setSisDataAvailable:(nullable NSNumber *)sisDataAvailable { - [store sdl_setObject:sisDataAvailable forName:SDLRPCParameterNameSISDataAvailable]; + [self.store sdl_setObject:sisDataAvailable forName:SDLRPCParameterNameSISDataAvailable]; } - (nullable NSNumber *)sisDataAvailable { - return [store sdl_objectForName:SDLRPCParameterNameSISDataAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSISDataAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRadioControlData.m b/SmartDeviceLink/SDLRadioControlData.m index a87bd3367..5ae7deb12 100644 --- a/SmartDeviceLink/SDLRadioControlData.m +++ b/SmartDeviceLink/SDLRadioControlData.m @@ -44,99 +44,99 @@ - (instancetype)initWithFrequencyInteger:(nullable NSNumber *)frequencyI } - (void)setFrequencyInteger:(nullable NSNumber *)frequencyInteger { - [store sdl_setObject:frequencyInteger forName:SDLRPCParameterNameFrequencyInteger]; + [self.store sdl_setObject:frequencyInteger forName:SDLRPCParameterNameFrequencyInteger]; } - (nullable NSNumber *)frequencyInteger { - return [store sdl_objectForName:SDLRPCParameterNameFrequencyInteger ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFrequencyInteger ofClass:NSNumber.class error:nil]; } - (void)setFrequencyFraction:(nullable NSNumber *)frequencyFraction { - [store sdl_setObject:frequencyFraction forName:SDLRPCParameterNameFrequencyFraction]; + [self.store sdl_setObject:frequencyFraction forName:SDLRPCParameterNameFrequencyFraction]; } - (nullable NSNumber *)frequencyFraction { - return [store sdl_objectForName:SDLRPCParameterNameFrequencyFraction ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFrequencyFraction ofClass:NSNumber.class error:nil]; } - (void)setBand:(nullable SDLRadioBand)band { - [store sdl_setObject:band forName:SDLRPCParameterNameBand]; + [self.store sdl_setObject:band forName:SDLRPCParameterNameBand]; } - (nullable SDLRadioBand)band{ - return [store sdl_enumForName:SDLRPCParameterNameBand error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameBand error:nil]; } - (void)setRdsData:(nullable SDLRDSData *)rdsData { - [store sdl_setObject:rdsData forName:SDLRPCParameterNameRDSData]; + [self.store sdl_setObject:rdsData forName:SDLRPCParameterNameRDSData]; } - (nullable SDLRDSData *)rdsData { - return [store sdl_objectForName:SDLRPCParameterNameRDSData ofClass:SDLRDSData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRDSData ofClass:SDLRDSData.class error:nil]; } - (void)setAvailableHDs:(nullable NSNumber *)availableHDs { - [store sdl_setObject:availableHDs forName:SDLRPCParameterNameAvailableHDs]; + [self.store sdl_setObject:availableHDs forName:SDLRPCParameterNameAvailableHDs]; } - (nullable NSNumber *)availableHDs { - return [store sdl_objectForName:SDLRPCParameterNameAvailableHDs ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAvailableHDs ofClass:NSNumber.class error:nil]; } - (void)setHdChannel:(nullable NSNumber *)hdChannel { - [store sdl_setObject:hdChannel forName:SDLRPCParameterNameHDChannel]; + [self.store sdl_setObject:hdChannel forName:SDLRPCParameterNameHDChannel]; } - (nullable NSNumber *)hdChannel { - return [store sdl_objectForName:SDLRPCParameterNameHDChannel ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHDChannel ofClass:NSNumber.class error:nil]; } - (void)setSignalStrength:(nullable NSNumber *)signalStrength { - [store sdl_setObject:signalStrength forName:SDLRPCParameterNameSignalStrength]; + [self.store sdl_setObject:signalStrength forName:SDLRPCParameterNameSignalStrength]; } - (nullable NSNumber *)signalStrength { - return [store sdl_objectForName:SDLRPCParameterNameSignalStrength ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSignalStrength ofClass:NSNumber.class error:nil]; } - (void)setSignalChangeThreshold:(nullable NSNumber *)signalChangeThreshold { - [store sdl_setObject:signalChangeThreshold forName:SDLRPCParameterNameSignalChangeThreshold]; + [self.store sdl_setObject:signalChangeThreshold forName:SDLRPCParameterNameSignalChangeThreshold]; } - (nullable NSNumber *)signalChangeThreshold { - return [store sdl_objectForName:SDLRPCParameterNameSignalChangeThreshold ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSignalChangeThreshold ofClass:NSNumber.class error:nil]; } - (void)setRadioEnable:(nullable NSNumber *)radioEnable { - [store sdl_setObject:radioEnable forName:SDLRPCParameterNameRadioEnable]; + [self.store sdl_setObject:radioEnable forName:SDLRPCParameterNameRadioEnable]; } - (nullable NSNumber *)radioEnable { - return [store sdl_objectForName:SDLRPCParameterNameRadioEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRadioEnable ofClass:NSNumber.class error:nil]; } - (void)setState:(nullable SDLRadioState)state { - [store sdl_setObject:state forName:SDLRPCParameterNameState]; + [self.store sdl_setObject:state forName:SDLRPCParameterNameState]; } - (nullable SDLRadioState)state { - return [store sdl_enumForName:SDLRPCParameterNameState error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameState error:nil]; } - (void)setHdRadioEnable:(nullable NSNumber *)hdRadioEnable { - [store sdl_setObject:hdRadioEnable forName:SDLRPCParameterNameHDRadioEnable]; + [self.store sdl_setObject:hdRadioEnable forName:SDLRPCParameterNameHDRadioEnable]; } - (nullable NSNumber *)hdRadioEnable { - return [store sdl_objectForName:SDLRPCParameterNameHDRadioEnable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHDRadioEnable ofClass:NSNumber.class error:nil]; } - (void)setSisData:(nullable SDLSISData *)sisData { - [store sdl_setObject:sisData forName:SDLRPCParameterNameSISData]; + [self.store sdl_setObject:sisData forName:SDLRPCParameterNameSISData]; } - (nullable SDLSISData *)sisData { - return [store sdl_objectForName:SDLRPCParameterNameSISData ofClass:SDLSISData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSISData ofClass:SDLSISData.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLReadDID.m b/SmartDeviceLink/SDLReadDID.m index 01996893a..cf2d276ff 100644 --- a/SmartDeviceLink/SDLReadDID.m +++ b/SmartDeviceLink/SDLReadDID.m @@ -12,11 +12,14 @@ @implementation SDLReadDID +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameReadDID]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithECUName:(UInt16)ecuName didLocation:(NSArray *> *)didLocation { self = [self init]; @@ -31,21 +34,21 @@ - (instancetype)initWithECUName:(UInt16)ecuName didLocation:(NSArray *)ecuName { - [parameters sdl_setObject:ecuName forName:SDLRPCParameterNameECUName]; + [self.parameters sdl_setObject:ecuName forName:SDLRPCParameterNameECUName]; } - (NSNumber *)ecuName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameECUName ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECUName ofClass:NSNumber.class error:&error]; } - (void)setDidLocation:(NSArray *> *)didLocation { - [parameters sdl_setObject:didLocation forName:SDLRPCParameterNameDIDLocation]; + [self.parameters sdl_setObject:didLocation forName:SDLRPCParameterNameDIDLocation]; } - (NSArray *> *)didLocation { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameDIDLocation ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameDIDLocation ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLReadDIDResponse.m b/SmartDeviceLink/SDLReadDIDResponse.m index 8bf510370..7bad1e43e 100644 --- a/SmartDeviceLink/SDLReadDIDResponse.m +++ b/SmartDeviceLink/SDLReadDIDResponse.m @@ -13,18 +13,21 @@ @implementation SDLReadDIDResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameReadDID]) { } return self; } +#pragma clang diagnostic pop - (void)setDidResult:(nullable NSArray *)didResult { - [parameters sdl_setObject:didResult forName:SDLRPCParameterNameDIDResult]; + [self.parameters sdl_setObject:didResult forName:SDLRPCParameterNameDIDResult]; } - (nullable NSArray *)didResult { - return [parameters sdl_objectsForName:SDLRPCParameterNameDIDResult ofClass:SDLDIDResult.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameDIDResult ofClass:SDLDIDResult.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRectangle.m b/SmartDeviceLink/SDLRectangle.m index 64a368e13..7e6a8a3c3 100644 --- a/SmartDeviceLink/SDLRectangle.m +++ b/SmartDeviceLink/SDLRectangle.m @@ -29,39 +29,39 @@ - (instancetype)initWithCGRect:(CGRect)rect { } - (void)setX:(NSNumber *)x { - [store sdl_setObject:x forName:SDLRPCParameterNameX]; + [self.store sdl_setObject:x forName:SDLRPCParameterNameX]; } - (NSNumber *)x { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameX ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameX ofClass:NSNumber.class error:&error]; } - (void)setY:(NSNumber *)y { - [store sdl_setObject:y forName:SDLRPCParameterNameY]; + [self.store sdl_setObject:y forName:SDLRPCParameterNameY]; } - (NSNumber *)y { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameY ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameY ofClass:NSNumber.class error:&error]; } - (void)setWidth:(NSNumber *)width { - [store sdl_setObject:width forName:SDLRPCParameterNameWidth]; + [self.store sdl_setObject:width forName:SDLRPCParameterNameWidth]; } - (NSNumber *)width { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameWidth ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameWidth ofClass:NSNumber.class error:&error]; } - (void)setHeight:(NSNumber *)height { - [store sdl_setObject:height forName:SDLRPCParameterNameHeight]; + [self.store sdl_setObject:height forName:SDLRPCParameterNameHeight]; } - (NSNumber *)height { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameHeight ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeight ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLRegisterAppInterface.m b/SmartDeviceLink/SDLRegisterAppInterface.m index 963522619..6a752b641 100644 --- a/SmartDeviceLink/SDLRegisterAppInterface.m +++ b/SmartDeviceLink/SDLRegisterAppInterface.m @@ -23,11 +23,14 @@ @implementation SDLRegisterAppInterface #pragma mark - Lifecycle +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameRegisterAppInterface]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithLifecycleConfiguration:(SDLLifecycleConfiguration *)lifecycleConfiguration { NSArray *allHMITypes = lifecycleConfiguration.additionalAppTypes ? [lifecycleConfiguration.additionalAppTypes arrayByAddingObject:lifecycleConfiguration.appType] : @[lifecycleConfiguration.appType]; @@ -117,136 +120,136 @@ - (instancetype)initWithAppName:(NSString *)appName appId:(NSString *)appId full #pragma mark - Getters and Setters - (void)setSyncMsgVersion:(SDLSyncMsgVersion *)syncMsgVersion { - [parameters sdl_setObject:syncMsgVersion forName:SDLRPCParameterNameSyncMessageVersion]; + [self.parameters sdl_setObject:syncMsgVersion forName:SDLRPCParameterNameSyncMessageVersion]; } - (SDLSyncMsgVersion *)syncMsgVersion { - return [parameters sdl_objectForName:SDLRPCParameterNameSyncMessageVersion ofClass:SDLSyncMsgVersion.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncMessageVersion ofClass:SDLSyncMsgVersion.class error:nil]; } - (void)setAppName:(NSString *)appName { - [parameters sdl_setObject:appName forName:SDLRPCParameterNameAppName]; + [self.parameters sdl_setObject:appName forName:SDLRPCParameterNameAppName]; } - (NSString *)appName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameAppName ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppName ofClass:NSString.class error:&error]; } - (void)setTtsName:(nullable NSArray *)ttsName { - [parameters sdl_setObject:ttsName forName:SDLRPCParameterNameTTSName]; + [self.parameters sdl_setObject:ttsName forName:SDLRPCParameterNameTTSName]; } - (nullable NSArray *)ttsName { - return [parameters sdl_objectsForName:SDLRPCParameterNameTTSName ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTTSName ofClass:SDLTTSChunk.class error:nil]; } - (void)setNgnMediaScreenAppName:(nullable NSString *)ngnMediaScreenAppName { - [parameters sdl_setObject:ngnMediaScreenAppName forName:SDLRPCParameterNameNGNMediaScreenAppName]; + [self.parameters sdl_setObject:ngnMediaScreenAppName forName:SDLRPCParameterNameNGNMediaScreenAppName]; } - (nullable NSString *)ngnMediaScreenAppName { - return [parameters sdl_objectForName:SDLRPCParameterNameNGNMediaScreenAppName ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNGNMediaScreenAppName ofClass:NSString.class error:nil]; } - (void)setVrSynonyms:(nullable NSArray *)vrSynonyms { - [parameters sdl_setObject:vrSynonyms forName:SDLRPCParameterNameVRSynonyms]; + [self.parameters sdl_setObject:vrSynonyms forName:SDLRPCParameterNameVRSynonyms]; } - (nullable NSArray *)vrSynonyms { - return [parameters sdl_objectsForName:SDLRPCParameterNameVRSynonyms ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameVRSynonyms ofClass:NSString.class error:nil]; } - (void)setIsMediaApplication:(NSNumber *)isMediaApplication { - [parameters sdl_setObject:isMediaApplication forName:SDLRPCParameterNameIsMediaApplication]; + [self.parameters sdl_setObject:isMediaApplication forName:SDLRPCParameterNameIsMediaApplication]; } - (NSNumber *)isMediaApplication { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameIsMediaApplication ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameIsMediaApplication ofClass:NSNumber.class error:&error]; } - (void)setLanguageDesired:(SDLLanguage)languageDesired { - [parameters sdl_setObject:languageDesired forName:SDLRPCParameterNameLanguageDesired]; + [self.parameters sdl_setObject:languageDesired forName:SDLRPCParameterNameLanguageDesired]; } - (SDLLanguage)languageDesired { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameLanguageDesired error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameLanguageDesired error:&error]; } - (void)setHmiDisplayLanguageDesired:(SDLLanguage)hmiDisplayLanguageDesired { - [parameters sdl_setObject:hmiDisplayLanguageDesired forName:SDLRPCParameterNameHMIDisplayLanguageDesired]; + [self.parameters sdl_setObject:hmiDisplayLanguageDesired forName:SDLRPCParameterNameHMIDisplayLanguageDesired]; } - (SDLLanguage)hmiDisplayLanguageDesired { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguageDesired error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguageDesired error:&error]; } - (void)setAppHMIType:(nullable NSArray *)appHMIType { - [parameters sdl_setObject:appHMIType forName:SDLRPCParameterNameAppHMIType]; + [self.parameters sdl_setObject:appHMIType forName:SDLRPCParameterNameAppHMIType]; } - (nullable NSArray *)appHMIType { - return [parameters sdl_enumsForName:SDLRPCParameterNameAppHMIType error:nil]; + return [self.parameters sdl_enumsForName:SDLRPCParameterNameAppHMIType error:nil]; } - (void)setHashID:(nullable NSString *)hashID { - [parameters sdl_setObject:hashID forName:SDLRPCParameterNameHashId]; + [self.parameters sdl_setObject:hashID forName:SDLRPCParameterNameHashId]; } - (nullable NSString *)hashID { - return [parameters sdl_objectForName:SDLRPCParameterNameHashId ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHashId ofClass:NSString.class error:nil]; } - (void)setDeviceInfo:(nullable SDLDeviceInfo *)deviceInfo { - [parameters sdl_setObject:deviceInfo forName:SDLRPCParameterNameDeviceInfo]; + [self.parameters sdl_setObject:deviceInfo forName:SDLRPCParameterNameDeviceInfo]; } - (nullable SDLDeviceInfo *)deviceInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceInfo ofClass:SDLDeviceInfo.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceInfo ofClass:SDLDeviceInfo.class error:nil]; } - (void)setAppID:(NSString *)appID { - [parameters sdl_setObject:appID forName:SDLRPCParameterNameAppId]; + [self.parameters sdl_setObject:appID forName:SDLRPCParameterNameAppId]; } - (NSString *)appID { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameAppId ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppId ofClass:NSString.class error:&error]; } - (void)setFullAppID:(nullable NSString *)fullAppID { - [parameters sdl_setObject:fullAppID forName:SDLRPCParameterNameFullAppID]; + [self.parameters sdl_setObject:fullAppID forName:SDLRPCParameterNameFullAppID]; } - (nullable NSString *)fullAppID { - return [parameters sdl_objectForName:SDLRPCParameterNameFullAppID ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFullAppID ofClass:NSString.class error:nil]; } - (void)setAppInfo:(nullable SDLAppInfo *)appInfo { - [parameters sdl_setObject:appInfo forName:SDLRPCParameterNameAppInfo]; + [self.parameters sdl_setObject:appInfo forName:SDLRPCParameterNameAppInfo]; } - (nullable SDLAppInfo *)appInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameAppInfo ofClass:SDLAppInfo.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAppInfo ofClass:SDLAppInfo.class error:nil]; } - (void)setDayColorScheme:(nullable SDLTemplateColorScheme *)dayColorScheme { - [parameters sdl_setObject:dayColorScheme forName:SDLRPCParameterNameDayColorScheme]; + [self.parameters sdl_setObject:dayColorScheme forName:SDLRPCParameterNameDayColorScheme]; } - (nullable SDLTemplateColorScheme *)dayColorScheme { - return [parameters sdl_objectForName:SDLRPCParameterNameDayColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDayColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; } - (void)setNightColorScheme:(nullable SDLTemplateColorScheme *)nightColorScheme { - [parameters sdl_setObject:nightColorScheme forName:SDLRPCParameterNameNightColorScheme]; + [self.parameters sdl_setObject:nightColorScheme forName:SDLRPCParameterNameNightColorScheme]; } - (nullable SDLTemplateColorScheme *)nightColorScheme { - return [parameters sdl_objectForName:SDLRPCParameterNameNightColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNightColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRegisterAppInterfaceResponse.m b/SmartDeviceLink/SDLRegisterAppInterfaceResponse.m index d91d0dfb0..146491185 100644 --- a/SmartDeviceLink/SDLRegisterAppInterfaceResponse.m +++ b/SmartDeviceLink/SDLRegisterAppInterfaceResponse.m @@ -21,162 +21,165 @@ @implementation SDLRegisterAppInterfaceResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameRegisterAppInterface]) { } return self; } +#pragma clang diagnostic pop - (void)setSyncMsgVersion:(nullable SDLSyncMsgVersion *)syncMsgVersion { - [parameters sdl_setObject:syncMsgVersion forName:SDLRPCParameterNameSyncMessageVersion]; + [self.parameters sdl_setObject:syncMsgVersion forName:SDLRPCParameterNameSyncMessageVersion]; } - (nullable SDLSyncMsgVersion *)syncMsgVersion { - return [parameters sdl_objectForName:SDLRPCParameterNameSyncMessageVersion ofClass:SDLSyncMsgVersion.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncMessageVersion ofClass:SDLSyncMsgVersion.class error:nil]; } - (void)setLanguage:(nullable SDLLanguage)language { - [parameters sdl_setObject:language forName:SDLRPCParameterNameLanguage]; + [self.parameters sdl_setObject:language forName:SDLRPCParameterNameLanguage]; } - (nullable SDLLanguage)language { - return [parameters sdl_enumForName:SDLRPCParameterNameLanguage error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameLanguage error:nil]; } - (void)setHmiDisplayLanguage:(nullable SDLLanguage)hmiDisplayLanguage { - [parameters sdl_setObject:hmiDisplayLanguage forName:SDLRPCParameterNameHMIDisplayLanguage]; + [self.parameters sdl_setObject:hmiDisplayLanguage forName:SDLRPCParameterNameHMIDisplayLanguage]; } - (nullable SDLLanguage)hmiDisplayLanguage { - return [parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguage error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameHMIDisplayLanguage error:nil]; } - (void)setDisplayCapabilities:(nullable SDLDisplayCapabilities *)displayCapabilities { - [parameters sdl_setObject:displayCapabilities forName:SDLRPCParameterNameDisplayCapabilities]; + [self.parameters sdl_setObject:displayCapabilities forName:SDLRPCParameterNameDisplayCapabilities]; } - (nullable SDLDisplayCapabilities *)displayCapabilities { - return [parameters sdl_objectForName:SDLRPCParameterNameDisplayCapabilities ofClass:SDLDisplayCapabilities.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDisplayCapabilities ofClass:SDLDisplayCapabilities.class error:nil]; } - (void)setButtonCapabilities:(nullable NSArray *)buttonCapabilities { - [parameters sdl_setObject:buttonCapabilities forName:SDLRPCParameterNameButtonCapabilities]; + [self.parameters sdl_setObject:buttonCapabilities forName:SDLRPCParameterNameButtonCapabilities]; } - (nullable NSArray *)buttonCapabilities { - return [parameters sdl_objectsForName:SDLRPCParameterNameButtonCapabilities ofClass:SDLButtonCapabilities.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameButtonCapabilities ofClass:SDLButtonCapabilities.class error:nil]; } - (void)setSoftButtonCapabilities:(nullable NSArray *)softButtonCapabilities { - [parameters sdl_setObject:softButtonCapabilities forName:SDLRPCParameterNameSoftButtonCapabilities]; + [self.parameters sdl_setObject:softButtonCapabilities forName:SDLRPCParameterNameSoftButtonCapabilities]; } - (nullable NSArray *)softButtonCapabilities { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtonCapabilities ofClass:SDLSoftButtonCapabilities.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtonCapabilities ofClass:SDLSoftButtonCapabilities.class error:nil]; } - (void)setPresetBankCapabilities:(nullable SDLPresetBankCapabilities *)presetBankCapabilities { - [parameters sdl_setObject:presetBankCapabilities forName:SDLRPCParameterNamePresetBankCapabilities]; + [self.parameters sdl_setObject:presetBankCapabilities forName:SDLRPCParameterNamePresetBankCapabilities]; } - (nullable SDLPresetBankCapabilities *)presetBankCapabilities { - return [parameters sdl_objectForName:SDLRPCParameterNamePresetBankCapabilities ofClass:SDLPresetBankCapabilities.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePresetBankCapabilities ofClass:SDLPresetBankCapabilities.class error:nil]; } - (void)setHmiZoneCapabilities:(nullable NSArray *)hmiZoneCapabilities { - [parameters sdl_setObject:hmiZoneCapabilities forName:SDLRPCParameterNameHMIZoneCapabilities]; + [self.parameters sdl_setObject:hmiZoneCapabilities forName:SDLRPCParameterNameHMIZoneCapabilities]; } - (nullable NSArray *)hmiZoneCapabilities { - return [parameters sdl_enumsForName:SDLRPCParameterNameHMIZoneCapabilities error:nil]; + return [self.parameters sdl_enumsForName:SDLRPCParameterNameHMIZoneCapabilities error:nil]; } - (void)setSpeechCapabilities:(nullable NSArray *)speechCapabilities { - [parameters sdl_setObject:speechCapabilities forName:SDLRPCParameterNameSpeechCapabilities]; + [self.parameters sdl_setObject:speechCapabilities forName:SDLRPCParameterNameSpeechCapabilities]; } - (nullable NSArray *)speechCapabilities { - return [parameters sdl_enumsForName:SDLRPCParameterNameSpeechCapabilities error:nil]; + return [self.parameters sdl_enumsForName:SDLRPCParameterNameSpeechCapabilities error:nil]; } - (void)setPrerecordedSpeech:(nullable NSArray *)prerecordedSpeech { - [parameters sdl_setObject:prerecordedSpeech forName:SDLRPCParameterNamePrerecordedSpeech]; + [self.parameters sdl_setObject:prerecordedSpeech forName:SDLRPCParameterNamePrerecordedSpeech]; } - (nullable NSArray *)prerecordedSpeech { - return [parameters sdl_enumsForName:SDLRPCParameterNamePrerecordedSpeech error:nil]; + return [self.parameters sdl_enumsForName:SDLRPCParameterNamePrerecordedSpeech error:nil]; } - (void)setVrCapabilities:(nullable NSArray *)vrCapabilities { - [parameters sdl_setObject:vrCapabilities forName:SDLRPCParameterNameVRCapabilities]; + [self.parameters sdl_setObject:vrCapabilities forName:SDLRPCParameterNameVRCapabilities]; } - (nullable NSArray *)vrCapabilities { - return [parameters sdl_enumsForName:SDLRPCParameterNameVRCapabilities error:nil]; + return [self.parameters sdl_enumsForName:SDLRPCParameterNameVRCapabilities error:nil]; } - (void)setAudioPassThruCapabilities:(nullable NSArray *)audioPassThruCapabilities { - [parameters sdl_setObject:audioPassThruCapabilities forName:SDLRPCParameterNameAudioPassThruCapabilities]; + [self.parameters sdl_setObject:audioPassThruCapabilities forName:SDLRPCParameterNameAudioPassThruCapabilities]; } - (nullable NSArray *)audioPassThruCapabilities { - return [parameters sdl_objectsForName:SDLRPCParameterNameAudioPassThruCapabilities ofClass:SDLAudioPassThruCapabilities.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameAudioPassThruCapabilities ofClass:SDLAudioPassThruCapabilities.class error:nil]; } - (void)setPcmStreamCapabilities:(nullable SDLAudioPassThruCapabilities *)pcmStreamCapabilities { - [parameters sdl_setObject:pcmStreamCapabilities forName:SDLRPCParameterNamePCMStreamCapabilities]; + [self.parameters sdl_setObject:pcmStreamCapabilities forName:SDLRPCParameterNamePCMStreamCapabilities]; } - (nullable SDLAudioPassThruCapabilities *)pcmStreamCapabilities { - return [parameters sdl_objectForName:SDLRPCParameterNamePCMStreamCapabilities ofClass:SDLAudioPassThruCapabilities.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePCMStreamCapabilities ofClass:SDLAudioPassThruCapabilities.class error:nil]; } - (void)setVehicleType:(nullable SDLVehicleType *)vehicleType { - [parameters sdl_setObject:vehicleType forName:SDLRPCParameterNameVehicleType]; + [self.parameters sdl_setObject:vehicleType forName:SDLRPCParameterNameVehicleType]; } - (nullable SDLVehicleType *)vehicleType { - return [parameters sdl_objectForName:SDLRPCParameterNameVehicleType ofClass:SDLVehicleType.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameVehicleType ofClass:SDLVehicleType.class error:nil]; } - (void)setSupportedDiagModes:(nullable NSArray *> *)supportedDiagModes { - [parameters sdl_setObject:supportedDiagModes forName:SDLRPCParameterNameSupportedDiagnosticModes]; + [self.parameters sdl_setObject:supportedDiagModes forName:SDLRPCParameterNameSupportedDiagnosticModes]; } - (nullable NSArray *> *)supportedDiagModes { - return [parameters sdl_objectsForName:SDLRPCParameterNameSupportedDiagnosticModes ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSupportedDiagnosticModes ofClass:NSNumber.class error:nil]; } - (void)setHmiCapabilities:(nullable SDLHMICapabilities *)hmiCapabilities { - [parameters sdl_setObject:hmiCapabilities forName:SDLRPCParameterNameHMICapabilities]; + [self.parameters sdl_setObject:hmiCapabilities forName:SDLRPCParameterNameHMICapabilities]; } - (nullable SDLHMICapabilities *)hmiCapabilities { - return [parameters sdl_objectForName:SDLRPCParameterNameHMICapabilities ofClass:SDLHMICapabilities.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHMICapabilities ofClass:SDLHMICapabilities.class error:nil]; } - (void)setSdlVersion:(nullable NSString *)sdlVersion { - [parameters sdl_setObject:sdlVersion forName:SDLRPCParameterNameSDLVersion]; + [self.parameters sdl_setObject:sdlVersion forName:SDLRPCParameterNameSDLVersion]; } - (nullable NSString *)sdlVersion { - return [parameters sdl_objectForName:SDLRPCParameterNameSDLVersion ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSDLVersion ofClass:NSString.class error:nil]; } - (void)setSystemSoftwareVersion:(nullable NSString *)systemSoftwareVersion { - [parameters sdl_setObject:systemSoftwareVersion forName:SDLRPCParameterNameSystemSoftwareVersion]; + [self.parameters sdl_setObject:systemSoftwareVersion forName:SDLRPCParameterNameSystemSoftwareVersion]; } - (nullable NSString *)systemSoftwareVersion { - return [parameters sdl_objectForName:SDLRPCParameterNameSystemSoftwareVersion ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSystemSoftwareVersion ofClass:NSString.class error:nil]; } - (void)setIconResumed:(nullable NSNumber *)iconResumed { - [parameters sdl_setObject:iconResumed forName:SDLRPCParameterNameIconResumed]; + [self.parameters sdl_setObject:iconResumed forName:SDLRPCParameterNameIconResumed]; } - (nullable NSNumber *)iconResumed { - return [parameters sdl_objectForName:SDLRPCParameterNameIconResumed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameIconResumed ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLRemoteControlCapabilities.m b/SmartDeviceLink/SDLRemoteControlCapabilities.m index f1620af10..80a1b3f4e 100644 --- a/SmartDeviceLink/SDLRemoteControlCapabilities.m +++ b/SmartDeviceLink/SDLRemoteControlCapabilities.m @@ -40,59 +40,59 @@ - (instancetype)initWithClimateControlCapabilities:(nullable NSArray *)climateControlCapabilities { - [store sdl_setObject:climateControlCapabilities forName:SDLRPCParameterNameClimateControlCapabilities]; + [self.store sdl_setObject:climateControlCapabilities forName:SDLRPCParameterNameClimateControlCapabilities]; } - (nullable NSArray *)climateControlCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameClimateControlCapabilities ofClass:SDLClimateControlCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameClimateControlCapabilities ofClass:SDLClimateControlCapabilities.class error:nil]; } -(void)setRadioControlCapabilities:(nullable NSArray *)radioControlCapabilities { - [store sdl_setObject:radioControlCapabilities forName:SDLRPCParameterNameRadioControlCapabilities ]; + [self.store sdl_setObject:radioControlCapabilities forName:SDLRPCParameterNameRadioControlCapabilities ]; } - (nullable NSArray *)radioControlCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameRadioControlCapabilities ofClass:SDLRadioControlCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameRadioControlCapabilities ofClass:SDLRadioControlCapabilities.class error:nil]; } - (void)setButtonCapabilities:(nullable NSArray *)buttonCapabilities { - [store sdl_setObject:buttonCapabilities forName:SDLRPCParameterNameButtonCapabilities];} + [self.store sdl_setObject:buttonCapabilities forName:SDLRPCParameterNameButtonCapabilities];} - (nullable NSArray *)buttonCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameButtonCapabilities ofClass:SDLButtonCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameButtonCapabilities ofClass:SDLButtonCapabilities.class error:nil]; } - (void)setSeatControlCapabilities:(nullable NSArray *)seatControlCapabilities { - [store sdl_setObject:seatControlCapabilities forName:SDLRPCParameterNameSeatControlCapabilities]; + [self.store sdl_setObject:seatControlCapabilities forName:SDLRPCParameterNameSeatControlCapabilities]; } - (nullable NSArray *)seatControlCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameSeatControlCapabilities ofClass:SDLSeatControlCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameSeatControlCapabilities ofClass:SDLSeatControlCapabilities.class error:nil]; } - (void)setAudioControlCapabilities:(nullable NSArray *)audioControlCapabilities { - [store sdl_setObject:audioControlCapabilities forName:SDLRPCParameterNameAudioControlCapabilities]; + [self.store sdl_setObject:audioControlCapabilities forName:SDLRPCParameterNameAudioControlCapabilities]; } - (nullable NSArray *)audioControlCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameAudioControlCapabilities ofClass:SDLAudioControlCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameAudioControlCapabilities ofClass:SDLAudioControlCapabilities.class error:nil]; } - (void)setHmiSettingsControlCapabilities:(nullable NSArray *)hmiSettingsControlCapabilities { - [store sdl_setObject:hmiSettingsControlCapabilities forName:SDLRPCParameterNameHmiSettingsControlCapabilities]; + [self.store sdl_setObject:hmiSettingsControlCapabilities forName:SDLRPCParameterNameHmiSettingsControlCapabilities]; } - (nullable NSArray *)hmiSettingsControlCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameHmiSettingsControlCapabilities ofClass:SDLHMISettingsControlCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameHmiSettingsControlCapabilities ofClass:SDLHMISettingsControlCapabilities.class error:nil]; } - (void)setLightControlCapabilities:(nullable NSArray *)lightControlCapabilities { - [store sdl_setObject:lightControlCapabilities forName:SDLRPCParameterNameLightControlCapabilities]; + [self.store sdl_setObject:lightControlCapabilities forName:SDLRPCParameterNameLightControlCapabilities]; } - (nullable NSArray *)lightControlCapabilities { - return [store sdl_objectsForName:SDLRPCParameterNameLightControlCapabilities ofClass:SDLLightControlCapabilities.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameLightControlCapabilities ofClass:SDLLightControlCapabilities.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLResetGlobalProperties.m b/SmartDeviceLink/SDLResetGlobalProperties.m index 331f560bd..8b60852f9 100644 --- a/SmartDeviceLink/SDLResetGlobalProperties.m +++ b/SmartDeviceLink/SDLResetGlobalProperties.m @@ -13,11 +13,14 @@ @implementation SDLResetGlobalProperties +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameResetGlobalProperties]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithProperties:(NSArray *)properties { self = [self init]; @@ -31,12 +34,12 @@ - (instancetype)initWithProperties:(NSArray *)properties { } - (void)setProperties:(NSArray *)properties { - [parameters sdl_setObject:properties forName:SDLRPCParameterNameProperties]; + [self.parameters sdl_setObject:properties forName:SDLRPCParameterNameProperties]; } - (NSArray *)properties { NSError *error = nil; - return [parameters sdl_enumsForName:SDLRPCParameterNameProperties error:&error]; + return [self.parameters sdl_enumsForName:SDLRPCParameterNameProperties error:&error]; } @end diff --git a/SmartDeviceLink/SDLResetGlobalPropertiesResponse.m b/SmartDeviceLink/SDLResetGlobalPropertiesResponse.m index 65bde4093..974b5efa9 100644 --- a/SmartDeviceLink/SDLResetGlobalPropertiesResponse.m +++ b/SmartDeviceLink/SDLResetGlobalPropertiesResponse.m @@ -12,11 +12,14 @@ @implementation SDLResetGlobalPropertiesResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameResetGlobalProperties]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSISData.m b/SmartDeviceLink/SDLSISData.m index f7589afd9..c0ff47cbf 100644 --- a/SmartDeviceLink/SDLSISData.m +++ b/SmartDeviceLink/SDLSISData.m @@ -28,43 +28,43 @@ - (instancetype)initWithStationShortName:(nullable NSString *)stationShortName s } - (void)setStationShortName:(nullable NSString *)stationShortName { - [store sdl_setObject:stationShortName forName:SDLRPCParameterNameStationShortName]; + [self.store sdl_setObject:stationShortName forName:SDLRPCParameterNameStationShortName]; } - (nullable NSString *)stationShortName { - return [store sdl_objectForName:SDLRPCParameterNameStationShortName ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameStationShortName ofClass:NSString.class error:nil]; } - (void)setStationIDNumber:(nullable SDLStationIDNumber *)stationIDNumber { - [store sdl_setObject:stationIDNumber forName:SDLRPCParameterNameStationIDNumber]; + [self.store sdl_setObject:stationIDNumber forName:SDLRPCParameterNameStationIDNumber]; } - (nullable SDLStationIDNumber *)stationIDNumber { - return [store sdl_objectForName:SDLRPCParameterNameStationIDNumber ofClass:SDLStationIDNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameStationIDNumber ofClass:SDLStationIDNumber.class error:nil]; } - (void)setStationLongName:(nullable NSString *)stationLongName { - [store sdl_setObject:stationLongName forName:SDLRPCParameterNameStationLongName]; + [self.store sdl_setObject:stationLongName forName:SDLRPCParameterNameStationLongName]; } - (nullable NSString *)stationLongName { - return [store sdl_objectForName:SDLRPCParameterNameStationLongName ofClass:NSString.class error:nil];; + return [self.store sdl_objectForName:SDLRPCParameterNameStationLongName ofClass:NSString.class error:nil];; } - (void)setStationLocation:(nullable SDLGPSData *)stationLocation { - [store sdl_setObject:stationLocation forName:SDLRPCParameterNameStationLocation]; + [self.store sdl_setObject:stationLocation forName:SDLRPCParameterNameStationLocation]; } - (nullable SDLGPSData *)stationLocation { - return [store sdl_objectForName:SDLRPCParameterNameStationLocation ofClass:SDLGPSData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameStationLocation ofClass:SDLGPSData.class error:nil]; } - (void)setStationMessage:(nullable NSString *)stationMessage { - [store sdl_setObject:stationMessage forName:SDLRPCParameterNameStationMessage]; + [self.store sdl_setObject:stationMessage forName:SDLRPCParameterNameStationMessage]; } - (nullable NSString *)stationMessage { - return [store sdl_objectForName:SDLRPCParameterNameStationMessage ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameStationMessage ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLScreenParams.m b/SmartDeviceLink/SDLScreenParams.m index 039f054e8..5a99d0aea 100644 --- a/SmartDeviceLink/SDLScreenParams.m +++ b/SmartDeviceLink/SDLScreenParams.m @@ -13,20 +13,20 @@ @implementation SDLScreenParams - (void)setResolution:(SDLImageResolution *)resolution { - [store sdl_setObject:resolution forName:SDLRPCParameterNameResolution]; + [self.store sdl_setObject:resolution forName:SDLRPCParameterNameResolution]; } - (SDLImageResolution *)resolution { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameResolution ofClass:SDLImageResolution.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameResolution ofClass:SDLImageResolution.class error:&error]; } - (void)setTouchEventAvailable:(nullable SDLTouchEventCapabilities *)touchEventAvailable { - [store sdl_setObject:touchEventAvailable forName:SDLRPCParameterNameTouchEventAvailable]; + [self.store sdl_setObject:touchEventAvailable forName:SDLRPCParameterNameTouchEventAvailable]; } - (nullable SDLTouchEventCapabilities *)touchEventAvailable { - return [store sdl_objectForName:SDLRPCParameterNameTouchEventAvailable ofClass:SDLTouchEventCapabilities.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTouchEventAvailable ofClass:SDLTouchEventCapabilities.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLScrollableMessage.m b/SmartDeviceLink/SDLScrollableMessage.m index 034190e34..774ccb996 100644 --- a/SmartDeviceLink/SDLScrollableMessage.m +++ b/SmartDeviceLink/SDLScrollableMessage.m @@ -13,11 +13,14 @@ @implementation SDLScrollableMessage +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameScrollableMessage]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithMessage:(NSString *)message timeout:(UInt16)timeout softButtons:(nullable NSArray *)softButtons { self = [self initWithMessage:message]; @@ -43,28 +46,28 @@ - (instancetype)initWithMessage:(NSString *)message { } - (void)setScrollableMessageBody:(NSString *)scrollableMessageBody { - [parameters sdl_setObject:scrollableMessageBody forName:SDLRPCParameterNameScrollableMessageBody]; + [self.parameters sdl_setObject:scrollableMessageBody forName:SDLRPCParameterNameScrollableMessageBody]; } - (NSString *)scrollableMessageBody { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameScrollableMessageBody ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameScrollableMessageBody ofClass:NSString.class error:&error]; } - (void)setTimeout:(nullable NSNumber *)timeout { - [parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; + [self.parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; } - (nullable NSNumber *)timeout { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; } - (void)setSoftButtons:(nullable NSArray *)softButtons { - [parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; + [self.parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; } - (nullable NSArray *)softButtons { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLScrollableMessageResponse.m b/SmartDeviceLink/SDLScrollableMessageResponse.m index 4065ca985..df9112711 100644 --- a/SmartDeviceLink/SDLScrollableMessageResponse.m +++ b/SmartDeviceLink/SDLScrollableMessageResponse.m @@ -10,10 +10,13 @@ @implementation SDLScrollableMessageResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameScrollableMessage]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSeatControlCapabilities.m b/SmartDeviceLink/SDLSeatControlCapabilities.m index 0c5a95c58..7aa4c2b5d 100644 --- a/SmartDeviceLink/SDLSeatControlCapabilities.m +++ b/SmartDeviceLink/SDLSeatControlCapabilities.m @@ -44,159 +44,159 @@ - (instancetype)initWithName:(NSString *)moduleName heatingEnabledAvailable:(BOO } - (void)setModuleName:(NSString *)moduleName { - [store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; + [self.store sdl_setObject:moduleName forName:SDLRPCParameterNameModuleName]; } - (NSString *)moduleName { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameModuleName ofClass:NSString.class error:&error]; } - (void)setHeatingEnabledAvailable:(nullable NSNumber *)heatingEnabledAvailable { - [store sdl_setObject:heatingEnabledAvailable forName:SDLRPCParameterNameHeatingEnabledAvailable]; + [self.store sdl_setObject:heatingEnabledAvailable forName:SDLRPCParameterNameHeatingEnabledAvailable]; } - (nullable NSNumber *)heatingEnabledAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeatingEnabledAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatingEnabledAvailable ofClass:NSNumber.class error:nil]; } - (void)setCoolingEnabledAvailable:(nullable NSNumber *)coolingEnabledAvailable { - [store sdl_setObject:coolingEnabledAvailable forName:SDLRPCParameterNameCoolingEnabledAvailable]; + [self.store sdl_setObject:coolingEnabledAvailable forName:SDLRPCParameterNameCoolingEnabledAvailable]; } - (nullable NSNumber *)coolingEnabledAvailable { - return [store sdl_objectForName:SDLRPCParameterNameCoolingEnabledAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCoolingEnabledAvailable ofClass:NSNumber.class error:nil]; } - (void)setHeatingLevelAvailable:(nullable NSNumber *)heatingLevelAvailable { - [store sdl_setObject:heatingLevelAvailable forName:SDLRPCParameterNameHeatingLevelAvailable]; + [self.store sdl_setObject:heatingLevelAvailable forName:SDLRPCParameterNameHeatingLevelAvailable]; } - (nullable NSNumber *)heatingLevelAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeatingLevelAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatingLevelAvailable ofClass:NSNumber.class error:nil]; } - (void)setCoolingLevelAvailable:(nullable NSNumber *)coolingLevelAvailable { - [store sdl_setObject:coolingLevelAvailable forName:SDLRPCParameterNameCoolingLevelAvailable]; + [self.store sdl_setObject:coolingLevelAvailable forName:SDLRPCParameterNameCoolingLevelAvailable]; } - (nullable NSNumber *)coolingLevelAvailable { - return [store sdl_objectForName:SDLRPCParameterNameCoolingLevelAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCoolingLevelAvailable ofClass:NSNumber.class error:nil]; } - (void)setHorizontalPositionAvailable:(nullable NSNumber *)horizontalPositionAvailable { - [store sdl_setObject:horizontalPositionAvailable forName:SDLRPCParameterNameHorizontalPositionAvailable]; + [self.store sdl_setObject:horizontalPositionAvailable forName:SDLRPCParameterNameHorizontalPositionAvailable]; } - (nullable NSNumber *)horizontalPositionAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHorizontalPositionAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHorizontalPositionAvailable ofClass:NSNumber.class error:nil]; } - (void)setVerticalPositionAvailable:(nullable NSNumber *)verticalPositionAvailable { - [store sdl_setObject:verticalPositionAvailable forName:SDLRPCParameterNameVerticalPositionAvailable]; + [self.store sdl_setObject:verticalPositionAvailable forName:SDLRPCParameterNameVerticalPositionAvailable]; } - (nullable NSNumber *)verticalPositionAvailable { - return [store sdl_objectForName:SDLRPCParameterNameVerticalPositionAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVerticalPositionAvailable ofClass:NSNumber.class error:nil]; } - (void)setFrontVerticalPositionAvailable:(nullable NSNumber *)frontVerticalPositionAvailable { - [store sdl_setObject:frontVerticalPositionAvailable forName:SDLRPCParameterNameFrontVerticalPositionAvailable]; + [self.store sdl_setObject:frontVerticalPositionAvailable forName:SDLRPCParameterNameFrontVerticalPositionAvailable]; } - (nullable NSNumber *)frontVerticalPositionAvailable { - return [store sdl_objectForName:SDLRPCParameterNameFrontVerticalPositionAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFrontVerticalPositionAvailable ofClass:NSNumber.class error:nil]; } - (void)setBackVerticalPositionAvailable:(nullable NSNumber *)backVerticalPositionAvailable { - [store sdl_setObject:backVerticalPositionAvailable forName:SDLRPCParameterNameBackVerticalPositionAvailable]; + [self.store sdl_setObject:backVerticalPositionAvailable forName:SDLRPCParameterNameBackVerticalPositionAvailable]; } - (nullable NSNumber *)backVerticalPositionAvailable { - return [store sdl_objectForName:SDLRPCParameterNameBackVerticalPositionAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameBackVerticalPositionAvailable ofClass:NSNumber.class error:nil]; } - (void)setBackTiltAngleAvailable:(nullable NSNumber *)backTiltAngleAvailable { - [store sdl_setObject:backTiltAngleAvailable forName:SDLRPCParameterNameBackTiltAngleAvailable]; + [self.store sdl_setObject:backTiltAngleAvailable forName:SDLRPCParameterNameBackTiltAngleAvailable]; } - (nullable NSNumber *)backTiltAngleAvailable { - return [store sdl_objectForName:SDLRPCParameterNameBackTiltAngleAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameBackTiltAngleAvailable ofClass:NSNumber.class error:nil]; } - (void)setHeadSupportHorizontalPositionAvailable:(nullable NSNumber *)headSupportHorizontalPositionAvailable { - [store sdl_setObject:headSupportHorizontalPositionAvailable forName:SDLRPCParameterNameHeadSupportHorizontalPositionAvailable]; + [self.store sdl_setObject:headSupportHorizontalPositionAvailable forName:SDLRPCParameterNameHeadSupportHorizontalPositionAvailable]; } - (nullable NSNumber *)headSupportHorizontalPositionAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeadSupportHorizontalPositionAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeadSupportHorizontalPositionAvailable ofClass:NSNumber.class error:nil]; } - (void)setHeadSupportVerticalPositionAvailable:(nullable NSNumber *)headSupportVerticalPositionAvailable { - [store sdl_setObject:headSupportVerticalPositionAvailable forName:SDLRPCParameterNameHeadSupportVerticalPositionAvailable]; + [self.store sdl_setObject:headSupportVerticalPositionAvailable forName:SDLRPCParameterNameHeadSupportVerticalPositionAvailable]; } - (nullable NSNumber *)headSupportVerticalPositionAvailable { - return [store sdl_objectForName:SDLRPCParameterNameHeadSupportVerticalPositionAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeadSupportVerticalPositionAvailable ofClass:NSNumber.class error:nil]; } - (void)setMassageEnabledAvailable:(nullable NSNumber *)massageEnabledAvailable { - [store sdl_setObject:massageEnabledAvailable forName:SDLRPCParameterNameMassageEnabledAvailable]; + [self.store sdl_setObject:massageEnabledAvailable forName:SDLRPCParameterNameMassageEnabledAvailable]; } - (nullable NSNumber *)massageEnabledAvailable { - return [store sdl_objectForName:SDLRPCParameterNameMassageEnabledAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMassageEnabledAvailable ofClass:NSNumber.class error:nil]; } - (void)setMassageModeAvailable:(nullable NSNumber *)massageModeAvailable { - [store sdl_setObject:massageModeAvailable forName:SDLRPCParameterNameMassageModeAvailable]; + [self.store sdl_setObject:massageModeAvailable forName:SDLRPCParameterNameMassageModeAvailable]; } - (nullable NSNumber *)massageModeAvailable { - return [store sdl_objectForName:SDLRPCParameterNameMassageModeAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMassageModeAvailable ofClass:NSNumber.class error:nil]; } - (void)setMassageCushionFirmnessAvailable:(nullable NSNumber *)massageCushionFirmnessAvailable { - [store sdl_setObject:massageCushionFirmnessAvailable forName:SDLRPCParameterNameMassageCushionFirmnessAvailable]; + [self.store sdl_setObject:massageCushionFirmnessAvailable forName:SDLRPCParameterNameMassageCushionFirmnessAvailable]; } - (nullable NSNumber *)massageCushionFirmnessAvailable { - return [store sdl_objectForName:SDLRPCParameterNameMassageCushionFirmnessAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMassageCushionFirmnessAvailable ofClass:NSNumber.class error:nil]; } - (void)setMemoryAvailable:(nullable NSNumber *)memoryAvailable { - [store sdl_setObject:memoryAvailable forName:SDLRPCParameterNameMemoryAvailable]; + [self.store sdl_setObject:memoryAvailable forName:SDLRPCParameterNameMemoryAvailable]; } - (nullable NSNumber *)memoryAvailable { - return [store sdl_objectForName:SDLRPCParameterNameMemoryAvailable ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMemoryAvailable ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSeatControlData.m b/SmartDeviceLink/SDLSeatControlData.m index 734c412a7..7fbebb67b 100644 --- a/SmartDeviceLink/SDLSeatControlData.m +++ b/SmartDeviceLink/SDLSeatControlData.m @@ -54,133 +54,133 @@ - (instancetype)initWithId:(SDLSupportedSeat)supportedSeat heatingEnabled:(BOOL) } - (void)setId:(SDLSupportedSeat)id { - [store sdl_setObject:id forName:SDLRPCParameterNameId]; + [self.store sdl_setObject:id forName:SDLRPCParameterNameId]; } - (SDLSupportedSeat)id { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameId error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameId error:&error]; } - (void)setHeatingEnabled:(nullable NSNumber *)heatingEnabled { - [store sdl_setObject:heatingEnabled forName:SDLRPCParameterNameHeatingEnabled]; + [self.store sdl_setObject:heatingEnabled forName:SDLRPCParameterNameHeatingEnabled]; } - (nullable NSNumber *)heatingEnabled { - return [store sdl_objectForName:SDLRPCParameterNameHeatingEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatingEnabled ofClass:NSNumber.class error:nil]; } - (void)setCoolingEnabled:(nullable NSNumber *)coolingEnabled { - [store sdl_setObject:coolingEnabled forName:SDLRPCParameterNameCoolingEnabled]; + [self.store sdl_setObject:coolingEnabled forName:SDLRPCParameterNameCoolingEnabled]; } - (nullable NSNumber *)coolingEnabled { - return [store sdl_objectForName:SDLRPCParameterNameCoolingEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCoolingEnabled ofClass:NSNumber.class error:nil]; } - (void)setHeatingLevel:(nullable NSNumber *)heatingLevel { - [store sdl_setObject:heatingLevel forName:SDLRPCParameterNameHeatingLevel]; + [self.store sdl_setObject:heatingLevel forName:SDLRPCParameterNameHeatingLevel]; } - (nullable NSNumber *)heatingLevel { - return [store sdl_objectForName:SDLRPCParameterNameHeatingLevel ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeatingLevel ofClass:NSNumber.class error:nil]; } - (void)setCoolingLevel:(nullable NSNumber *)coolingLevel { - [store sdl_setObject:coolingLevel forName:SDLRPCParameterNameCoolingLevel]; + [self.store sdl_setObject:coolingLevel forName:SDLRPCParameterNameCoolingLevel]; } - (nullable NSNumber *)coolingLevel { - return [store sdl_objectForName:SDLRPCParameterNameCoolingLevel ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCoolingLevel ofClass:NSNumber.class error:nil]; } - (void)setHorizontalPosition:(nullable NSNumber *)horizontalPosition { - [store sdl_setObject:horizontalPosition forName:SDLRPCParameterNameHorizontalPosition]; + [self.store sdl_setObject:horizontalPosition forName:SDLRPCParameterNameHorizontalPosition]; } - (nullable NSNumber *)horizontalPosition { - return [store sdl_objectForName:SDLRPCParameterNameHorizontalPosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHorizontalPosition ofClass:NSNumber.class error:nil]; } - (void)setVerticalPosition:(nullable NSNumber *)verticalPosition { - [store sdl_setObject:verticalPosition forName:SDLRPCParameterNameVerticalPosition]; + [self.store sdl_setObject:verticalPosition forName:SDLRPCParameterNameVerticalPosition]; } - (nullable NSNumber *)verticalPosition { - return [store sdl_objectForName:SDLRPCParameterNameVerticalPosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVerticalPosition ofClass:NSNumber.class error:nil]; } - (void)setFrontVerticalPosition:(nullable NSNumber *)frontVerticalPosition { - [store sdl_setObject:frontVerticalPosition forName:SDLRPCParameterNameFrontVerticalPosition]; + [self.store sdl_setObject:frontVerticalPosition forName:SDLRPCParameterNameFrontVerticalPosition]; } - (nullable NSNumber *)frontVerticalPosition { - return [store sdl_objectForName:SDLRPCParameterNameFrontVerticalPosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFrontVerticalPosition ofClass:NSNumber.class error:nil]; } - (void)setBackVerticalPosition:(nullable NSNumber *)backVerticalPosition { - [store sdl_setObject:backVerticalPosition forName:SDLRPCParameterNameBackVerticalPosition]; + [self.store sdl_setObject:backVerticalPosition forName:SDLRPCParameterNameBackVerticalPosition]; } - (nullable NSNumber *)backVerticalPosition { - return [store sdl_objectForName:SDLRPCParameterNameBackVerticalPosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameBackVerticalPosition ofClass:NSNumber.class error:nil]; } - (void)setBackTiltAngle:(nullable NSNumber *)backTiltAngle { - [store sdl_setObject:backTiltAngle forName:SDLRPCParameterNameBackTiltAngle]; + [self.store sdl_setObject:backTiltAngle forName:SDLRPCParameterNameBackTiltAngle]; } - (nullable NSNumber *)backTiltAngle { - return [store sdl_objectForName:SDLRPCParameterNameBackTiltAngle ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameBackTiltAngle ofClass:NSNumber.class error:nil]; } - (void)setHeadSupportHorizontalPosition:(nullable NSNumber *)headSupportHorizontalPosition { - [store sdl_setObject:headSupportHorizontalPosition forName:SDLRPCParameterNameHeadSupportHorizontalPosition]; + [self.store sdl_setObject:headSupportHorizontalPosition forName:SDLRPCParameterNameHeadSupportHorizontalPosition]; } - (nullable NSNumber *)headSupportHorizontalPosition { - return [store sdl_objectForName:SDLRPCParameterNameHeadSupportHorizontalPosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeadSupportHorizontalPosition ofClass:NSNumber.class error:nil]; } -(void)setHeadSupportVerticalPosition:(nullable NSNumber *)headSupportVerticalPosition { - [store sdl_setObject:headSupportVerticalPosition forName:SDLRPCParameterNameHeadSupportVerticalPosition]; + [self.store sdl_setObject:headSupportVerticalPosition forName:SDLRPCParameterNameHeadSupportVerticalPosition]; } - (nullable NSNumber *)headSupportVerticalPosition { - return [store sdl_objectForName:SDLRPCParameterNameHeadSupportVerticalPosition ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHeadSupportVerticalPosition ofClass:NSNumber.class error:nil]; } - (void)setMassageEnabled:(nullable NSNumber *)massageEnabled { - [store sdl_setObject:massageEnabled forName:SDLRPCParameterNameMassageEnabled]; + [self.store sdl_setObject:massageEnabled forName:SDLRPCParameterNameMassageEnabled]; } - (nullable NSNumber *)massageEnabled { - return [store sdl_objectForName:SDLRPCParameterNameMassageEnabled ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMassageEnabled ofClass:NSNumber.class error:nil]; } - (void)setMassageMode:(nullable NSArray *)massageMode { - [store sdl_setObject:massageMode forName:SDLRPCParameterNameMassageMode]; + [self.store sdl_setObject:massageMode forName:SDLRPCParameterNameMassageMode]; } - (nullable NSArray *)massageMode { - return [store sdl_objectsForName:SDLRPCParameterNameMassageMode ofClass:SDLMassageModeData.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameMassageMode ofClass:SDLMassageModeData.class error:nil]; } - (void)setMassageCushionFirmness:(nullable NSArray *)massageCushionFirmness { - [store sdl_setObject:massageCushionFirmness forName:SDLRPCParameterNameMassageCushionFirmness]; + [self.store sdl_setObject:massageCushionFirmness forName:SDLRPCParameterNameMassageCushionFirmness]; } - (nullable NSArray *)massageCushionFirmness { - return [store sdl_objectsForName:SDLRPCParameterNameMassageCushionFirmness ofClass:SDLMassageCushionFirmness.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameMassageCushionFirmness ofClass:SDLMassageCushionFirmness.class error:nil]; } - (void)setMemory:(nullable SDLSeatMemoryAction *)memory { - [store sdl_setObject:memory forName:SDLRPCParameterNameMemory]; + [self.store sdl_setObject:memory forName:SDLRPCParameterNameMemory]; } - (nullable SDLSeatMemoryAction *)memory { - return [store sdl_objectForName:SDLRPCParameterNameMemory ofClass:SDLSeatMemoryAction.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMemory ofClass:SDLSeatMemoryAction.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSeatMemoryAction.m b/SmartDeviceLink/SDLSeatMemoryAction.m index a4144901a..3c2bde049 100644 --- a/SmartDeviceLink/SDLSeatMemoryAction.m +++ b/SmartDeviceLink/SDLSeatMemoryAction.m @@ -32,29 +32,29 @@ - (instancetype)initWithId:(UInt8)id label:(nullable NSString*)label action:(SDL } - (void)setId:(NSNumber *)id { - [store sdl_setObject:id forName:SDLRPCParameterNameId]; + [self.store sdl_setObject:id forName:SDLRPCParameterNameId]; } - (NSNumber *)id { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameId ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameId ofClass:NSNumber.class error:&error]; } - (void)setLabel:(nullable NSString *)label { - [store sdl_setObject:label forName:SDLRPCParameterNameLabel]; + [self.store sdl_setObject:label forName:SDLRPCParameterNameLabel]; } - (nullable NSString *)label { - return [store sdl_objectForName:SDLRPCParameterNameLabel ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameLabel ofClass:NSString.class error:nil]; } - (void)setAction:(SDLSeatMemoryActionType)action { - [store sdl_setObject:action forName:SDLRPCParameterNameAction]; + [self.store sdl_setObject:action forName:SDLRPCParameterNameAction]; } - (SDLSeatMemoryActionType)action { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameAction error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameAction error:&error]; } @end diff --git a/SmartDeviceLink/SDLSendHapticData.m b/SmartDeviceLink/SDLSendHapticData.m index 3302fbe49..f684b4114 100644 --- a/SmartDeviceLink/SDLSendHapticData.m +++ b/SmartDeviceLink/SDLSendHapticData.m @@ -16,11 +16,14 @@ @implementation SDLSendHapticData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSendHapticData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithHapticRectData:(NSArray *)hapticRectData { self = [self init]; @@ -34,11 +37,11 @@ - (instancetype)initWithHapticRectData:(NSArray *)hapticRectDat } - (void)setHapticRectData:(nullable NSArray *)hapticRectData { - [parameters sdl_setObject:hapticRectData forName:SDLRPCParameterNameHapticRectData]; + [self.parameters sdl_setObject:hapticRectData forName:SDLRPCParameterNameHapticRectData]; } - (nullable NSArray *)hapticRectData { - return [parameters sdl_objectsForName:SDLRPCParameterNameHapticRectData ofClass:SDLHapticRect.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameHapticRectData ofClass:SDLHapticRect.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSendHapticDataResponse.m b/SmartDeviceLink/SDLSendHapticDataResponse.m index 4c14b47d7..dd7231c07 100644 --- a/SmartDeviceLink/SDLSendHapticDataResponse.m +++ b/SmartDeviceLink/SDLSendHapticDataResponse.m @@ -15,11 +15,14 @@ @implementation SDLSendHapticDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSendHapticData]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSendLocation.m b/SmartDeviceLink/SDLSendLocation.m index 5874a86f3..a63db0cae 100644 --- a/SmartDeviceLink/SDLSendLocation.m +++ b/SmartDeviceLink/SDLSendLocation.m @@ -12,6 +12,8 @@ @implementation SDLSendLocation +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { self = [super initWithName:SDLRPCFunctionNameSendLocation]; if (!self) { @@ -20,6 +22,7 @@ - (instancetype)init { return self; } +#pragma clang diagnostic pop - (instancetype)initWithAddress:(SDLOasisAddress *)address addressLines:(nullable NSArray *)addressLines locationName:(nullable NSString *)locationName locationDescription:(nullable NSString *)locationDescription phoneNumber:(nullable NSString *)phoneNumber image:(nullable SDLImage *)image deliveryMode:(nullable SDLDeliveryMode)deliveryMode timeStamp:(nullable SDLDateTime *)timeStamp { self = [self init]; @@ -62,83 +65,83 @@ - (instancetype)initWithLongitude:(double)longitude latitude:(double)latitude lo } - (void)setLongitudeDegrees:(nullable NSNumber *)longitudeDegrees { - [parameters sdl_setObject:longitudeDegrees forName:SDLRPCParameterNameLongitudeDegrees]; + [self.parameters sdl_setObject:longitudeDegrees forName:SDLRPCParameterNameLongitudeDegrees]; } - (nullable NSNumber *)longitudeDegrees { - return [parameters sdl_objectForName:SDLRPCParameterNameLongitudeDegrees ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLongitudeDegrees ofClass:NSNumber.class error:nil]; } - (void)setLatitudeDegrees:(nullable NSNumber *)latitudeDegrees { - [parameters sdl_setObject:latitudeDegrees forName:SDLRPCParameterNameLatitudeDegrees]; + [self.parameters sdl_setObject:latitudeDegrees forName:SDLRPCParameterNameLatitudeDegrees]; } - (nullable NSNumber *)latitudeDegrees { - return [parameters sdl_objectForName:SDLRPCParameterNameLatitudeDegrees ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLatitudeDegrees ofClass:NSNumber.class error:nil]; } - (void)setLocationName:(nullable NSString *)locationName { - [parameters sdl_setObject:locationName forName:SDLRPCParameterNameLocationName]; + [self.parameters sdl_setObject:locationName forName:SDLRPCParameterNameLocationName]; } - (nullable NSString *)locationName { - return [parameters sdl_objectForName:SDLRPCParameterNameLocationName ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLocationName ofClass:NSString.class error:nil]; } - (void)setAddressLines:(nullable NSArray *)addressLines { - [parameters sdl_setObject:addressLines forName:SDLRPCParameterNameAddressLines]; + [self.parameters sdl_setObject:addressLines forName:SDLRPCParameterNameAddressLines]; } - (nullable NSString *)locationDescription { - return [parameters sdl_objectForName:SDLRPCParameterNameLocationDescription ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLocationDescription ofClass:NSString.class error:nil]; } - (void)setLocationDescription:(nullable NSString *)locationDescription { - [parameters sdl_setObject:locationDescription forName:SDLRPCParameterNameLocationDescription]; + [self.parameters sdl_setObject:locationDescription forName:SDLRPCParameterNameLocationDescription]; } - (nullable NSArray *)addressLines { - return [parameters sdl_objectsForName:SDLRPCParameterNameAddressLines ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameAddressLines ofClass:NSString.class error:nil]; } - (void)setPhoneNumber:(nullable NSString *)phoneNumber { - [parameters sdl_setObject:phoneNumber forName:SDLRPCParameterNamePhoneNumber]; + [self.parameters sdl_setObject:phoneNumber forName:SDLRPCParameterNamePhoneNumber]; } - (nullable NSString *)phoneNumber { - return [parameters sdl_objectForName:SDLRPCParameterNamePhoneNumber ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePhoneNumber ofClass:NSString.class error:nil]; } - (void)setLocationImage:(nullable SDLImage *)locationImage { - [parameters sdl_setObject:locationImage forName:SDLRPCParameterNameLocationImage]; + [self.parameters sdl_setObject:locationImage forName:SDLRPCParameterNameLocationImage]; } - (nullable SDLImage *)locationImage { - return [parameters sdl_objectForName:SDLRPCParameterNameLocationImage ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameLocationImage ofClass:SDLImage.class error:nil]; } - (void)setDeliveryMode:(nullable SDLDeliveryMode)deliveryMode { - [parameters sdl_setObject:deliveryMode forName:SDLRPCParameterNameDeliveryMode]; + [self.parameters sdl_setObject:deliveryMode forName:SDLRPCParameterNameDeliveryMode]; } - (nullable SDLDeliveryMode)deliveryMode { - return [parameters sdl_enumForName:SDLRPCParameterNameDeliveryMode error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameDeliveryMode error:nil]; } - (void)setTimeStamp:(nullable SDLDateTime *)timeStamp { - [parameters sdl_setObject:timeStamp forName:SDLRPCParameterNameTimeStamp]; + [self.parameters sdl_setObject:timeStamp forName:SDLRPCParameterNameTimeStamp]; } - (nullable SDLDateTime *)timeStamp { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeStamp ofClass:SDLDateTime.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeStamp ofClass:SDLDateTime.class error:nil]; } - (void)setAddress:(nullable SDLOasisAddress *)address { - [parameters sdl_setObject:address forName:SDLRPCParameterNameAddress]; + [self.parameters sdl_setObject:address forName:SDLRPCParameterNameAddress]; } - (nullable SDLOasisAddress *)address { - return [parameters sdl_objectForName:SDLRPCParameterNameAddress ofClass:SDLOasisAddress.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAddress ofClass:SDLOasisAddress.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSendLocationResponse.m b/SmartDeviceLink/SDLSendLocationResponse.m index c458097f1..a9404897d 100644 --- a/SmartDeviceLink/SDLSendLocationResponse.m +++ b/SmartDeviceLink/SDLSendLocationResponse.m @@ -12,6 +12,8 @@ @implementation SDLSendLocationResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { self = [super initWithName:SDLRPCFunctionNameSendLocation]; if (!self) { @@ -20,6 +22,7 @@ - (instancetype)init { return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSetAppIcon.m b/SmartDeviceLink/SDLSetAppIcon.m index a76abaa58..6d7de66f8 100644 --- a/SmartDeviceLink/SDLSetAppIcon.m +++ b/SmartDeviceLink/SDLSetAppIcon.m @@ -10,11 +10,14 @@ @implementation SDLSetAppIcon +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetAppIcon]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithFileName:(NSString *)fileName { self = [self init]; @@ -28,12 +31,12 @@ - (instancetype)initWithFileName:(NSString *)fileName { } - (void)setSyncFileName:(NSString *)syncFileName { - [parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName]; + [self.parameters sdl_setObject:syncFileName forName:SDLRPCParameterNameSyncFileName]; } - (NSString *)syncFileName { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSyncFileName ofClass:NSString.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLSetAppIconResponse.m b/SmartDeviceLink/SDLSetAppIconResponse.m index 2540415fd..38151c6cc 100644 --- a/SmartDeviceLink/SDLSetAppIconResponse.m +++ b/SmartDeviceLink/SDLSetAppIconResponse.m @@ -12,11 +12,14 @@ @implementation SDLSetAppIconResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetAppIcon]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSetCloudAppProperties.m b/SmartDeviceLink/SDLSetCloudAppProperties.m index bab40d749..ca2f657e9 100644 --- a/SmartDeviceLink/SDLSetCloudAppProperties.m +++ b/SmartDeviceLink/SDLSetCloudAppProperties.m @@ -18,11 +18,14 @@ @implementation SDLSetCloudAppProperties +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetCloudAppProperties]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithProperties:(SDLCloudAppProperties *)properties { self = [self init]; @@ -36,12 +39,12 @@ - (instancetype)initWithProperties:(SDLCloudAppProperties *)properties { } - (void)setProperties:(SDLCloudAppProperties *)properties { - [parameters sdl_setObject:properties forName:SDLRPCParameterNameProperties]; + [self.parameters sdl_setObject:properties forName:SDLRPCParameterNameProperties]; } - (SDLCloudAppProperties *)properties { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameProperties ofClass:SDLCloudAppProperties.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameProperties ofClass:SDLCloudAppProperties.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLSetCloudAppPropertiesResponse.m b/SmartDeviceLink/SDLSetCloudAppPropertiesResponse.m index 94476a335..4064b19a7 100644 --- a/SmartDeviceLink/SDLSetCloudAppPropertiesResponse.m +++ b/SmartDeviceLink/SDLSetCloudAppPropertiesResponse.m @@ -14,11 +14,14 @@ @implementation SDLSetCloudAppPropertiesResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetCloudAppProperties]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSetDisplayLayout.m b/SmartDeviceLink/SDLSetDisplayLayout.m index 90c253717..b26c7a97c 100644 --- a/SmartDeviceLink/SDLSetDisplayLayout.m +++ b/SmartDeviceLink/SDLSetDisplayLayout.m @@ -13,11 +13,14 @@ @implementation SDLSetDisplayLayout +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetDisplayLayout]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithPredefinedLayout:(SDLPredefinedLayout)predefinedLayout { return [self initWithLayout:predefinedLayout]; @@ -45,28 +48,28 @@ - (instancetype)initWithPredefinedLayout:(SDLPredefinedLayout)predefinedLayout d } - (void)setDisplayLayout:(NSString *)displayLayout { - [parameters sdl_setObject:displayLayout forName:SDLRPCParameterNameDisplayLayout]; + [self.parameters sdl_setObject:displayLayout forName:SDLRPCParameterNameDisplayLayout]; } - (NSString *)displayLayout { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameDisplayLayout ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDisplayLayout ofClass:NSString.class error:&error]; } - (void)setDayColorScheme:(nullable SDLTemplateColorScheme *)dayColorScheme { - [parameters sdl_setObject:dayColorScheme forName:SDLRPCParameterNameDayColorScheme]; + [self.parameters sdl_setObject:dayColorScheme forName:SDLRPCParameterNameDayColorScheme]; } - (nullable SDLTemplateColorScheme *)dayColorScheme { - return [parameters sdl_objectForName:SDLRPCParameterNameDayColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDayColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; } - (void)setNightColorScheme:(nullable SDLTemplateColorScheme *)nightColorScheme { - [parameters sdl_setObject:nightColorScheme forName:SDLRPCParameterNameNightColorScheme]; + [self.parameters sdl_setObject:nightColorScheme forName:SDLRPCParameterNameNightColorScheme]; } - (nullable SDLTemplateColorScheme *)nightColorScheme { - return [parameters sdl_objectForName:SDLRPCParameterNameNightColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNightColorScheme ofClass:SDLTemplateColorScheme.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSetDisplayLayoutResponse.m b/SmartDeviceLink/SDLSetDisplayLayoutResponse.m index 21d25661e..552a95079 100644 --- a/SmartDeviceLink/SDLSetDisplayLayoutResponse.m +++ b/SmartDeviceLink/SDLSetDisplayLayoutResponse.m @@ -16,42 +16,45 @@ @implementation SDLSetDisplayLayoutResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetDisplayLayout]) { } return self; } +#pragma clang diagnostic pop - (void)setDisplayCapabilities:(nullable SDLDisplayCapabilities *)displayCapabilities { - [parameters sdl_setObject:displayCapabilities forName:SDLRPCParameterNameDisplayCapabilities]; + [self.parameters sdl_setObject:displayCapabilities forName:SDLRPCParameterNameDisplayCapabilities]; } - (nullable SDLDisplayCapabilities *)displayCapabilities { - return [parameters sdl_objectForName:SDLRPCParameterNameDisplayCapabilities ofClass:SDLDisplayCapabilities.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDisplayCapabilities ofClass:SDLDisplayCapabilities.class error:nil]; } - (void)setButtonCapabilities:(nullable NSArray *)buttonCapabilities { - [parameters sdl_setObject:buttonCapabilities forName:SDLRPCParameterNameButtonCapabilities]; + [self.parameters sdl_setObject:buttonCapabilities forName:SDLRPCParameterNameButtonCapabilities]; } - (nullable NSArray *)buttonCapabilities { - return [parameters sdl_objectsForName:SDLRPCParameterNameButtonCapabilities ofClass:SDLButtonCapabilities.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameButtonCapabilities ofClass:SDLButtonCapabilities.class error:nil]; } - (void)setSoftButtonCapabilities:(nullable NSArray *)softButtonCapabilities { - [parameters sdl_setObject:softButtonCapabilities forName:SDLRPCParameterNameSoftButtonCapabilities]; + [self.parameters sdl_setObject:softButtonCapabilities forName:SDLRPCParameterNameSoftButtonCapabilities]; } - (nullable NSArray *)softButtonCapabilities { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtonCapabilities ofClass:SDLSoftButtonCapabilities.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtonCapabilities ofClass:SDLSoftButtonCapabilities.class error:nil]; } - (void)setPresetBankCapabilities:(nullable SDLPresetBankCapabilities *)presetBankCapabilities { - [parameters sdl_setObject:presetBankCapabilities forName:SDLRPCParameterNamePresetBankCapabilities]; + [self.parameters sdl_setObject:presetBankCapabilities forName:SDLRPCParameterNamePresetBankCapabilities]; } - (nullable SDLPresetBankCapabilities *)presetBankCapabilities { - return [parameters sdl_objectForName:SDLRPCParameterNamePresetBankCapabilities ofClass:SDLPresetBankCapabilities.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePresetBankCapabilities ofClass:SDLPresetBankCapabilities.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSetGlobalProperties.m b/SmartDeviceLink/SDLSetGlobalProperties.m index 970c21e5a..69f06d5d5 100644 --- a/SmartDeviceLink/SDLSetGlobalProperties.m +++ b/SmartDeviceLink/SDLSetGlobalProperties.m @@ -16,11 +16,14 @@ @implementation SDLSetGlobalProperties +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetGlobalProperties]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithHelpText:(nullable NSString *)helpText timeoutText:(nullable NSString *)timeoutText { return [self initWithHelpText:helpText timeoutText:timeoutText vrHelpTitle:nil vrHelp:nil]; @@ -48,59 +51,59 @@ - (instancetype)initWithHelpText:(nullable NSString *)helpText timeoutText:(null } - (void)setHelpPrompt:(nullable NSArray *)helpPrompt { - [parameters sdl_setObject:helpPrompt forName:SDLRPCParameterNameHelpPrompt]; + [self.parameters sdl_setObject:helpPrompt forName:SDLRPCParameterNameHelpPrompt]; } - (nullable NSArray *)helpPrompt { - return [parameters sdl_objectsForName:SDLRPCParameterNameHelpPrompt ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameHelpPrompt ofClass:SDLTTSChunk.class error:nil]; } - (void)setTimeoutPrompt:(nullable NSArray *)timeoutPrompt { - [parameters sdl_setObject:timeoutPrompt forName:SDLRPCParameterNameTimeoutPrompt]; + [self.parameters sdl_setObject:timeoutPrompt forName:SDLRPCParameterNameTimeoutPrompt]; } - (nullable NSArray *)timeoutPrompt { - return [parameters sdl_objectsForName:SDLRPCParameterNameTimeoutPrompt ofClass:SDLTTSChunk.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTimeoutPrompt ofClass:SDLTTSChunk.class error:nil]; } - (void)setVrHelpTitle:(nullable NSString *)vrHelpTitle { - [parameters sdl_setObject:vrHelpTitle forName:SDLRPCParameterNameVRHelpTitle]; + [self.parameters sdl_setObject:vrHelpTitle forName:SDLRPCParameterNameVRHelpTitle]; } - (nullable NSString *)vrHelpTitle { - return [parameters sdl_objectForName:SDLRPCParameterNameVRHelpTitle ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameVRHelpTitle ofClass:NSString.class error:nil]; } - (void)setVrHelp:(nullable NSArray *)vrHelp { - [parameters sdl_setObject:vrHelp forName:SDLRPCParameterNameVRHelp]; + [self.parameters sdl_setObject:vrHelp forName:SDLRPCParameterNameVRHelp]; } - (nullable NSArray *)vrHelp { - return [parameters sdl_objectsForName:SDLRPCParameterNameVRHelp ofClass:SDLVRHelpItem.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameVRHelp ofClass:SDLVRHelpItem.class error:nil]; } - (void)setMenuTitle:(nullable NSString *)menuTitle { - [parameters sdl_setObject:menuTitle forName:SDLRPCParameterNameMenuTitle]; + [self.parameters sdl_setObject:menuTitle forName:SDLRPCParameterNameMenuTitle]; } - (nullable NSString *)menuTitle { - return [parameters sdl_objectForName:SDLRPCParameterNameMenuTitle ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuTitle ofClass:NSString.class error:nil]; } - (void)setMenuIcon:(nullable SDLImage *)menuIcon { - [parameters sdl_setObject:menuIcon forName:SDLRPCParameterNameMenuIcon]; + [self.parameters sdl_setObject:menuIcon forName:SDLRPCParameterNameMenuIcon]; } - (nullable SDLImage *)menuIcon { - return [parameters sdl_objectForName:SDLRPCParameterNameMenuIcon ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMenuIcon ofClass:SDLImage.class error:nil]; } - (void)setKeyboardProperties:(nullable SDLKeyboardProperties *)keyboardProperties { - [parameters sdl_setObject:keyboardProperties forName:SDLRPCParameterNameKeyboardProperties]; + [self.parameters sdl_setObject:keyboardProperties forName:SDLRPCParameterNameKeyboardProperties]; } - (nullable SDLKeyboardProperties *)keyboardProperties { - return [parameters sdl_objectForName:SDLRPCParameterNameKeyboardProperties ofClass:SDLKeyboardProperties.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameKeyboardProperties ofClass:SDLKeyboardProperties.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSetGlobalPropertiesResponse.m b/SmartDeviceLink/SDLSetGlobalPropertiesResponse.m index 208c336f1..f093f4399 100644 --- a/SmartDeviceLink/SDLSetGlobalPropertiesResponse.m +++ b/SmartDeviceLink/SDLSetGlobalPropertiesResponse.m @@ -12,11 +12,14 @@ @implementation SDLSetGlobalPropertiesResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetGlobalProperties]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSetInteriorVehicleData.m b/SmartDeviceLink/SDLSetInteriorVehicleData.m index f49091768..96d2ac782 100644 --- a/SmartDeviceLink/SDLSetInteriorVehicleData.m +++ b/SmartDeviceLink/SDLSetInteriorVehicleData.m @@ -12,11 +12,14 @@ @implementation SDLSetInteriorVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetInteriorVehicleData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithModuleData:(SDLModuleData *)moduleData { self = [self init]; @@ -30,12 +33,12 @@ - (instancetype)initWithModuleData:(SDLModuleData *)moduleData { } - (void)setModuleData:(SDLModuleData *)moduleData { - [parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; + [self.parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; } - (SDLModuleData *)moduleData { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLSetInteriorVehicleDataResponse.m b/SmartDeviceLink/SDLSetInteriorVehicleDataResponse.m index 93a628366..12a00779b 100644 --- a/SmartDeviceLink/SDLSetInteriorVehicleDataResponse.m +++ b/SmartDeviceLink/SDLSetInteriorVehicleDataResponse.m @@ -12,19 +12,22 @@ @implementation SDLSetInteriorVehicleDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetInteriorVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setModuleData:(SDLModuleData *)moduleData { - [parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; + [self.parameters sdl_setObject:moduleData forName:SDLRPCParameterNameModuleData]; } - (SDLModuleData *)moduleData { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameModuleData ofClass:SDLModuleData.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLSetMediaClockTimer.m b/SmartDeviceLink/SDLSetMediaClockTimer.m index 5b1dbfaed..ce536ce8f 100644 --- a/SmartDeviceLink/SDLSetMediaClockTimer.m +++ b/SmartDeviceLink/SDLSetMediaClockTimer.m @@ -13,11 +13,14 @@ @implementation SDLSetMediaClockTimer +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetMediaClockTimer]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode startTime:(nullable SDLStartTime *)startTime endTime:(nullable SDLStartTime *)endTime playPauseIndicator:(nullable SDLAudioStreamingIndicator)playPauseIndicator { self = [self init]; @@ -110,36 +113,36 @@ - (instancetype)initWithUpdateMode:(SDLUpdateMode)updateMode { } - (void)setStartTime:(nullable SDLStartTime *)startTime { - [parameters sdl_setObject:startTime forName:SDLRPCParameterNameStartTime]; + [self.parameters sdl_setObject:startTime forName:SDLRPCParameterNameStartTime]; } - (nullable SDLStartTime *)startTime { - return [parameters sdl_objectForName:SDLRPCParameterNameStartTime ofClass:SDLStartTime.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameStartTime ofClass:SDLStartTime.class error:nil]; } - (void)setEndTime:(nullable SDLStartTime *)endTime { - [parameters sdl_setObject:endTime forName:SDLRPCParameterNameEndTime]; + [self.parameters sdl_setObject:endTime forName:SDLRPCParameterNameEndTime]; } - (nullable SDLStartTime *)endTime { - return [parameters sdl_objectForName:SDLRPCParameterNameEndTime ofClass:SDLStartTime.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEndTime ofClass:SDLStartTime.class error:nil]; } - (void)setUpdateMode:(SDLUpdateMode)updateMode { - [parameters sdl_setObject:updateMode forName:SDLRPCParameterNameUpdateMode]; + [self.parameters sdl_setObject:updateMode forName:SDLRPCParameterNameUpdateMode]; } - (SDLUpdateMode)updateMode { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameUpdateMode error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameUpdateMode error:&error]; } - (void)setAudioStreamingIndicator:(nullable SDLAudioStreamingIndicator)audioStreamingIndicator { - [parameters sdl_setObject:audioStreamingIndicator forName:SDLRPCParameterNameAudioStreamingIndicator]; + [self.parameters sdl_setObject:audioStreamingIndicator forName:SDLRPCParameterNameAudioStreamingIndicator]; } - (nullable SDLAudioStreamingIndicator)audioStreamingIndicator { - return [parameters sdl_enumForName:SDLRPCParameterNameAudioStreamingIndicator error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameAudioStreamingIndicator error:nil]; } @end diff --git a/SmartDeviceLink/SDLSetMediaClockTimerResponse.m b/SmartDeviceLink/SDLSetMediaClockTimerResponse.m index 856a1a49d..bcb1d12c8 100644 --- a/SmartDeviceLink/SDLSetMediaClockTimerResponse.m +++ b/SmartDeviceLink/SDLSetMediaClockTimerResponse.m @@ -12,11 +12,14 @@ @implementation SDLSetMediaClockTimerResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSetMediaClockTimer]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLShow.m b/SmartDeviceLink/SDLShow.m index b4e0b0abd..cb67f1b69 100644 --- a/SmartDeviceLink/SDLShow.m +++ b/SmartDeviceLink/SDLShow.m @@ -16,11 +16,14 @@ @implementation SDLShow +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameShow]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(nullable NSString *)mainField2 alignment:(nullable SDLTextAlignment)alignment { return [self initWithMainField1:mainField1 mainField2:mainField2 mainField3:nil mainField4:nil alignment:alignment]; @@ -98,107 +101,107 @@ - (instancetype)initWithMainField1:(nullable NSString *)mainField1 mainField2:(n } - (void)setMainField1:(nullable NSString *)mainField1 { - [parameters sdl_setObject:mainField1 forName:SDLRPCParameterNameMainField1]; + [self.parameters sdl_setObject:mainField1 forName:SDLRPCParameterNameMainField1]; } - (nullable NSString *)mainField1 { - return [parameters sdl_objectForName:SDLRPCParameterNameMainField1 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMainField1 ofClass:NSString.class error:nil]; } - (void)setMainField2:(nullable NSString *)mainField2 { - [parameters sdl_setObject:mainField2 forName:SDLRPCParameterNameMainField2]; + [self.parameters sdl_setObject:mainField2 forName:SDLRPCParameterNameMainField2]; } - (nullable NSString *)mainField2 { - return [parameters sdl_objectForName:SDLRPCParameterNameMainField2 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMainField2 ofClass:NSString.class error:nil]; } - (void)setMainField3:(nullable NSString *)mainField3 { - [parameters sdl_setObject:mainField3 forName:SDLRPCParameterNameMainField3]; + [self.parameters sdl_setObject:mainField3 forName:SDLRPCParameterNameMainField3]; } - (nullable NSString *)mainField3 { - return [parameters sdl_objectForName:SDLRPCParameterNameMainField3 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMainField3 ofClass:NSString.class error:nil]; } - (void)setMainField4:(nullable NSString *)mainField4 { - [parameters sdl_setObject:mainField4 forName:SDLRPCParameterNameMainField4]; + [self.parameters sdl_setObject:mainField4 forName:SDLRPCParameterNameMainField4]; } - (nullable NSString *)mainField4 { - return [parameters sdl_objectForName:SDLRPCParameterNameMainField4 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMainField4 ofClass:NSString.class error:nil]; } - (void)setAlignment:(nullable SDLTextAlignment)alignment { - [parameters sdl_setObject:alignment forName:SDLRPCParameterNameAlignment]; + [self.parameters sdl_setObject:alignment forName:SDLRPCParameterNameAlignment]; } - (nullable SDLTextAlignment)alignment { - return [parameters sdl_enumForName:SDLRPCParameterNameAlignment error:nil]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameAlignment error:nil]; } - (void)setStatusBar:(nullable NSString *)statusBar { - [parameters sdl_setObject:statusBar forName:SDLRPCParameterNameStatusBar]; + [self.parameters sdl_setObject:statusBar forName:SDLRPCParameterNameStatusBar]; } - (nullable NSString *)statusBar { - return [parameters sdl_objectForName:SDLRPCParameterNameStatusBar ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameStatusBar ofClass:NSString.class error:nil]; } - (void)setMediaClock:(nullable NSString *)mediaClock { - [parameters sdl_setObject:mediaClock forName:SDLRPCParameterNameMediaClock]; + [self.parameters sdl_setObject:mediaClock forName:SDLRPCParameterNameMediaClock]; } - (nullable NSString *)mediaClock { - return [parameters sdl_objectForName:SDLRPCParameterNameMediaClock ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMediaClock ofClass:NSString.class error:nil]; } - (void)setMediaTrack:(nullable NSString *)mediaTrack { - [parameters sdl_setObject:mediaTrack forName:SDLRPCParameterNameMediaTrack]; + [self.parameters sdl_setObject:mediaTrack forName:SDLRPCParameterNameMediaTrack]; } - (nullable NSString *)mediaTrack { - return [parameters sdl_objectForName:SDLRPCParameterNameMediaTrack ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMediaTrack ofClass:NSString.class error:nil]; } - (void)setGraphic:(nullable SDLImage *)graphic { - [parameters sdl_setObject:graphic forName:SDLRPCParameterNameGraphic]; + [self.parameters sdl_setObject:graphic forName:SDLRPCParameterNameGraphic]; } - (nullable SDLImage *)graphic { - return [parameters sdl_objectForName:SDLRPCParameterNameGraphic ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGraphic ofClass:SDLImage.class error:nil]; } - (void)setSecondaryGraphic:(nullable SDLImage *)secondaryGraphic { - [parameters sdl_setObject:secondaryGraphic forName:SDLRPCParameterNameSecondaryGraphic]; + [self.parameters sdl_setObject:secondaryGraphic forName:SDLRPCParameterNameSecondaryGraphic]; } - (nullable SDLImage *)secondaryGraphic { - return [parameters sdl_objectForName:SDLRPCParameterNameSecondaryGraphic ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSecondaryGraphic ofClass:SDLImage.class error:nil]; } - (void)setSoftButtons:(nullable NSArray *)softButtons { - [parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; + [self.parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; } - (nullable NSArray *)softButtons { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; } - (void)setCustomPresets:(nullable NSArray *)customPresets { - [parameters sdl_setObject:customPresets forName:SDLRPCParameterNameCustomPresets]; + [self.parameters sdl_setObject:customPresets forName:SDLRPCParameterNameCustomPresets]; } - (nullable NSArray *)customPresets { - return [parameters sdl_objectsForName:SDLRPCParameterNameCustomPresets ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameCustomPresets ofClass:NSString.class error:nil]; } - (void)setMetadataTags:(nullable SDLMetadataTags *)metadataTags { - [parameters sdl_setObject:metadataTags forName:SDLRPCParameterNameMetadataTags]; + [self.parameters sdl_setObject:metadataTags forName:SDLRPCParameterNameMetadataTags]; } - (nullable SDLMetadataTags *)metadataTags { - return [parameters sdl_objectForName:SDLRPCParameterNameMetadataTags ofClass:SDLMetadataTags.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMetadataTags ofClass:SDLMetadataTags.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLShowConstantTBT.m b/SmartDeviceLink/SDLShowConstantTBT.m index d1068d963..70c2c09a1 100644 --- a/SmartDeviceLink/SDLShowConstantTBT.m +++ b/SmartDeviceLink/SDLShowConstantTBT.m @@ -14,11 +14,14 @@ @implementation SDLShowConstantTBT +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameShowConstantTBT]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithNavigationText1:(nullable NSString *)navigationText1 navigationText2:(nullable NSString *)navigationText2 eta:(nullable NSString *)eta timeToDestination:(nullable NSString *)timeToDestination totalDistance:(nullable NSString *)totalDistance turnIcon:(nullable SDLImage *)turnIcon nextTurnIcon:(nullable SDLImage *)nextTurnIcon distanceToManeuver:(double)distanceToManeuver distanceToManeuverScale:(double)distanceToManeuverScale maneuverComplete:(BOOL)maneuverComplete softButtons:(nullable NSArray *)softButtons { self = [self init]; @@ -42,91 +45,91 @@ - (instancetype)initWithNavigationText1:(nullable NSString *)navigationText1 nav } - (void)setNavigationText1:(nullable NSString *)navigationText1 { - [parameters sdl_setObject:navigationText1 forName:SDLRPCParameterNameNavigationText1]; + [self.parameters sdl_setObject:navigationText1 forName:SDLRPCParameterNameNavigationText1]; } - (nullable NSString *)navigationText1 { - return [parameters sdl_objectForName:SDLRPCParameterNameNavigationText1 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNavigationText1 ofClass:NSString.class error:nil]; } - (void)setNavigationText2:(nullable NSString *)navigationText2 { - [parameters sdl_setObject:navigationText2 forName:SDLRPCParameterNameNavigationText2]; + [self.parameters sdl_setObject:navigationText2 forName:SDLRPCParameterNameNavigationText2]; } - (nullable NSString *)navigationText2 { - return [parameters sdl_objectForName:SDLRPCParameterNameNavigationText2 ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNavigationText2 ofClass:NSString.class error:nil]; } - (void)setEta:(nullable NSString *)eta { - [parameters sdl_setObject:eta forName:SDLRPCParameterNameETA]; + [self.parameters sdl_setObject:eta forName:SDLRPCParameterNameETA]; } - (nullable NSString *)eta { - return [parameters sdl_objectForName:SDLRPCParameterNameETA ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameETA ofClass:NSString.class error:nil]; } - (void)setTimeToDestination:(nullable NSString *)timeToDestination { - [parameters sdl_setObject:timeToDestination forName:SDLRPCParameterNameTimeToDestination]; + [self.parameters sdl_setObject:timeToDestination forName:SDLRPCParameterNameTimeToDestination]; } - (nullable NSString *)timeToDestination { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeToDestination ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeToDestination ofClass:NSString.class error:nil]; } - (void)setTotalDistance:(nullable NSString *)totalDistance { - [parameters sdl_setObject:totalDistance forName:SDLRPCParameterNameTotalDistance]; + [self.parameters sdl_setObject:totalDistance forName:SDLRPCParameterNameTotalDistance]; } - (nullable NSString *)totalDistance { - return [parameters sdl_objectForName:SDLRPCParameterNameTotalDistance ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTotalDistance ofClass:NSString.class error:nil]; } - (void)setTurnIcon:(nullable SDLImage *)turnIcon { - [parameters sdl_setObject:turnIcon forName:SDLRPCParameterNameTurnIcon]; + [self.parameters sdl_setObject:turnIcon forName:SDLRPCParameterNameTurnIcon]; } - (nullable SDLImage *)turnIcon { - return [parameters sdl_objectForName:SDLRPCParameterNameTurnIcon ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTurnIcon ofClass:SDLImage.class error:nil]; } - (void)setNextTurnIcon:(nullable SDLImage *)nextTurnIcon { - [parameters sdl_setObject:nextTurnIcon forName:SDLRPCParameterNameNextTurnIcon]; + [self.parameters sdl_setObject:nextTurnIcon forName:SDLRPCParameterNameNextTurnIcon]; } - (nullable SDLImage *)nextTurnIcon { - return [parameters sdl_objectForName:SDLRPCParameterNameNextTurnIcon ofClass:SDLImage.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNextTurnIcon ofClass:SDLImage.class error:nil]; } - (void)setDistanceToManeuver:(nullable NSNumber *)distanceToManeuver { - [parameters sdl_setObject:distanceToManeuver forName:SDLRPCParameterNameDistanceToManeuver]; + [self.parameters sdl_setObject:distanceToManeuver forName:SDLRPCParameterNameDistanceToManeuver]; } - (nullable NSNumber *)distanceToManeuver { - return [parameters sdl_objectForName:SDLRPCParameterNameDistanceToManeuver ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDistanceToManeuver ofClass:NSNumber.class error:nil]; } - (void)setDistanceToManeuverScale:(nullable NSNumber *)distanceToManeuverScale { - [parameters sdl_setObject:distanceToManeuverScale forName:SDLRPCParameterNameDistanceToManeuverScale]; + [self.parameters sdl_setObject:distanceToManeuverScale forName:SDLRPCParameterNameDistanceToManeuverScale]; } - (nullable NSNumber *)distanceToManeuverScale { - return [parameters sdl_objectForName:SDLRPCParameterNameDistanceToManeuverScale ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDistanceToManeuverScale ofClass:NSNumber.class error:nil]; } - (void)setManeuverComplete:(nullable NSNumber *)maneuverComplete { - [parameters sdl_setObject:maneuverComplete forName:SDLRPCParameterNameManeuverComplete]; + [self.parameters sdl_setObject:maneuverComplete forName:SDLRPCParameterNameManeuverComplete]; } - (nullable NSNumber *)maneuverComplete { - return [parameters sdl_objectForName:SDLRPCParameterNameManeuverComplete ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameManeuverComplete ofClass:NSNumber.class error:nil]; } - (void)setSoftButtons:(nullable NSArray *)softButtons { - [parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; + [self.parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; } - (nullable NSArray *)softButtons { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLShowConstantTBTResponse.m b/SmartDeviceLink/SDLShowConstantTBTResponse.m index be8bc9363..911e5080f 100644 --- a/SmartDeviceLink/SDLShowConstantTBTResponse.m +++ b/SmartDeviceLink/SDLShowConstantTBTResponse.m @@ -12,11 +12,14 @@ @implementation SDLShowConstantTBTResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameShowConstantTBT]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLShowResponse.m b/SmartDeviceLink/SDLShowResponse.m index 3f8882729..c8b501129 100644 --- a/SmartDeviceLink/SDLShowResponse.m +++ b/SmartDeviceLink/SDLShowResponse.m @@ -12,11 +12,14 @@ @implementation SDLShowResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameShow]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSingleTireStatus.m b/SmartDeviceLink/SDLSingleTireStatus.m index 283e32f51..e756e8f69 100644 --- a/SmartDeviceLink/SDLSingleTireStatus.m +++ b/SmartDeviceLink/SDLSingleTireStatus.m @@ -12,28 +12,28 @@ @implementation SDLSingleTireStatus - (void)setStatus:(SDLComponentVolumeStatus)status { - [store sdl_setObject:status forName:SDLRPCParameterNameStatus]; + [self.store sdl_setObject:status forName:SDLRPCParameterNameStatus]; } - (SDLComponentVolumeStatus)status { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameStatus error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameStatus error:&error]; } - (void)setMonitoringSystemStatus:(nullable SDLTPMS)monitoringSystemStatus { - [store sdl_setObject:monitoringSystemStatus forName:SDLRPCParameterNameTPMS]; + [self.store sdl_setObject:monitoringSystemStatus forName:SDLRPCParameterNameTPMS]; } - (nullable SDLTPMS)monitoringSystemStatus { - return [store sdl_enumForName:SDLRPCParameterNameTPMS error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameTPMS error:nil]; } - (void)setPressure:(nullable NSNumber *)pressure { - [store sdl_setObject:pressure forName:SDLRPCParameterNamePressure]; + [self.store sdl_setObject:pressure forName:SDLRPCParameterNamePressure]; } - (nullable NSNumber *)pressure { - return [store sdl_objectForName:SDLRPCParameterNamePressure ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePressure ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSlider.m b/SmartDeviceLink/SDLSlider.m index 25f83ce89..f0072c171 100644 --- a/SmartDeviceLink/SDLSlider.m +++ b/SmartDeviceLink/SDLSlider.m @@ -12,11 +12,14 @@ @implementation SDLSlider +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSlider]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position sliderHeader:(NSString *)sliderHeader sliderFooter:(nullable NSString *)sliderFooter timeout:(UInt16)timeout { NSArray *footer = nil; @@ -53,46 +56,46 @@ - (instancetype)initWithNumTicks:(UInt8)numTicks position:(UInt8)position { } - (void)setNumTicks:(NSNumber *)numTicks { - [parameters sdl_setObject:numTicks forName:SDLRPCParameterNameNumberTicks]; + [self.parameters sdl_setObject:numTicks forName:SDLRPCParameterNameNumberTicks]; } - (NSNumber *)numTicks { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameNumberTicks ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameNumberTicks ofClass:NSNumber.class error:&error]; } - (void)setPosition:(NSNumber *)position { - [parameters sdl_setObject:position forName:SDLRPCParameterNamePosition]; + [self.parameters sdl_setObject:position forName:SDLRPCParameterNamePosition]; } - (NSNumber *)position { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:&error]; } - (void)setSliderHeader:(NSString *)sliderHeader { - [parameters sdl_setObject:sliderHeader forName:SDLRPCParameterNameSliderHeader]; + [self.parameters sdl_setObject:sliderHeader forName:SDLRPCParameterNameSliderHeader]; } - (NSString *)sliderHeader { NSError *error = nil; - return [parameters sdl_objectForName:SDLRPCParameterNameSliderHeader ofClass:NSString.class error:&error]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSliderHeader ofClass:NSString.class error:&error]; } - (void)setSliderFooter:(nullable NSArray *)sliderFooter { - [parameters sdl_setObject:sliderFooter forName:SDLRPCParameterNameSliderFooter]; + [self.parameters sdl_setObject:sliderFooter forName:SDLRPCParameterNameSliderFooter]; } - (nullable NSArray *)sliderFooter { - return [parameters sdl_objectsForName:SDLRPCParameterNameSliderFooter ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSliderFooter ofClass:NSString.class error:nil]; } - (void)setTimeout:(nullable NSNumber *)timeout { - [parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; + [self.parameters sdl_setObject:timeout forName:SDLRPCParameterNameTimeout]; } - (nullable NSNumber *)timeout { - return [parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTimeout ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSliderResponse.m b/SmartDeviceLink/SDLSliderResponse.m index fc8e1cbb6..6d9985111 100644 --- a/SmartDeviceLink/SDLSliderResponse.m +++ b/SmartDeviceLink/SDLSliderResponse.m @@ -12,18 +12,21 @@ @implementation SDLSliderResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSlider]) { } return self; } +#pragma clang diagnostic pop - (void)setSliderPosition:(nullable NSNumber *)sliderPosition { - [parameters sdl_setObject:sliderPosition forName:SDLRPCParameterNameSliderPosition]; + [self.parameters sdl_setObject:sliderPosition forName:SDLRPCParameterNameSliderPosition]; } - (nullable NSNumber *)sliderPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameSliderPosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSliderPosition ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSoftButton.m b/SmartDeviceLink/SDLSoftButton.m index a2b526c23..6d1082c48 100644 --- a/SmartDeviceLink/SDLSoftButton.m +++ b/SmartDeviceLink/SDLSoftButton.m @@ -40,53 +40,53 @@ - (instancetype)initWithType:(SDLSoftButtonType)type text:(nullable NSString *)t } - (void)setType:(SDLSoftButtonType)type { - [store sdl_setObject:type forName:SDLRPCParameterNameType]; + [self.store sdl_setObject:type forName:SDLRPCParameterNameType]; } - (SDLSoftButtonType)type { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameType error:&error]; } - (void)setText:(nullable NSString *)text { - [store sdl_setObject:text forName:SDLRPCParameterNameText]; + [self.store sdl_setObject:text forName:SDLRPCParameterNameText]; } - (nullable NSString *)text { - return [store sdl_objectForName:SDLRPCParameterNameText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameText ofClass:NSString.class error:nil]; } - (void)setImage:(nullable SDLImage *)image { - [store sdl_setObject:image forName:SDLRPCParameterNameImage]; + [self.store sdl_setObject:image forName:SDLRPCParameterNameImage]; } - (nullable SDLImage *)image { - return [store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; } - (void)setIsHighlighted:(nullable NSNumber *)isHighlighted { - [store sdl_setObject:isHighlighted forName:SDLRPCParameterNameIsHighlighted]; + [self.store sdl_setObject:isHighlighted forName:SDLRPCParameterNameIsHighlighted]; } - (nullable NSNumber *)isHighlighted { - return [store sdl_objectForName:SDLRPCParameterNameIsHighlighted ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameIsHighlighted ofClass:NSNumber.class error:nil]; } - (void)setSoftButtonID:(NSNumber *)softButtonID { - [store sdl_setObject:softButtonID forName:SDLRPCParameterNameSoftButtonId]; + [self.store sdl_setObject:softButtonID forName:SDLRPCParameterNameSoftButtonId]; } - (NSNumber *)softButtonID { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameSoftButtonId ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameSoftButtonId ofClass:NSNumber.class error:&error]; } - (void)setSystemAction:(nullable SDLSystemAction)systemAction { - [store sdl_setObject:systemAction forName:SDLRPCParameterNameSystemAction]; + [self.store sdl_setObject:systemAction forName:SDLRPCParameterNameSystemAction]; } - (nullable SDLSystemAction)systemAction { - return [store sdl_enumForName:SDLRPCParameterNameSystemAction error:nil]; + return [self.store sdl_enumForName:SDLRPCParameterNameSystemAction error:nil]; } -(id)copyWithZone:(nullable NSZone *)zone { diff --git a/SmartDeviceLink/SDLSoftButtonCapabilities.m b/SmartDeviceLink/SDLSoftButtonCapabilities.m index d85c9bd69..cb9c903d3 100644 --- a/SmartDeviceLink/SDLSoftButtonCapabilities.m +++ b/SmartDeviceLink/SDLSoftButtonCapabilities.m @@ -12,39 +12,39 @@ @implementation SDLSoftButtonCapabilities - (void)setShortPressAvailable:(NSNumber *)shortPressAvailable { - [store sdl_setObject:shortPressAvailable forName:SDLRPCParameterNameShortPressAvailable]; + [self.store sdl_setObject:shortPressAvailable forName:SDLRPCParameterNameShortPressAvailable]; } - (NSNumber *)shortPressAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameShortPressAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameShortPressAvailable ofClass:NSNumber.class error:&error]; } - (void)setLongPressAvailable:(NSNumber *)longPressAvailable { - [store sdl_setObject:longPressAvailable forName:SDLRPCParameterNameLongPressAvailable]; + [self.store sdl_setObject:longPressAvailable forName:SDLRPCParameterNameLongPressAvailable]; } - (NSNumber *)longPressAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLongPressAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLongPressAvailable ofClass:NSNumber.class error:&error]; } - (void)setUpDownAvailable:(NSNumber *)upDownAvailable { - [store sdl_setObject:upDownAvailable forName:SDLRPCParameterNameUpDownAvailable]; + [self.store sdl_setObject:upDownAvailable forName:SDLRPCParameterNameUpDownAvailable]; } - (NSNumber *)upDownAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameUpDownAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameUpDownAvailable ofClass:NSNumber.class error:&error]; } - (void)setImageSupported:(NSNumber *)imageSupported { - [store sdl_setObject:imageSupported forName:SDLRPCParameterNameImageSupported]; + [self.store sdl_setObject:imageSupported forName:SDLRPCParameterNameImageSupported]; } - (NSNumber *)imageSupported { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameImageSupported ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameImageSupported ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLSpeak.m b/SmartDeviceLink/SDLSpeak.m index a0ce720e6..4a8b18244 100644 --- a/SmartDeviceLink/SDLSpeak.m +++ b/SmartDeviceLink/SDLSpeak.m @@ -13,11 +13,14 @@ @implementation SDLSpeak +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSpeak]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithTTS:(NSString *)ttsText { NSArray *ttsChunks = [SDLTTSChunk textChunksFromString:ttsText]; @@ -36,12 +39,12 @@ - (instancetype)initWithTTSChunks:(NSArray *)ttsChunks { } - (void)setTtsChunks:(NSArray *)ttsChunks { - [parameters sdl_setObject:ttsChunks forName:SDLRPCParameterNameTTSChunks]; + [self.parameters sdl_setObject:ttsChunks forName:SDLRPCParameterNameTTSChunks]; } - (NSArray *)ttsChunks { NSError *error = nil; - return [parameters sdl_objectsForName:SDLRPCParameterNameTTSChunks ofClass:SDLTTSChunk.class error:&error]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTTSChunks ofClass:SDLTTSChunk.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLSpeakResponse.m b/SmartDeviceLink/SDLSpeakResponse.m index 95b157682..e3cd91ae4 100644 --- a/SmartDeviceLink/SDLSpeakResponse.m +++ b/SmartDeviceLink/SDLSpeakResponse.m @@ -12,11 +12,14 @@ @implementation SDLSpeakResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSpeak]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLStartTime.m b/SmartDeviceLink/SDLStartTime.m index 5420246ae..4fa55b9df 100644 --- a/SmartDeviceLink/SDLStartTime.m +++ b/SmartDeviceLink/SDLStartTime.m @@ -38,30 +38,30 @@ - (instancetype)initWithHours:(UInt8)hours minutes:(UInt8)minutes seconds:(UInt8 } - (void)setHours:(NSNumber *)hours { - [store sdl_setObject:hours forName:SDLRPCParameterNameHours]; + [self.store sdl_setObject:hours forName:SDLRPCParameterNameHours]; } - (NSNumber *)hours { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameHours ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameHours ofClass:NSNumber.class error:&error]; } - (void)setMinutes:(NSNumber *)minutes { - [store sdl_setObject:minutes forName:SDLRPCParameterNameMinutes]; + [self.store sdl_setObject:minutes forName:SDLRPCParameterNameMinutes]; } - (NSNumber *)minutes { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMinutes ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMinutes ofClass:NSNumber.class error:&error]; } - (void)setSeconds:(NSNumber *)seconds { - [store sdl_setObject:seconds forName:SDLRPCParameterNameSeconds]; + [self.store sdl_setObject:seconds forName:SDLRPCParameterNameSeconds]; } - (NSNumber *)seconds { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameSeconds ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameSeconds ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLStationIDNumber.m b/SmartDeviceLink/SDLStationIDNumber.m index 623cb0b09..a88afe79a 100644 --- a/SmartDeviceLink/SDLStationIDNumber.m +++ b/SmartDeviceLink/SDLStationIDNumber.m @@ -22,20 +22,20 @@ - (instancetype)initWithCountryCode:(nullable NSNumber *)countryCode fcc } - (void)setCountryCode:(nullable NSNumber *)countryCode { - [store sdl_setObject:countryCode forName:SDLRPCParameterNameCountryCode]; + [self.store sdl_setObject:countryCode forName:SDLRPCParameterNameCountryCode]; } - (nullable NSNumber *)countryCode { - return [store sdl_objectForName:SDLRPCParameterNameCountryCode ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCountryCode ofClass:NSNumber.class error:nil]; } - (void)setFccFacilityId:(nullable NSNumber *)fccFacilityId { - [store sdl_setObject:fccFacilityId forName:SDLRPCParameterNameFCCFacilityId]; + [self.store sdl_setObject:fccFacilityId forName:SDLRPCParameterNameFCCFacilityId]; } - (nullable NSNumber *)fccFacilityId { - return [store sdl_objectForName:SDLRPCParameterNameFCCFacilityId ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameFCCFacilityId ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSubscribeButton.m b/SmartDeviceLink/SDLSubscribeButton.m index f3fc0a8ab..b8f25b5c8 100644 --- a/SmartDeviceLink/SDLSubscribeButton.m +++ b/SmartDeviceLink/SDLSubscribeButton.m @@ -12,11 +12,14 @@ @implementation SDLSubscribeButton +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSubscribeButton]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithHandler:(nullable SDLRPCButtonNotificationHandler)handler { self = [self init]; @@ -42,12 +45,12 @@ - (instancetype)initWithButtonName:(SDLButtonName)buttonName handler:(nullable S } - (void)setButtonName:(SDLButtonName)buttonName { - [parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; + [self.parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; } - (SDLButtonName)buttonName { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; } -(id)copyWithZone:(nullable NSZone *)zone { diff --git a/SmartDeviceLink/SDLSubscribeButtonResponse.m b/SmartDeviceLink/SDLSubscribeButtonResponse.m index f8d0a4310..b9e8db4b8 100644 --- a/SmartDeviceLink/SDLSubscribeButtonResponse.m +++ b/SmartDeviceLink/SDLSubscribeButtonResponse.m @@ -12,11 +12,14 @@ @implementation SDLSubscribeButtonResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSubscribeButton]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSubscribeVehicleData.m b/SmartDeviceLink/SDLSubscribeVehicleData.m index 8774f98f4..cf2b650ae 100644 --- a/SmartDeviceLink/SDLSubscribeVehicleData.m +++ b/SmartDeviceLink/SDLSubscribeVehicleData.m @@ -12,11 +12,14 @@ @implementation SDLSubscribeVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSubscribeVehicleData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus { return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo electronicParkBrakeStatus:NO emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure turnSignal:NO wiperStatus:wiperStatus]; @@ -66,235 +69,235 @@ - (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPositio } - (void)setGps:(nullable NSNumber *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable NSNumber *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:NSNumber.class error:nil]; } - (void)setSpeed:(nullable NSNumber *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable NSNumber *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; } - (void)setRpm:(nullable NSNumber *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable NSNumber *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel:(nullable NSNumber *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable NSNumber *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel_State:(nullable NSNumber *)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable NSNumber *)fuelLevel_State { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:NSNumber.class error:nil]; } - (void)setFuelRange:(nullable NSNumber *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable NSNumber *)fuelRange { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:NSNumber.class error:nil]; } - (void)setInstantFuelConsumption:(nullable NSNumber *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (nullable NSNumber *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; } - (void)setExternalTemperature:(nullable NSNumber *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable NSNumber *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; } - (void)setPrndl:(nullable NSNumber *)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable NSNumber *)prndl { - return [parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:NSNumber.class error:nil]; } - (void)setTirePressure:(nullable NSNumber *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable NSNumber *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:NSNumber.class error:nil]; } - (void)setOdometer:(nullable NSNumber *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable NSNumber *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; } - (void)setBeltStatus:(nullable NSNumber *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable NSNumber *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:NSNumber.class error:nil]; } - (void)setBodyInformation:(nullable NSNumber *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable NSNumber *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:NSNumber.class error:nil]; } - (void)setDeviceStatus:(nullable NSNumber *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable NSNumber *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:NSNumber.class error:nil]; } - (void)setDriverBraking:(nullable NSNumber *)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable NSNumber *)driverBraking { - return [parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:NSNumber.class error:nil]; } - (void)setWiperStatus:(nullable NSNumber *)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable NSNumber *)wiperStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:NSNumber.class error:nil]; } - (void)setHeadLampStatus:(nullable NSNumber *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable NSNumber *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:NSNumber.class error:nil]; } - (void)setEngineOilLife:(nullable NSNumber *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable NSNumber *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; } - (void)setEngineTorque:(nullable NSNumber *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable NSNumber *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; } - (void)setAccPedalPosition:(nullable NSNumber *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable NSNumber *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; } - (void)setSteeringWheelAngle:(nullable NSNumber *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable NSNumber *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; } - (void)setECallInfo:(nullable NSNumber *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable NSNumber *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:NSNumber.class error:nil]; } - (void)setAirbagStatus:(nullable NSNumber *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable NSNumber *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:NSNumber.class error:nil]; } - (void)setEmergencyEvent:(nullable NSNumber *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable NSNumber *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:NSNumber.class error:nil]; } - (void)setClusterModeStatus:(nullable NSNumber *)clusterModeStatus { - [parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; + [self.parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; } - (nullable NSNumber *)clusterModeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:NSNumber.class error:nil]; } - (void)setMyKey:(nullable NSNumber *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable NSNumber *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:NSNumber.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable NSNumber *)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable NSNumber *)electronicParkBrakeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:NSNumber.class error:nil]; } - (void)setTurnSignal:(nullable NSNumber *)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable NSNumber *)turnSignal { - return [parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:NSNumber.class error:nil]; } - (void)setCloudAppVehicleID:(nullable NSNumber *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable NSNumber *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m index f7b47b02a..648d5356e 100644 --- a/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m +++ b/SmartDeviceLink/SDLSubscribeVehicleDataResponse.m @@ -13,242 +13,245 @@ @implementation SDLSubscribeVehicleDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSubscribeVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setGps:(nullable SDLVehicleDataResult *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable SDLVehicleDataResult *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setSpeed:(nullable SDLVehicleDataResult *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable SDLVehicleDataResult *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setRpm:(nullable SDLVehicleDataResult *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable SDLVehicleDataResult *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setFuelLevel:(nullable SDLVehicleDataResult *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable SDLVehicleDataResult *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setFuelLevel_State:(nullable SDLVehicleDataResult *)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable SDLVehicleDataResult *)fuelLevel_State { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setFuelRange:(nullable SDLVehicleDataResult *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable SDLVehicleDataResult *)fuelRange { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setInstantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (nullable SDLVehicleDataResult *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setExternalTemperature:(nullable SDLVehicleDataResult *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable SDLVehicleDataResult *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setPrndl:(nullable SDLVehicleDataResult *)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable SDLVehicleDataResult *)prndl { - return [parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setTirePressure:(nullable SDLVehicleDataResult *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable SDLVehicleDataResult *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setOdometer:(nullable SDLVehicleDataResult *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable SDLVehicleDataResult *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setBeltStatus:(nullable SDLVehicleDataResult *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable SDLVehicleDataResult *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setBodyInformation:(nullable SDLVehicleDataResult *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable SDLVehicleDataResult *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setDeviceStatus:(nullable SDLVehicleDataResult *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable SDLVehicleDataResult *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setDriverBraking:(nullable SDLVehicleDataResult *)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable SDLVehicleDataResult *)driverBraking { - return [parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setWiperStatus:(nullable SDLVehicleDataResult *)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable SDLVehicleDataResult *)wiperStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setHeadLampStatus:(nullable SDLVehicleDataResult *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable SDLVehicleDataResult *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setEngineOilLife:(nullable SDLVehicleDataResult *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable SDLVehicleDataResult *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setEngineTorque:(nullable SDLVehicleDataResult *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable SDLVehicleDataResult *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setAccPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable SDLVehicleDataResult *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setSteeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable SDLVehicleDataResult *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setECallInfo:(nullable SDLVehicleDataResult *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable SDLVehicleDataResult *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setAirbagStatus:(nullable SDLVehicleDataResult *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable SDLVehicleDataResult *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setEmergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable SDLVehicleDataResult *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setClusterModes:(nullable SDLVehicleDataResult *)clusterModes { - [parameters sdl_setObject:clusterModes forName:SDLRPCParameterNameClusterModes]; + [self.parameters sdl_setObject:clusterModes forName:SDLRPCParameterNameClusterModes]; } - (nullable SDLVehicleDataResult *)clusterModes { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModes ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModes ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setMyKey:(nullable SDLVehicleDataResult *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable SDLVehicleDataResult *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable SDLVehicleDataResult *)electronicParkBrakeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setTurnSignal:(nullable SDLVehicleDataResult *)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable SDLVehicleDataResult *)turnSignal { - return [parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setCloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable SDLVehicleDataResult *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:SDLVehicleDataResult.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSubscribeWayPoints.m b/SmartDeviceLink/SDLSubscribeWayPoints.m index 206af8d8c..cd2e481cf 100644 --- a/SmartDeviceLink/SDLSubscribeWayPoints.m +++ b/SmartDeviceLink/SDLSubscribeWayPoints.m @@ -11,11 +11,14 @@ @implementation SDLSubscribeWayPoints +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSubscribeWayPoints]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSubscribeWayPointsResponse.m b/SmartDeviceLink/SDLSubscribeWayPointsResponse.m index 7de1b3403..867fbc39e 100644 --- a/SmartDeviceLink/SDLSubscribeWayPointsResponse.m +++ b/SmartDeviceLink/SDLSubscribeWayPointsResponse.m @@ -12,11 +12,14 @@ @implementation SDLSubscribeWayPointsResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSubscribeWayPoints]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSyncMsgVersion.m b/SmartDeviceLink/SDLSyncMsgVersion.m index 82cfb6d4f..f7db832c2 100644 --- a/SmartDeviceLink/SDLSyncMsgVersion.m +++ b/SmartDeviceLink/SDLSyncMsgVersion.m @@ -25,29 +25,29 @@ - (instancetype)initWithMajorVersion:(UInt8)majorVersion minorVersion:(UInt8)min } - (void)setMajorVersion:(NSNumber *)majorVersion { - [store sdl_setObject:majorVersion forName:SDLRPCParameterNameMajorVersion]; + [self.store sdl_setObject:majorVersion forName:SDLRPCParameterNameMajorVersion]; } - (NSNumber *)majorVersion { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMajorVersion ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMajorVersion ofClass:NSNumber.class error:&error]; } - (void)setMinorVersion:(NSNumber *)minorVersion { - [store sdl_setObject:minorVersion forName:SDLRPCParameterNameMinorVersion]; + [self.store sdl_setObject:minorVersion forName:SDLRPCParameterNameMinorVersion]; } - (NSNumber *)minorVersion { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMinorVersion ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMinorVersion ofClass:NSNumber.class error:&error]; } - (void)setPatchVersion:(nullable NSNumber *)patchVersion { - [store sdl_setObject:patchVersion forName:SDLRPCParameterNamePatchVersion]; + [self.store sdl_setObject:patchVersion forName:SDLRPCParameterNamePatchVersion]; } - (nullable NSNumber *)patchVersion { - return [store sdl_objectForName:SDLRPCParameterNamePatchVersion ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePatchVersion ofClass:NSNumber.class error:nil]; } - (NSString *)description { diff --git a/SmartDeviceLink/SDLSyncPData.m b/SmartDeviceLink/SDLSyncPData.m index 1163bc126..bd3453b95 100644 --- a/SmartDeviceLink/SDLSyncPData.m +++ b/SmartDeviceLink/SDLSyncPData.m @@ -12,11 +12,14 @@ @implementation SDLSyncPData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSyncPData]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSyncPDataResponse.m b/SmartDeviceLink/SDLSyncPDataResponse.m index 082b1a1a4..64341aa58 100644 --- a/SmartDeviceLink/SDLSyncPDataResponse.m +++ b/SmartDeviceLink/SDLSyncPDataResponse.m @@ -12,11 +12,14 @@ @implementation SDLSyncPDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSyncPData]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLSystemCapability.m b/SmartDeviceLink/SDLSystemCapability.m index 23c826a34..c9273df2c 100755 --- a/SmartDeviceLink/SDLSystemCapability.m +++ b/SmartDeviceLink/SDLSystemCapability.m @@ -82,52 +82,52 @@ - (instancetype)initWithRemoteControlCapability:(SDLRemoteControlCapabilities *) } - (void)setSystemCapabilityType:(SDLSystemCapabilityType)type { - [store sdl_setObject:type forName:SDLRPCParameterNameSystemCapabilityType]; + [self.store sdl_setObject:type forName:SDLRPCParameterNameSystemCapabilityType]; } - (SDLSystemCapabilityType)systemCapabilityType { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameSystemCapabilityType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameSystemCapabilityType error:&error]; } - (void)setAppServicesCapabilities:(nullable SDLAppServicesCapabilities *)appServicesCapabilities { - [store sdl_setObject:appServicesCapabilities forName:SDLRPCParameterNameAppServicesCapabilities]; + [self.store sdl_setObject:appServicesCapabilities forName:SDLRPCParameterNameAppServicesCapabilities]; } - (nullable SDLAppServicesCapabilities *)appServicesCapabilities { - return [store sdl_objectForName:SDLRPCParameterNameAppServicesCapabilities ofClass:SDLAppServicesCapabilities.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameAppServicesCapabilities ofClass:SDLAppServicesCapabilities.class error:nil]; } - (void)setNavigationCapability:(nullable SDLNavigationCapability *)navigationCapability { - [store sdl_setObject:navigationCapability forName:SDLRPCParameterNameNavigationCapability]; + [self.store sdl_setObject:navigationCapability forName:SDLRPCParameterNameNavigationCapability]; } - (nullable SDLNavigationCapability *)navigationCapability { - return [store sdl_objectForName:SDLRPCParameterNameNavigationCapability ofClass:SDLNavigationCapability.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNavigationCapability ofClass:SDLNavigationCapability.class error:nil]; } - (void)setPhoneCapability:(nullable SDLPhoneCapability *)phoneCapability { - [store sdl_setObject:phoneCapability forName:SDLRPCParameterNamePhoneCapability]; + [self.store sdl_setObject:phoneCapability forName:SDLRPCParameterNamePhoneCapability]; } - (nullable SDLPhoneCapability *)phoneCapability { - return [store sdl_objectForName:SDLRPCParameterNamePhoneCapability ofClass:SDLPhoneCapability.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePhoneCapability ofClass:SDLPhoneCapability.class error:nil]; } - (void)setVideoStreamingCapability:(nullable SDLVideoStreamingCapability *)videoStreamingCapability { - [store sdl_setObject:videoStreamingCapability forName:SDLRPCParameterNameVideoStreamingCapability]; + [self.store sdl_setObject:videoStreamingCapability forName:SDLRPCParameterNameVideoStreamingCapability]; } - (nullable SDLVideoStreamingCapability *)videoStreamingCapability { - return [store sdl_objectForName:SDLRPCParameterNameVideoStreamingCapability ofClass:SDLVideoStreamingCapability.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVideoStreamingCapability ofClass:SDLVideoStreamingCapability.class error:nil]; } - (void)setRemoteControlCapability:(nullable SDLRemoteControlCapabilities *)remoteControlCapability { - [store sdl_setObject:remoteControlCapability forName:SDLRPCParameterNameRemoteControlCapability]; + [self.store sdl_setObject:remoteControlCapability forName:SDLRPCParameterNameRemoteControlCapability]; } - (nullable SDLRemoteControlCapabilities *)remoteControlCapability { - return [store sdl_objectForName:SDLRPCParameterNameRemoteControlCapability ofClass:SDLRemoteControlCapabilities.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameRemoteControlCapability ofClass:SDLRemoteControlCapabilities.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSystemRequest.m b/SmartDeviceLink/SDLSystemRequest.m index db8eead44..6999a5bca 100644 --- a/SmartDeviceLink/SDLSystemRequest.m +++ b/SmartDeviceLink/SDLSystemRequest.m @@ -12,11 +12,14 @@ @implementation SDLSystemRequest +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSystemRequest]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithType:(SDLRequestType)requestType fileName:(nullable NSString *)fileName { self = [self init]; @@ -42,28 +45,28 @@ - (instancetype)initWithProprietaryType:(NSString *)proprietaryType fileName:(nu } - (void)setRequestType:(SDLRequestType)requestType { - [parameters sdl_setObject:requestType forName:SDLRPCParameterNameRequestType]; + [self.parameters sdl_setObject:requestType forName:SDLRPCParameterNameRequestType]; } - (SDLRequestType)requestType { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameRequestType error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameRequestType error:&error]; } - (void)setRequestSubType:(nullable NSString *)requestSubType { - [parameters sdl_setObject:requestSubType forName:SDLRPCParameterNameRequestSubType]; + [self.parameters sdl_setObject:requestSubType forName:SDLRPCParameterNameRequestSubType]; } - (nullable NSString *)requestSubType { - return [parameters sdl_objectForName:SDLRPCParameterNameRequestSubType ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRequestSubType ofClass:NSString.class error:nil]; } - (void)setFileName:(nullable NSString *)fileName { - [parameters sdl_setObject:fileName forName:SDLRPCParameterNameFilename]; + [self.parameters sdl_setObject:fileName forName:SDLRPCParameterNameFilename]; } - (nullable NSString *)fileName { - return [parameters sdl_objectForName:SDLRPCParameterNameFilename ofClass:NSString.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFilename ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLSystemRequestResponse.m b/SmartDeviceLink/SDLSystemRequestResponse.m index 8f5150302..3275c2228 100644 --- a/SmartDeviceLink/SDLSystemRequestResponse.m +++ b/SmartDeviceLink/SDLSystemRequestResponse.m @@ -12,11 +12,14 @@ @implementation SDLSystemRequestResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameSystemRequest]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLTTSChunk.m b/SmartDeviceLink/SDLTTSChunk.m index 3d66387d0..49f036835 100644 --- a/SmartDeviceLink/SDLTTSChunk.m +++ b/SmartDeviceLink/SDLTTSChunk.m @@ -55,21 +55,21 @@ - (instancetype)initWithText:(NSString *)text type:(SDLSpeechCapabilities)type { } - (void)setText:(NSString *)text { - [store sdl_setObject:text forName:SDLRPCParameterNameText]; + [self.store sdl_setObject:text forName:SDLRPCParameterNameText]; } - (NSString *)text { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameText ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameText ofClass:NSString.class error:&error]; } - (void)setType:(SDLSpeechCapabilities)type { - [store sdl_setObject:type forName:SDLRPCParameterNameType]; + [self.store sdl_setObject:type forName:SDLRPCParameterNameType]; } - (SDLSpeechCapabilities)type { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameType error:&error]; } @end diff --git a/SmartDeviceLink/SDLTemperature.m b/SmartDeviceLink/SDLTemperature.m index 66759f4fd..45d1e2280 100644 --- a/SmartDeviceLink/SDLTemperature.m +++ b/SmartDeviceLink/SDLTemperature.m @@ -31,21 +31,21 @@ - (instancetype)initWithUnit:(SDLTemperatureUnit)unit value:(float)value { } - (void)setUnit:(SDLTemperatureUnit)unit { - [store sdl_setObject:unit forName:SDLRPCParameterNameUnit]; + [self.store sdl_setObject:unit forName:SDLRPCParameterNameUnit]; } - (SDLTemperatureUnit)unit { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameUnit error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameUnit error:&error]; } - (void)setValue:(NSNumber *)value { - [store sdl_setObject:value forName:SDLRPCParameterNameValue]; + [self.store sdl_setObject:value forName:SDLRPCParameterNameValue]; } - (NSNumber *)value { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameValue ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameValue ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLTemplateColorScheme.m b/SmartDeviceLink/SDLTemplateColorScheme.m index da1e833e3..0c758fbbd 100644 --- a/SmartDeviceLink/SDLTemplateColorScheme.m +++ b/SmartDeviceLink/SDLTemplateColorScheme.m @@ -39,27 +39,27 @@ - (instancetype)initWithPrimaryColor:(UIColor *)primaryColor secondaryColor:(UIC } - (void)setPrimaryColor:(nullable SDLRGBColor *)primaryColor { - [store sdl_setObject:primaryColor forName:SDLRPCParameterNamePrimaryColor]; + [self.store sdl_setObject:primaryColor forName:SDLRPCParameterNamePrimaryColor]; } - (nullable SDLRGBColor *)primaryColor { - return [store sdl_objectForName:SDLRPCParameterNamePrimaryColor ofClass:SDLRGBColor.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePrimaryColor ofClass:SDLRGBColor.class error:nil]; } - (void)setSecondaryColor:(nullable SDLRGBColor *)secondaryColor { - [store sdl_setObject:secondaryColor forName:SDLRPCParameterNameSecondaryColor]; + [self.store sdl_setObject:secondaryColor forName:SDLRPCParameterNameSecondaryColor]; } - (nullable SDLRGBColor *)secondaryColor { - return [store sdl_objectForName:SDLRPCParameterNameSecondaryColor ofClass:SDLRGBColor.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSecondaryColor ofClass:SDLRGBColor.class error:nil]; } - (void)setBackgroundColor:(nullable SDLRGBColor *)backgroundColor { - [store sdl_setObject:backgroundColor forName:SDLRPCParameterNameBackgroundColor]; + [self.store sdl_setObject:backgroundColor forName:SDLRPCParameterNameBackgroundColor]; } - (nullable SDLRGBColor *)backgroundColor { - return [store sdl_objectForName:SDLRPCParameterNameBackgroundColor ofClass:SDLRGBColor.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameBackgroundColor ofClass:SDLRGBColor.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLTextField.m b/SmartDeviceLink/SDLTextField.m index 6ac0fb052..cc50aa743 100644 --- a/SmartDeviceLink/SDLTextField.m +++ b/SmartDeviceLink/SDLTextField.m @@ -13,39 +13,39 @@ @implementation SDLTextField - (void)setName:(SDLTextFieldName)name { - [store sdl_setObject:name forName:SDLRPCParameterNameName]; + [self.store sdl_setObject:name forName:SDLRPCParameterNameName]; } - (SDLTextFieldName)name { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameName error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameName error:&error]; } - (void)setCharacterSet:(SDLCharacterSet)characterSet { - [store sdl_setObject:characterSet forName:SDLRPCParameterNameCharacterSet]; + [self.store sdl_setObject:characterSet forName:SDLRPCParameterNameCharacterSet]; } - (SDLCharacterSet)characterSet { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameCharacterSet error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameCharacterSet error:&error]; } - (void)setWidth:(NSNumber *)width { - [store sdl_setObject:width forName:SDLRPCParameterNameWidth]; + [self.store sdl_setObject:width forName:SDLRPCParameterNameWidth]; } - (NSNumber *)width { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameWidth ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameWidth ofClass:NSNumber.class error:&error]; } - (void)setRows:(NSNumber *)rows { - [store sdl_setObject:rows forName:SDLRPCParameterNameRows]; + [self.store sdl_setObject:rows forName:SDLRPCParameterNameRows]; } - (NSNumber *)rows { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameRows ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameRows ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLTireStatus.m b/SmartDeviceLink/SDLTireStatus.m index 9dd0a9036..aa1bac556 100644 --- a/SmartDeviceLink/SDLTireStatus.m +++ b/SmartDeviceLink/SDLTireStatus.m @@ -12,66 +12,66 @@ @implementation SDLTireStatus - (void)setPressureTelltale:(SDLWarningLightStatus)pressureTelltale { - [store sdl_setObject:pressureTelltale forName:SDLRPCParameterNamePressureTelltale]; + [self.store sdl_setObject:pressureTelltale forName:SDLRPCParameterNamePressureTelltale]; } - (SDLWarningLightStatus)pressureTelltale { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNamePressureTelltale error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNamePressureTelltale error:&error]; } - (void)setLeftFront:(SDLSingleTireStatus *)leftFront { - [store sdl_setObject:leftFront forName:SDLRPCParameterNameLeftFront]; + [self.store sdl_setObject:leftFront forName:SDLRPCParameterNameLeftFront]; } - (SDLSingleTireStatus *)leftFront { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLeftFront ofClass:SDLSingleTireStatus.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLeftFront ofClass:SDLSingleTireStatus.class error:&error]; } - (void)setRightFront:(SDLSingleTireStatus *)rightFront { - [store sdl_setObject:rightFront forName:SDLRPCParameterNameRightFront]; + [self.store sdl_setObject:rightFront forName:SDLRPCParameterNameRightFront]; } - (SDLSingleTireStatus *)rightFront { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameRightFront ofClass:SDLSingleTireStatus.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameRightFront ofClass:SDLSingleTireStatus.class error:&error]; } - (void)setLeftRear:(SDLSingleTireStatus *)leftRear { - [store sdl_setObject:leftRear forName:SDLRPCParameterNameLeftRear]; + [self.store sdl_setObject:leftRear forName:SDLRPCParameterNameLeftRear]; } - (SDLSingleTireStatus *)leftRear { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLeftRear ofClass:SDLSingleTireStatus.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLeftRear ofClass:SDLSingleTireStatus.class error:&error]; } - (void)setRightRear:(SDLSingleTireStatus *)rightRear { - [store sdl_setObject:rightRear forName:SDLRPCParameterNameRightRear]; + [self.store sdl_setObject:rightRear forName:SDLRPCParameterNameRightRear]; } - (SDLSingleTireStatus *)rightRear { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameRightRear ofClass:SDLSingleTireStatus.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameRightRear ofClass:SDLSingleTireStatus.class error:&error]; } - (void)setInnerLeftRear:(SDLSingleTireStatus *)innerLeftRear { - [store sdl_setObject:innerLeftRear forName:SDLRPCParameterNameInnerLeftRear]; + [self.store sdl_setObject:innerLeftRear forName:SDLRPCParameterNameInnerLeftRear]; } - (SDLSingleTireStatus *)innerLeftRear { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameInnerLeftRear ofClass:SDLSingleTireStatus.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameInnerLeftRear ofClass:SDLSingleTireStatus.class error:&error]; } - (void)setInnerRightRear:(SDLSingleTireStatus *)innerRightRear { - [store sdl_setObject:innerRightRear forName:SDLRPCParameterNameInnerRightRear]; + [self.store sdl_setObject:innerRightRear forName:SDLRPCParameterNameInnerRightRear]; } - (SDLSingleTireStatus *)innerRightRear { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameInnerRightRear ofClass:SDLSingleTireStatus.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameInnerRightRear ofClass:SDLSingleTireStatus.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLTouchCoord.m b/SmartDeviceLink/SDLTouchCoord.m index 5c5500cdf..e41a6435c 100644 --- a/SmartDeviceLink/SDLTouchCoord.m +++ b/SmartDeviceLink/SDLTouchCoord.m @@ -12,21 +12,21 @@ @implementation SDLTouchCoord - (void)setX:(NSNumber *)x { - [store sdl_setObject:x forName:SDLRPCParameterNameX]; + [self.store sdl_setObject:x forName:SDLRPCParameterNameX]; } - (NSNumber *)x { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameX ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameX ofClass:NSNumber.class error:&error]; } - (void)setY:(NSNumber *)y { - [store sdl_setObject:y forName:SDLRPCParameterNameY]; + [self.store sdl_setObject:y forName:SDLRPCParameterNameY]; } - (NSNumber *)y { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameY ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameY ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLTouchEvent.m b/SmartDeviceLink/SDLTouchEvent.m index 89b2648ee..617174bbc 100644 --- a/SmartDeviceLink/SDLTouchEvent.m +++ b/SmartDeviceLink/SDLTouchEvent.m @@ -13,30 +13,30 @@ @implementation SDLTouchEvent - (void)setTouchEventId:(NSNumber *)touchEventId { - [store sdl_setObject:touchEventId forName:SDLRPCParameterNameId]; + [self.store sdl_setObject:touchEventId forName:SDLRPCParameterNameId]; } - (NSNumber *)touchEventId { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameId ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameId ofClass:NSNumber.class error:&error]; } - (void)setTimeStamp:(NSArray *> *)timeStamp { - [store sdl_setObject:timeStamp forName:SDLRPCParameterNameTS]; + [self.store sdl_setObject:timeStamp forName:SDLRPCParameterNameTS]; } - (NSArray *> *)timeStamp { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameTS ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameTS ofClass:NSNumber.class error:&error]; } - (void)setCoord:(NSArray *)coord { - [store sdl_setObject:coord forName:SDLRPCParameterNameCoordinate]; + [self.store sdl_setObject:coord forName:SDLRPCParameterNameCoordinate]; } - (NSArray *)coord { NSError *error = nil; - return [store sdl_objectsForName:SDLRPCParameterNameCoordinate ofClass:SDLTouchCoord.class error:&error]; + return [self.store sdl_objectsForName:SDLRPCParameterNameCoordinate ofClass:SDLTouchCoord.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLTouchEventCapabilities.m b/SmartDeviceLink/SDLTouchEventCapabilities.m index 9ff250e27..5a69566da 100644 --- a/SmartDeviceLink/SDLTouchEventCapabilities.m +++ b/SmartDeviceLink/SDLTouchEventCapabilities.m @@ -12,30 +12,30 @@ @implementation SDLTouchEventCapabilities - (void)setPressAvailable:(NSNumber *)pressAvailable { - [store sdl_setObject:pressAvailable forName:SDLRPCParameterNamePressAvailable]; + [self.store sdl_setObject:pressAvailable forName:SDLRPCParameterNamePressAvailable]; } - (NSNumber *)pressAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNamePressAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNamePressAvailable ofClass:NSNumber.class error:&error]; } - (void)setMultiTouchAvailable:(NSNumber *)multiTouchAvailable { - [store sdl_setObject:multiTouchAvailable forName:SDLRPCParameterNameMultiTouchAvailable]; + [self.store sdl_setObject:multiTouchAvailable forName:SDLRPCParameterNameMultiTouchAvailable]; } - (NSNumber *)multiTouchAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameMultiTouchAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameMultiTouchAvailable ofClass:NSNumber.class error:&error]; } - (void)setDoublePressAvailable:(NSNumber *)doublePressAvailable { - [store sdl_setObject:doublePressAvailable forName:SDLRPCParameterNameDoublePressAvailable]; + [self.store sdl_setObject:doublePressAvailable forName:SDLRPCParameterNameDoublePressAvailable]; } - (NSNumber *)doublePressAvailable { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameDoublePressAvailable ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameDoublePressAvailable ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLTurn.m b/SmartDeviceLink/SDLTurn.m index c788c77c5..ec4ced937 100644 --- a/SmartDeviceLink/SDLTurn.m +++ b/SmartDeviceLink/SDLTurn.m @@ -24,19 +24,19 @@ - (instancetype)initWithNavigationText:(nullable NSString *)navigationText turnI } - (void)setNavigationText:(nullable NSString *)navigationText { - [store sdl_setObject:navigationText forName:SDLRPCParameterNameNavigationText]; + [self.store sdl_setObject:navigationText forName:SDLRPCParameterNameNavigationText]; } - (nullable NSString *)navigationText { - return [store sdl_objectForName:SDLRPCParameterNameNavigationText ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNavigationText ofClass:NSString.class error:nil]; } - (void)setTurnIcon:(nullable SDLImage *)turnIcon { - [store sdl_setObject:turnIcon forName:SDLRPCParameterNameTurnIcon]; + [self.store sdl_setObject:turnIcon forName:SDLRPCParameterNameTurnIcon]; } - (nullable SDLImage *)turnIcon { - return [store sdl_objectForName:SDLRPCParameterNameTurnIcon ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTurnIcon ofClass:SDLImage.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLUnregisterAppInterface.m b/SmartDeviceLink/SDLUnregisterAppInterface.m index 22bfdc590..d191da5bb 100644 --- a/SmartDeviceLink/SDLUnregisterAppInterface.m +++ b/SmartDeviceLink/SDLUnregisterAppInterface.m @@ -12,11 +12,14 @@ @implementation SDLUnregisterAppInterface +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnregisterAppInterface]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLUnregisterAppInterfaceResponse.m b/SmartDeviceLink/SDLUnregisterAppInterfaceResponse.m index c9978d630..7cc5eced3 100644 --- a/SmartDeviceLink/SDLUnregisterAppInterfaceResponse.m +++ b/SmartDeviceLink/SDLUnregisterAppInterfaceResponse.m @@ -12,11 +12,14 @@ @implementation SDLUnregisterAppInterfaceResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnregisterAppInterface]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLUnsubscribeButton.m b/SmartDeviceLink/SDLUnsubscribeButton.m index 7d6d0157a..3e84ad5b6 100644 --- a/SmartDeviceLink/SDLUnsubscribeButton.m +++ b/SmartDeviceLink/SDLUnsubscribeButton.m @@ -13,11 +13,14 @@ @implementation SDLUnsubscribeButton +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnsubscribeButton]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithButtonName:(SDLButtonName)buttonName { self = [self init]; @@ -31,12 +34,12 @@ - (instancetype)initWithButtonName:(SDLButtonName)buttonName { } - (void)setButtonName:(SDLButtonName)buttonName { - [parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; + [self.parameters sdl_setObject:buttonName forName:SDLRPCParameterNameButtonName]; } - (SDLButtonName)buttonName { NSError *error = nil; - return [parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; + return [self.parameters sdl_enumForName:SDLRPCParameterNameButtonName error:&error]; } @end diff --git a/SmartDeviceLink/SDLUnsubscribeButtonResponse.m b/SmartDeviceLink/SDLUnsubscribeButtonResponse.m index 27f5f0266..6d705d36e 100644 --- a/SmartDeviceLink/SDLUnsubscribeButtonResponse.m +++ b/SmartDeviceLink/SDLUnsubscribeButtonResponse.m @@ -12,11 +12,14 @@ @implementation SDLUnsubscribeButtonResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnsubscribeButton]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleData.m b/SmartDeviceLink/SDLUnsubscribeVehicleData.m index 996aa9883..1df1d2a5f 100644 --- a/SmartDeviceLink/SDLUnsubscribeVehicleData.m +++ b/SmartDeviceLink/SDLUnsubscribeVehicleData.m @@ -12,11 +12,14 @@ @implementation SDLUnsubscribeVehicleData +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnsubscribeVehicleData]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPosition airbagStatus:(BOOL)airbagStatus beltStatus:(BOOL)beltStatus bodyInformation:(BOOL)bodyInformation clusterModeStatus:(BOOL)clusterModeStatus deviceStatus:(BOOL)deviceStatus driverBraking:(BOOL)driverBraking eCallInfo:(BOOL)eCallInfo emergencyEvent:(BOOL)emergencyEvent engineTorque:(BOOL)engineTorque externalTemperature:(BOOL)externalTemperature fuelLevel:(BOOL)fuelLevel fuelLevelState:(BOOL)fuelLevelState gps:(BOOL)gps headLampStatus:(BOOL)headLampStatus instantFuelConsumption:(BOOL)instantFuelConsumption myKey:(BOOL)myKey odometer:(BOOL)odometer prndl:(BOOL)prndl rpm:(BOOL)rpm speed:(BOOL)speed steeringWheelAngle:(BOOL)steeringWheelAngle tirePressure:(BOOL)tirePressure wiperStatus:(BOOL)wiperStatus { return [self initWithAccelerationPedalPosition:accelerationPedalPosition airbagStatus:airbagStatus beltStatus:beltStatus bodyInformation:bodyInformation clusterModeStatus:clusterModeStatus deviceStatus:deviceStatus driverBraking:driverBraking eCallInfo:eCallInfo electronicParkBrakeStatus:NO emergencyEvent:emergencyEvent engineOilLife:NO engineTorque:engineTorque externalTemperature:externalTemperature fuelLevel:fuelLevel fuelLevelState:fuelLevelState fuelRange:NO gps:gps headLampStatus:headLampStatus instantFuelConsumption:instantFuelConsumption myKey:myKey odometer:odometer prndl:prndl rpm:rpm speed:speed steeringWheelAngle:steeringWheelAngle tirePressure:tirePressure turnSignal:NO wiperStatus:wiperStatus]; @@ -66,235 +69,235 @@ - (instancetype)initWithAccelerationPedalPosition:(BOOL)accelerationPedalPositio } - (void)setGps:(nullable NSNumber *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable NSNumber *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:NSNumber.class error:nil]; } - (void)setSpeed:(nullable NSNumber *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable NSNumber *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:NSNumber.class error:nil]; } - (void)setRpm:(nullable NSNumber *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable NSNumber *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel:(nullable NSNumber *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable NSNumber *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:NSNumber.class error:nil]; } - (void)setFuelLevel_State:(nullable NSNumber *)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable NSNumber *)fuelLevel_State { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:NSNumber.class error:nil]; } - (void)setFuelRange:(nullable NSNumber *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable NSNumber *)fuelRange { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:NSNumber.class error:nil]; } - (void)setInstantFuelConsumption:(nullable NSNumber *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (nullable NSNumber *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:NSNumber.class error:nil]; } - (void)setExternalTemperature:(nullable NSNumber *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable NSNumber *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:NSNumber.class error:nil]; } - (void)setPrndl:(nullable NSNumber *)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable NSNumber *)prndl { - return [parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:NSNumber.class error:nil]; } - (void)setTirePressure:(nullable NSNumber *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable NSNumber *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:NSNumber.class error:nil]; } - (void)setOdometer:(nullable NSNumber *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable NSNumber *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:NSNumber.class error:nil]; } - (void)setBeltStatus:(nullable NSNumber *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable NSNumber *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:NSNumber.class error:nil]; } - (void)setBodyInformation:(nullable NSNumber *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable NSNumber *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:NSNumber.class error:nil]; } - (void)setDeviceStatus:(nullable NSNumber *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable NSNumber *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:NSNumber.class error:nil]; } - (void)setDriverBraking:(nullable NSNumber *)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable NSNumber *)driverBraking { - return [parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:NSNumber.class error:nil]; } - (void)setWiperStatus:(nullable NSNumber *)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable NSNumber *)wiperStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:NSNumber.class error:nil]; } - (void)setHeadLampStatus:(nullable NSNumber *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable NSNumber *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:NSNumber.class error:nil]; } - (void)setEngineOilLife:(nullable NSNumber *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable NSNumber *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:NSNumber.class error:nil]; } - (void)setEngineTorque:(nullable NSNumber *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable NSNumber *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:NSNumber.class error:nil]; } - (void)setAccPedalPosition:(nullable NSNumber *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable NSNumber *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:NSNumber.class error:nil]; } - (void)setSteeringWheelAngle:(nullable NSNumber *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable NSNumber *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:NSNumber.class error:nil]; } - (void)setECallInfo:(nullable NSNumber *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable NSNumber *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:NSNumber.class error:nil]; } - (void)setAirbagStatus:(nullable NSNumber *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable NSNumber *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:NSNumber.class error:nil]; } - (void)setEmergencyEvent:(nullable NSNumber *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable NSNumber *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:NSNumber.class error:nil]; } - (void)setClusterModeStatus:(nullable NSNumber *)clusterModeStatus { - [parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; + [self.parameters sdl_setObject:clusterModeStatus forName:SDLRPCParameterNameClusterModeStatus]; } - (nullable NSNumber *)clusterModeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModeStatus ofClass:NSNumber.class error:nil]; } - (void)setMyKey:(nullable NSNumber *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable NSNumber *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:NSNumber.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable NSNumber *)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable NSNumber *)electronicParkBrakeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:NSNumber.class error:nil]; } - (void)setTurnSignal:(nullable NSNumber *)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable NSNumber *)turnSignal { - return [parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:NSNumber.class error:nil]; } - (void)setCloudAppVehicleID:(nullable NSNumber *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable NSNumber *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSNumber.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m index c72ebbf5e..b7bddc70d 100644 --- a/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m +++ b/SmartDeviceLink/SDLUnsubscribeVehicleDataResponse.m @@ -13,242 +13,245 @@ @implementation SDLUnsubscribeVehicleDataResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnsubscribeVehicleData]) { } return self; } +#pragma clang diagnostic pop - (void)setGps:(nullable SDLVehicleDataResult *)gps { - [parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; + [self.parameters sdl_setObject:gps forName:SDLRPCParameterNameGPS]; } - (nullable SDLVehicleDataResult *)gps { - return [parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameGPS ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setSpeed:(nullable SDLVehicleDataResult *)speed { - [parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; + [self.parameters sdl_setObject:speed forName:SDLRPCParameterNameSpeed]; } - (nullable SDLVehicleDataResult *)speed { - return [parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSpeed ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setRpm:(nullable SDLVehicleDataResult *)rpm { - [parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; + [self.parameters sdl_setObject:rpm forName:SDLRPCParameterNameRPM]; } - (nullable SDLVehicleDataResult *)rpm { - return [parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameRPM ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setFuelLevel:(nullable SDLVehicleDataResult *)fuelLevel { - [parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; + [self.parameters sdl_setObject:fuelLevel forName:SDLRPCParameterNameFuelLevel]; } - (nullable SDLVehicleDataResult *)fuelLevel { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevel ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setFuelLevel_State:(nullable SDLVehicleDataResult *)fuelLevel_State { - [parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; + [self.parameters sdl_setObject:fuelLevel_State forName:SDLRPCParameterNameFuelLevelState]; } - (nullable SDLVehicleDataResult *)fuelLevel_State { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelLevelState ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setFuelRange:(nullable SDLVehicleDataResult *)fuelRange { - [parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; + [self.parameters sdl_setObject:fuelRange forName:SDLRPCParameterNameFuelRange]; } - (nullable SDLVehicleDataResult *)fuelRange { - return [parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameFuelRange ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setInstantFuelConsumption:(nullable SDLVehicleDataResult *)instantFuelConsumption { - [parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; + [self.parameters sdl_setObject:instantFuelConsumption forName:SDLRPCParameterNameInstantFuelConsumption]; } - (nullable SDLVehicleDataResult *)instantFuelConsumption { - return [parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameInstantFuelConsumption ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setExternalTemperature:(nullable SDLVehicleDataResult *)externalTemperature { - [parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; + [self.parameters sdl_setObject:externalTemperature forName:SDLRPCParameterNameExternalTemperature]; } - (nullable SDLVehicleDataResult *)externalTemperature { - return [parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameExternalTemperature ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setPrndl:(nullable SDLVehicleDataResult *)prndl { - [parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; + [self.parameters sdl_setObject:prndl forName:SDLRPCParameterNamePRNDL]; } - (nullable SDLVehicleDataResult *)prndl { - return [parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNamePRNDL ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setTirePressure:(nullable SDLVehicleDataResult *)tirePressure { - [parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; + [self.parameters sdl_setObject:tirePressure forName:SDLRPCParameterNameTirePressure]; } - (nullable SDLVehicleDataResult *)tirePressure { - return [parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTirePressure ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setOdometer:(nullable SDLVehicleDataResult *)odometer { - [parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; + [self.parameters sdl_setObject:odometer forName:SDLRPCParameterNameOdometer]; } - (nullable SDLVehicleDataResult *)odometer { - return [parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameOdometer ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setBeltStatus:(nullable SDLVehicleDataResult *)beltStatus { - [parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; + [self.parameters sdl_setObject:beltStatus forName:SDLRPCParameterNameBeltStatus]; } - (nullable SDLVehicleDataResult *)beltStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBeltStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setBodyInformation:(nullable SDLVehicleDataResult *)bodyInformation { - [parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; + [self.parameters sdl_setObject:bodyInformation forName:SDLRPCParameterNameBodyInformation]; } - (nullable SDLVehicleDataResult *)bodyInformation { - return [parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameBodyInformation ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setDeviceStatus:(nullable SDLVehicleDataResult *)deviceStatus { - [parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; + [self.parameters sdl_setObject:deviceStatus forName:SDLRPCParameterNameDeviceStatus]; } - (nullable SDLVehicleDataResult *)deviceStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDeviceStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setDriverBraking:(nullable SDLVehicleDataResult *)driverBraking { - [parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; + [self.parameters sdl_setObject:driverBraking forName:SDLRPCParameterNameDriverBraking]; } - (nullable SDLVehicleDataResult *)driverBraking { - return [parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameDriverBraking ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setWiperStatus:(nullable SDLVehicleDataResult *)wiperStatus { - [parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; + [self.parameters sdl_setObject:wiperStatus forName:SDLRPCParameterNameWiperStatus]; } - (nullable SDLVehicleDataResult *)wiperStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameWiperStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setHeadLampStatus:(nullable SDLVehicleDataResult *)headLampStatus { - [parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; + [self.parameters sdl_setObject:headLampStatus forName:SDLRPCParameterNameHeadLampStatus]; } - (nullable SDLVehicleDataResult *)headLampStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameHeadLampStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setEngineOilLife:(nullable SDLVehicleDataResult *)engineOilLife { - [parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; + [self.parameters sdl_setObject:engineOilLife forName:SDLRPCParameterNameEngineOilLife]; } - (nullable SDLVehicleDataResult *)engineOilLife { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineOilLife ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setEngineTorque:(nullable SDLVehicleDataResult *)engineTorque { - [parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; + [self.parameters sdl_setObject:engineTorque forName:SDLRPCParameterNameEngineTorque]; } - (nullable SDLVehicleDataResult *)engineTorque { - return [parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEngineTorque ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setAccPedalPosition:(nullable SDLVehicleDataResult *)accPedalPosition { - [parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; + [self.parameters sdl_setObject:accPedalPosition forName:SDLRPCParameterNameAccelerationPedalPosition]; } - (nullable SDLVehicleDataResult *)accPedalPosition { - return [parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAccelerationPedalPosition ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setSteeringWheelAngle:(nullable SDLVehicleDataResult *)steeringWheelAngle { - [parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; + [self.parameters sdl_setObject:steeringWheelAngle forName:SDLRPCParameterNameSteeringWheelAngle]; } - (nullable SDLVehicleDataResult *)steeringWheelAngle { - return [parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameSteeringWheelAngle ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setECallInfo:(nullable SDLVehicleDataResult *)eCallInfo { - [parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; + [self.parameters sdl_setObject:eCallInfo forName:SDLRPCParameterNameECallInfo]; } - (nullable SDLVehicleDataResult *)eCallInfo { - return [parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameECallInfo ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setAirbagStatus:(nullable SDLVehicleDataResult *)airbagStatus { - [parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; + [self.parameters sdl_setObject:airbagStatus forName:SDLRPCParameterNameAirbagStatus]; } - (nullable SDLVehicleDataResult *)airbagStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameAirbagStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setEmergencyEvent:(nullable SDLVehicleDataResult *)emergencyEvent { - [parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; + [self.parameters sdl_setObject:emergencyEvent forName:SDLRPCParameterNameEmergencyEvent]; } - (nullable SDLVehicleDataResult *)emergencyEvent { - return [parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameEmergencyEvent ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setClusterModes:(nullable SDLVehicleDataResult *)clusterModes { - [parameters sdl_setObject:clusterModes forName:SDLRPCParameterNameClusterModes]; + [self.parameters sdl_setObject:clusterModes forName:SDLRPCParameterNameClusterModes]; } - (nullable SDLVehicleDataResult *)clusterModes { - return [parameters sdl_objectForName:SDLRPCParameterNameClusterModes ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameClusterModes ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setMyKey:(nullable SDLVehicleDataResult *)myKey { - [parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; + [self.parameters sdl_setObject:myKey forName:SDLRPCParameterNameMyKey]; } - (nullable SDLVehicleDataResult *)myKey { - return [parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameMyKey ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setElectronicParkBrakeStatus:(nullable SDLVehicleDataResult *)electronicParkBrakeStatus { - [parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; + [self.parameters sdl_setObject:electronicParkBrakeStatus forName:SDLRPCParameterNameElectronicParkBrakeStatus]; } - (nullable SDLVehicleDataResult *)electronicParkBrakeStatus { - return [parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameElectronicParkBrakeStatus ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setTurnSignal:(nullable SDLVehicleDataResult *)turnSignal { - [parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; + [self.parameters sdl_setObject:turnSignal forName:SDLRPCParameterNameTurnSignal]; } - (nullable SDLVehicleDataResult *)turnSignal { - return [parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameTurnSignal ofClass:SDLVehicleDataResult.class error:nil]; } - (void)setCloudAppVehicleID:(nullable SDLVehicleDataResult *)cloudAppVehicleID { - [parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; + [self.parameters sdl_setObject:cloudAppVehicleID forName:SDLRPCParameterNameCloudAppVehicleID]; } - (nullable SDLVehicleDataResult *)cloudAppVehicleID { - return [parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:SDLVehicleDataResult.class error:nil]; + return [self.parameters sdl_objectForName:SDLRPCParameterNameCloudAppVehicleID ofClass:SDLVehicleDataResult.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLUnsubscribeWayPoints.m b/SmartDeviceLink/SDLUnsubscribeWayPoints.m index a086688e5..30b3e2c07 100644 --- a/SmartDeviceLink/SDLUnsubscribeWayPoints.m +++ b/SmartDeviceLink/SDLUnsubscribeWayPoints.m @@ -11,11 +11,14 @@ @implementation SDLUnsubscribeWayPoints +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnsubscribeWayPoints]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLUnsubscribeWayPointsResponse.m b/SmartDeviceLink/SDLUnsubscribeWayPointsResponse.m index 4d48fb340..7eb3e6369 100644 --- a/SmartDeviceLink/SDLUnsubscribeWayPointsResponse.m +++ b/SmartDeviceLink/SDLUnsubscribeWayPointsResponse.m @@ -11,11 +11,14 @@ @implementation SDLUnsubscribeWayPointsResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUnsubscribeWayPoints]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLUpdateTurnList.m b/SmartDeviceLink/SDLUpdateTurnList.m index 3b6e77603..ed7d6328a 100644 --- a/SmartDeviceLink/SDLUpdateTurnList.m +++ b/SmartDeviceLink/SDLUpdateTurnList.m @@ -14,11 +14,14 @@ @implementation SDLUpdateTurnList +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUpdateTurnList]) { } return self; } +#pragma clang diagnostic pop - (instancetype)initWithTurnList:(nullable NSArray *)turnList softButtons:(nullable NSArray *)softButtons { self = [self init]; @@ -33,19 +36,19 @@ - (instancetype)initWithTurnList:(nullable NSArray *)turnList softBut } - (void)setTurnList:(nullable NSArray *)turnList { - [parameters sdl_setObject:turnList forName:SDLRPCParameterNameTurnList]; + [self.parameters sdl_setObject:turnList forName:SDLRPCParameterNameTurnList]; } - (nullable NSArray *)turnList { - return [parameters sdl_objectsForName:SDLRPCParameterNameTurnList ofClass:SDLTurn.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameTurnList ofClass:SDLTurn.class error:nil]; } - (void)setSoftButtons:(nullable NSArray *)softButtons { - [parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; + [self.parameters sdl_setObject:softButtons forName:SDLRPCParameterNameSoftButtons]; } - (nullable NSArray *)softButtons { - return [parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; + return [self.parameters sdl_objectsForName:SDLRPCParameterNameSoftButtons ofClass:SDLSoftButton.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLUpdateTurnListResponse.m b/SmartDeviceLink/SDLUpdateTurnListResponse.m index 2759e6e26..5231609d7 100644 --- a/SmartDeviceLink/SDLUpdateTurnListResponse.m +++ b/SmartDeviceLink/SDLUpdateTurnListResponse.m @@ -12,11 +12,14 @@ @implementation SDLUpdateTurnListResponse +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" - (instancetype)init { if (self = [super initWithName:SDLRPCFunctionNameUpdateTurnList]) { } return self; } +#pragma clang diagnostic pop @end diff --git a/SmartDeviceLink/SDLVehicleDataResult.m b/SmartDeviceLink/SDLVehicleDataResult.m index e4621a926..0dfd9b1f3 100644 --- a/SmartDeviceLink/SDLVehicleDataResult.m +++ b/SmartDeviceLink/SDLVehicleDataResult.m @@ -11,21 +11,21 @@ @implementation SDLVehicleDataResult - (void)setDataType:(SDLVehicleDataType)dataType { - [store sdl_setObject:dataType forName:SDLRPCParameterNameDataType]; + [self.store sdl_setObject:dataType forName:SDLRPCParameterNameDataType]; } - (SDLVehicleDataType)dataType { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameDataType error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameDataType error:&error]; } - (void)setResultCode:(SDLVehicleDataResultCode)resultCode { - [store sdl_setObject:resultCode forName:SDLRPCParameterNameResultCode]; + [self.store sdl_setObject:resultCode forName:SDLRPCParameterNameResultCode]; } - (SDLVehicleDataResultCode)resultCode { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameResultCode error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameResultCode error:&error]; } @end diff --git a/SmartDeviceLink/SDLVehicleType.m b/SmartDeviceLink/SDLVehicleType.m index 50d3023a5..5f3df0700 100644 --- a/SmartDeviceLink/SDLVehicleType.m +++ b/SmartDeviceLink/SDLVehicleType.m @@ -12,35 +12,35 @@ @implementation SDLVehicleType - (void)setMake:(nullable NSString *)make { - [store sdl_setObject:make forName:SDLRPCParameterNameMake]; + [self.store sdl_setObject:make forName:SDLRPCParameterNameMake]; } - (nullable NSString *)make { - return [store sdl_objectForName:SDLRPCParameterNameMake ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMake ofClass:NSString.class error:nil]; } - (void)setModel:(nullable NSString *)model { - [store sdl_setObject:model forName:SDLRPCParameterNameModel]; + [self.store sdl_setObject:model forName:SDLRPCParameterNameModel]; } - (nullable NSString *)model { - return [store sdl_objectForName:SDLRPCParameterNameModel ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameModel ofClass:NSString.class error:nil]; } - (void)setModelYear:(nullable NSString *)modelYear { - [store sdl_setObject:modelYear forName:SDLRPCParameterNameModelYear]; + [self.store sdl_setObject:modelYear forName:SDLRPCParameterNameModelYear]; } - (nullable NSString *)modelYear { - return [store sdl_objectForName:SDLRPCParameterNameModelYear ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameModelYear ofClass:NSString.class error:nil]; } - (void)setTrim:(nullable NSString *)trim { - [store sdl_setObject:trim forName:SDLRPCParameterNameTrim]; + [self.store sdl_setObject:trim forName:SDLRPCParameterNameTrim]; } - (nullable NSString *)trim { - return [store sdl_objectForName:SDLRPCParameterNameTrim ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTrim ofClass:NSString.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLVideoStreamingCapability.m b/SmartDeviceLink/SDLVideoStreamingCapability.m index f9cee09c5..8f2d0d630 100644 --- a/SmartDeviceLink/SDLVideoStreamingCapability.m +++ b/SmartDeviceLink/SDLVideoStreamingCapability.m @@ -32,35 +32,35 @@ - (instancetype)initWithPreferredResolution:(nullable SDLImageResolution *)prefe } - (void)setPreferredResolution:(nullable SDLImageResolution *)preferredResolution { - [store sdl_setObject:preferredResolution forName:SDLRPCParameterNamePreferredResolution]; + [self.store sdl_setObject:preferredResolution forName:SDLRPCParameterNamePreferredResolution]; } - (nullable SDLImageResolution *)preferredResolution { - return [store sdl_objectForName:SDLRPCParameterNamePreferredResolution ofClass:SDLImageResolution.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePreferredResolution ofClass:SDLImageResolution.class error:nil]; } - (void)setMaxBitrate:(nullable NSNumber *)maxBitrate { - [store sdl_setObject:maxBitrate forName:SDLRPCParameterNameMaxBitrate]; + [self.store sdl_setObject:maxBitrate forName:SDLRPCParameterNameMaxBitrate]; } - (nullable NSNumber *)maxBitrate { - return [store sdl_objectForName:SDLRPCParameterNameMaxBitrate ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMaxBitrate ofClass:NSNumber.class error:nil]; } - (void)setSupportedFormats:(nullable NSArray *)supportedFormats { - [store sdl_setObject:supportedFormats forName:SDLRPCParameterNameSupportedFormats]; + [self.store sdl_setObject:supportedFormats forName:SDLRPCParameterNameSupportedFormats]; } - (nullable NSArray *)supportedFormats { - return [store sdl_objectsForName:SDLRPCParameterNameSupportedFormats ofClass:SDLVideoStreamingFormat.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameSupportedFormats ofClass:SDLVideoStreamingFormat.class error:nil]; } - (void)setHapticSpatialDataSupported:(nullable NSNumber *)hapticSpatialDataSupported { - [store sdl_setObject:hapticSpatialDataSupported forName:SDLRPCParameterNameHapticSpatialDataSupported]; + [self.store sdl_setObject:hapticSpatialDataSupported forName:SDLRPCParameterNameHapticSpatialDataSupported]; } - (nullable NSNumber *)hapticSpatialDataSupported { - return [store sdl_objectForName:SDLRPCParameterNameHapticSpatialDataSupported ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHapticSpatialDataSupported ofClass:NSNumber.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLVideoStreamingFormat.m b/SmartDeviceLink/SDLVideoStreamingFormat.m index eb031a9c4..4fda8d340 100644 --- a/SmartDeviceLink/SDLVideoStreamingFormat.m +++ b/SmartDeviceLink/SDLVideoStreamingFormat.m @@ -26,20 +26,20 @@ - (instancetype)initWithCodec:(SDLVideoStreamingCodec)codec protocol:(SDLVideoSt - (SDLVideoStreamingProtocol)protocol { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameVideoProtocol error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameVideoProtocol error:&error]; } - (void)setProtocol:(SDLVideoStreamingProtocol)protocol { - [store sdl_setObject:protocol forName:SDLRPCParameterNameVideoProtocol]; + [self.store sdl_setObject:protocol forName:SDLRPCParameterNameVideoProtocol]; } - (SDLVideoStreamingCodec)codec { NSError *error = nil; - return [store sdl_enumForName:SDLRPCParameterNameVideoCodec error:&error]; + return [self.store sdl_enumForName:SDLRPCParameterNameVideoCodec error:&error]; } - (void)setCodec:(SDLVideoStreamingCodec)codec { - [store sdl_setObject:codec forName:SDLRPCParameterNameVideoCodec]; + [self.store sdl_setObject:codec forName:SDLRPCParameterNameVideoCodec]; } @end diff --git a/SmartDeviceLink/SDLVrHelpItem.m b/SmartDeviceLink/SDLVrHelpItem.m index 5584818d9..8a9424b62 100644 --- a/SmartDeviceLink/SDLVrHelpItem.m +++ b/SmartDeviceLink/SDLVrHelpItem.m @@ -36,29 +36,29 @@ - (instancetype)initWithText:(NSString *)text image:(nullable SDLImage *)image { } - (void)setText:(NSString *)text { - [store sdl_setObject:text forName:SDLRPCParameterNameText]; + [self.store sdl_setObject:text forName:SDLRPCParameterNameText]; } - (NSString *)text { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameText ofClass:NSString.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameText ofClass:NSString.class error:&error]; } - (void)setImage:(nullable SDLImage *)image { - [store sdl_setObject:image forName:SDLRPCParameterNameImage]; + [self.store sdl_setObject:image forName:SDLRPCParameterNameImage]; } - (nullable SDLImage *)image { - return [store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameImage ofClass:SDLImage.class error:nil]; } - (void)setPosition:(NSNumber *)position { - [store sdl_setObject:position forName:SDLRPCParameterNamePosition]; + [self.store sdl_setObject:position forName:SDLRPCParameterNamePosition]; } - (NSNumber *)position { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNamePosition ofClass:NSNumber.class error:&error]; } @end diff --git a/SmartDeviceLink/SDLWeatherAlert.m b/SmartDeviceLink/SDLWeatherAlert.m index d1dccaa53..8d09e78f3 100644 --- a/SmartDeviceLink/SDLWeatherAlert.m +++ b/SmartDeviceLink/SDLWeatherAlert.m @@ -32,51 +32,51 @@ - (instancetype)initWithTitle:(nullable NSString *)title summary:(nullable NSStr } - (void)setTitle:(nullable NSString *)title { - [store sdl_setObject:title forName:SDLRPCParameterNameTitle]; + [self.store sdl_setObject:title forName:SDLRPCParameterNameTitle]; } - (nullable NSString *)title { - return [store sdl_objectForName:SDLRPCParameterNameTitle ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTitle ofClass:NSString.class error:nil]; } - (void)setSummary:(nullable NSString *)summary { - [store sdl_setObject:summary forName:SDLRPCParameterNameSummary]; + [self.store sdl_setObject:summary forName:SDLRPCParameterNameSummary]; } - (nullable NSString *)summary { - return [store sdl_objectForName:SDLRPCParameterNameSummary ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSummary ofClass:NSString.class error:nil]; } - (void)setExpires:(nullable SDLDateTime *)expires { - [store sdl_setObject:expires forName:SDLRPCParameterNameExpires]; + [self.store sdl_setObject:expires forName:SDLRPCParameterNameExpires]; } - (nullable SDLDateTime *)expires { - return [store sdl_objectForName:SDLRPCParameterNameExpires ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameExpires ofClass:SDLDateTime.class error:nil]; } - (void)setRegions:(nullable NSArray *)regions { - [store sdl_setObject:regions forName:SDLRPCParameterNameRegions]; + [self.store sdl_setObject:regions forName:SDLRPCParameterNameRegions]; } - (nullable NSArray *)regions { - return [store sdl_objectsForName:SDLRPCParameterNameRegions ofClass:NSString.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameRegions ofClass:NSString.class error:nil]; } - (void)setSeverity:(nullable NSString *)severity { - [store sdl_setObject:severity forName:SDLRPCParameterNameSeverity]; + [self.store sdl_setObject:severity forName:SDLRPCParameterNameSeverity]; } - (nullable NSString *)severity { - return [store sdl_objectForName:SDLRPCParameterNameSeverity ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameSeverity ofClass:NSString.class error:nil]; } - (void)setTimeIssued:(nullable SDLDateTime *)timeIssued { - [store sdl_setObject:timeIssued forName:SDLRPCParameterNameTimeIssued]; + [self.store sdl_setObject:timeIssued forName:SDLRPCParameterNameTimeIssued]; } - (nullable SDLDateTime *)timeIssued { - return [store sdl_objectForName:SDLRPCParameterNameTimeIssued ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTimeIssued ofClass:SDLDateTime.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLWeatherData.m b/SmartDeviceLink/SDLWeatherData.m index e10663fab..4be530ec5 100644 --- a/SmartDeviceLink/SDLWeatherData.m +++ b/SmartDeviceLink/SDLWeatherData.m @@ -51,179 +51,179 @@ - (instancetype)initWithCurrentTemperature:(nullable SDLTemperature *)currentTem } - (void)setCurrentTemperature:(nullable SDLTemperature *)currentTemperature { - [store sdl_setObject:currentTemperature forName:SDLRPCParameterNameCurrentTemperature]; + [self.store sdl_setObject:currentTemperature forName:SDLRPCParameterNameCurrentTemperature]; } - (nullable SDLTemperature *)currentTemperature { - return [store sdl_objectForName:SDLRPCParameterNameCurrentTemperature ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCurrentTemperature ofClass:SDLTemperature.class error:nil]; } - (void)setTemperatureHigh:(nullable SDLTemperature *)temperatureHigh { - [store sdl_setObject:temperatureHigh forName:SDLRPCParameterNameTemperatureHigh]; + [self.store sdl_setObject:temperatureHigh forName:SDLRPCParameterNameTemperatureHigh]; } - (nullable SDLTemperature *)temperatureHigh { - return [store sdl_objectForName:SDLRPCParameterNameTemperatureHigh ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTemperatureHigh ofClass:SDLTemperature.class error:nil]; } - (void)setTemperatureLow:(nullable SDLTemperature *)temperatureLow { - [store sdl_setObject:temperatureLow forName:SDLRPCParameterNameTemperatureLow]; + [self.store sdl_setObject:temperatureLow forName:SDLRPCParameterNameTemperatureLow]; } - (nullable SDLTemperature *)temperatureLow { - return [store sdl_objectForName:SDLRPCParameterNameTemperatureLow ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTemperatureLow ofClass:SDLTemperature.class error:nil]; } - (void)setApparentTemperature:(nullable SDLTemperature *)apparentTemperature { - [store sdl_setObject:apparentTemperature forName:SDLRPCParameterNameApparentTemperature]; + [self.store sdl_setObject:apparentTemperature forName:SDLRPCParameterNameApparentTemperature]; } - (nullable SDLTemperature *)apparentTemperature { - return [store sdl_objectForName:SDLRPCParameterNameApparentTemperature ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameApparentTemperature ofClass:SDLTemperature.class error:nil]; } - (void)setApparentTemperatureHigh:(nullable SDLTemperature *)apparentTemperatureHigh { - [store sdl_setObject:apparentTemperatureHigh forName:SDLRPCParameterNameApparentTemperatureHigh]; + [self.store sdl_setObject:apparentTemperatureHigh forName:SDLRPCParameterNameApparentTemperatureHigh]; } - (nullable SDLTemperature *)apparentTemperatureHigh { - return [store sdl_objectForName:SDLRPCParameterNameApparentTemperatureHigh ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameApparentTemperatureHigh ofClass:SDLTemperature.class error:nil]; } - (void)setApparentTemperatureLow:(nullable SDLTemperature *)apparentTemperatureLow { - [store sdl_setObject:apparentTemperatureLow forName:SDLRPCParameterNameApparentTemperatureLow]; + [self.store sdl_setObject:apparentTemperatureLow forName:SDLRPCParameterNameApparentTemperatureLow]; } - (nullable SDLTemperature *)apparentTemperatureLow { - return [store sdl_objectForName:SDLRPCParameterNameApparentTemperatureLow ofClass:SDLTemperature.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameApparentTemperatureLow ofClass:SDLTemperature.class error:nil]; } - (void)setWeatherSummary:(nullable NSString *)weatherSummary { - [store sdl_setObject:weatherSummary forName:SDLRPCParameterNameWeatherSummary]; + [self.store sdl_setObject:weatherSummary forName:SDLRPCParameterNameWeatherSummary]; } - (nullable NSString *)weatherSummary { - return [store sdl_objectForName:SDLRPCParameterNameWeatherSummary ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWeatherSummary ofClass:NSString.class error:nil]; } - (void)setTime:(nullable SDLDateTime *)time { - [store sdl_setObject:time forName:SDLRPCParameterNameTime]; + [self.store sdl_setObject:time forName:SDLRPCParameterNameTime]; } - (nullable SDLDateTime *)time { - return [store sdl_objectForName:SDLRPCParameterNameTime ofClass:SDLDateTime.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameTime ofClass:SDLDateTime.class error:nil]; } - (void)setHumidity:(nullable NSNumber *)humidity { - [store sdl_setObject:humidity forName:SDLRPCParameterNameHumidity]; + [self.store sdl_setObject:humidity forName:SDLRPCParameterNameHumidity]; } - (nullable NSNumber *)humidity { - return [store sdl_objectForName:SDLRPCParameterNameHumidity ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameHumidity ofClass:NSNumber.class error:nil]; } - (void)setCloudCover:(nullable NSNumber *)cloudCover { - [store sdl_setObject:cloudCover forName:SDLRPCParameterNameCloudCover]; + [self.store sdl_setObject:cloudCover forName:SDLRPCParameterNameCloudCover]; } - (nullable NSNumber *)cloudCover { - return [store sdl_objectForName:SDLRPCParameterNameCloudCover ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCloudCover ofClass:NSNumber.class error:nil]; } - (void)setMoonPhase:(nullable NSNumber *)moonPhase { - [store sdl_setObject:moonPhase forName:SDLRPCParameterNameMoonPhase]; + [self.store sdl_setObject:moonPhase forName:SDLRPCParameterNameMoonPhase]; } - (nullable NSNumber *)moonPhase { - return [store sdl_objectForName:SDLRPCParameterNameMoonPhase ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMoonPhase ofClass:NSNumber.class error:nil]; } - (void)setWindBearing:(nullable NSNumber *)windBearing { - [store sdl_setObject:windBearing forName:SDLRPCParameterNameWindBearing]; + [self.store sdl_setObject:windBearing forName:SDLRPCParameterNameWindBearing]; } - (nullable NSNumber *)windBearing { - return [store sdl_objectForName:SDLRPCParameterNameWindBearing ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWindBearing ofClass:NSNumber.class error:nil]; } - (void)setWindGust:(nullable NSNumber *)windGust { - [store sdl_setObject:windGust forName:SDLRPCParameterNameWindGust]; + [self.store sdl_setObject:windGust forName:SDLRPCParameterNameWindGust]; } - (nullable NSNumber *)windGust { - return [store sdl_objectForName:SDLRPCParameterNameWindGust ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWindGust ofClass:NSNumber.class error:nil]; } - (void)setWindSpeed:(nullable NSNumber *)windSpeed { - [store sdl_setObject:windSpeed forName:SDLRPCParameterNameWindSpeed]; + [self.store sdl_setObject:windSpeed forName:SDLRPCParameterNameWindSpeed]; } - (nullable NSNumber *)windSpeed { - return [store sdl_objectForName:SDLRPCParameterNameWindSpeed ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWindSpeed ofClass:NSNumber.class error:nil]; } - (void)setNearestStormBearing:(nullable NSNumber *)nearestStormBearing { - [store sdl_setObject:nearestStormBearing forName:SDLRPCParameterNameNearestStormBearing]; + [self.store sdl_setObject:nearestStormBearing forName:SDLRPCParameterNameNearestStormBearing]; } - (nullable NSNumber *)nearestStormBearing { - return [store sdl_objectForName:SDLRPCParameterNameNearestStormBearing ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNearestStormBearing ofClass:NSNumber.class error:nil]; } - (void)setNearestStormDistance:(nullable NSNumber *)nearestStormDistance { - [store sdl_setObject:nearestStormDistance forName:SDLRPCParameterNameNearestStormDistance]; + [self.store sdl_setObject:nearestStormDistance forName:SDLRPCParameterNameNearestStormDistance]; } - (nullable NSNumber *)nearestStormDistance { - return [store sdl_objectForName:SDLRPCParameterNameNearestStormDistance ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameNearestStormDistance ofClass:NSNumber.class error:nil]; } - (void)setPrecipAccumulation:(nullable NSNumber *)precipAccumulation { - [store sdl_setObject:precipAccumulation forName:SDLRPCParameterNamePrecipAccumulation]; + [self.store sdl_setObject:precipAccumulation forName:SDLRPCParameterNamePrecipAccumulation]; } - (nullable NSNumber *)precipAccumulation { - return [store sdl_objectForName:SDLRPCParameterNamePrecipAccumulation ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePrecipAccumulation ofClass:NSNumber.class error:nil]; } - (void)setPrecipIntensity:(nullable NSNumber *)precipIntensity { - [store sdl_setObject:precipIntensity forName:SDLRPCParameterNamePrecipIntensity]; + [self.store sdl_setObject:precipIntensity forName:SDLRPCParameterNamePrecipIntensity]; } - (nullable NSNumber *)precipIntensity { - return [store sdl_objectForName:SDLRPCParameterNamePrecipIntensity ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePrecipIntensity ofClass:NSNumber.class error:nil]; } - (void)setPrecipProbability:(nullable NSNumber *)precipProbability { - [store sdl_setObject:precipProbability forName:SDLRPCParameterNamePrecipProbability]; + [self.store sdl_setObject:precipProbability forName:SDLRPCParameterNamePrecipProbability]; } - (nullable NSNumber *)precipProbability { - return [store sdl_objectForName:SDLRPCParameterNamePrecipProbability ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePrecipProbability ofClass:NSNumber.class error:nil]; } - (void)setPrecipType:(nullable NSString *)precipType { - [store sdl_setObject:precipType forName:SDLRPCParameterNamePrecipType]; + [self.store sdl_setObject:precipType forName:SDLRPCParameterNamePrecipType]; } - (nullable NSString *)precipType { - return [store sdl_objectForName:SDLRPCParameterNamePrecipType ofClass:NSString.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNamePrecipType ofClass:NSString.class error:nil]; } - (void)setVisibility:(nullable NSNumber *)visibility { - [store sdl_setObject:visibility forName:SDLRPCParameterNameVisibility]; + [self.store sdl_setObject:visibility forName:SDLRPCParameterNameVisibility]; } - (nullable NSNumber *)visibility { - return [store sdl_objectForName:SDLRPCParameterNameVisibility ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameVisibility ofClass:NSNumber.class error:nil]; } - (void)setWeatherIcon:(nullable SDLImage *)weatherIcon { - [store sdl_setObject:weatherIcon forName:SDLRPCParameterNameWeatherIcon]; + [self.store sdl_setObject:weatherIcon forName:SDLRPCParameterNameWeatherIcon]; } - (nullable SDLImage *)weatherIcon { - return [store sdl_objectForName:SDLRPCParameterNameWeatherIcon ofClass:SDLImage.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWeatherIcon ofClass:SDLImage.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLWeatherServiceData.m b/SmartDeviceLink/SDLWeatherServiceData.m index 59ed81be3..60b110e0d 100644 --- a/SmartDeviceLink/SDLWeatherServiceData.m +++ b/SmartDeviceLink/SDLWeatherServiceData.m @@ -42,52 +42,52 @@ - (instancetype)initWithLocation:(SDLLocationDetails *)location currentForecast: } - (void)setLocation:(SDLLocationDetails *)location { - [store sdl_setObject:location forName:SDLRPCParameterNameLocation]; + [self.store sdl_setObject:location forName:SDLRPCParameterNameLocation]; } - (SDLLocationDetails *)location { NSError *error = nil; - return [store sdl_objectForName:SDLRPCParameterNameLocation ofClass:SDLLocationDetails.class error:&error]; + return [self.store sdl_objectForName:SDLRPCParameterNameLocation ofClass:SDLLocationDetails.class error:&error]; } - (void)setCurrentForecast:(nullable SDLWeatherData *)currentForecast { - [store sdl_setObject:currentForecast forName:SDLRPCParameterNameCurrentForecast]; + [self.store sdl_setObject:currentForecast forName:SDLRPCParameterNameCurrentForecast]; } - (nullable SDLWeatherData *)currentForecast { - return [store sdl_objectForName:SDLRPCParameterNameCurrentForecast ofClass:SDLWeatherData.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCurrentForecast ofClass:SDLWeatherData.class error:nil]; } - (void)setMinuteForecast:(nullable NSArray *)minuteForecast { - [store sdl_setObject:minuteForecast forName:SDLRPCParameterNameMinuteForecast]; + [self.store sdl_setObject:minuteForecast forName:SDLRPCParameterNameMinuteForecast]; } - (nullable NSArray *)minuteForecast { - return [store sdl_objectsForName:SDLRPCParameterNameMinuteForecast ofClass:SDLWeatherData.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameMinuteForecast ofClass:SDLWeatherData.class error:nil]; } - (void)setHourlyForecast:(nullable NSArray *)hourlyForecast { - [store sdl_setObject:hourlyForecast forName:SDLRPCParameterNameHourlyForecast]; + [self.store sdl_setObject:hourlyForecast forName:SDLRPCParameterNameHourlyForecast]; } - (nullable NSArray *)hourlyForecast { - return [store sdl_objectsForName:SDLRPCParameterNameHourlyForecast ofClass:SDLWeatherData.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameHourlyForecast ofClass:SDLWeatherData.class error:nil]; } - (void)setMultidayForecast:(nullable NSArray *)multidayForecast { - [store sdl_setObject:multidayForecast forName:SDLRPCParameterNameMultidayForecast]; + [self.store sdl_setObject:multidayForecast forName:SDLRPCParameterNameMultidayForecast]; } - (nullable NSArray *)multidayForecast { - return [store sdl_objectsForName:SDLRPCParameterNameMultidayForecast ofClass:SDLWeatherData.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameMultidayForecast ofClass:SDLWeatherData.class error:nil]; } - (void)setAlerts:(nullable NSArray *)alerts { - [store sdl_setObject:alerts forName:SDLRPCParameterNameAlerts]; + [self.store sdl_setObject:alerts forName:SDLRPCParameterNameAlerts]; } - (nullable NSArray *)alerts { - return [store sdl_objectsForName:SDLRPCParameterNameAlerts ofClass:SDLWeatherAlert.class error:nil]; + return [self.store sdl_objectsForName:SDLRPCParameterNameAlerts ofClass:SDLWeatherAlert.class error:nil]; } @end diff --git a/SmartDeviceLink/SDLWeatherServiceManifest.m b/SmartDeviceLink/SDLWeatherServiceManifest.m index 25da6461b..753a152ed 100644 --- a/SmartDeviceLink/SDLWeatherServiceManifest.m +++ b/SmartDeviceLink/SDLWeatherServiceManifest.m @@ -31,43 +31,43 @@ - (instancetype)initWithCurrentForecastSupported:(BOOL)currentForecastSupported } - (void)setCurrentForecastSupported:(nullable NSNumber *)currentForecastSupported { - [store sdl_setObject:currentForecastSupported forName:SDLRPCParameterNameCurrentForecastSupported]; + [self.store sdl_setObject:currentForecastSupported forName:SDLRPCParameterNameCurrentForecastSupported]; } - (nullable NSNumber *)currentForecastSupported { - return [store sdl_objectForName:SDLRPCParameterNameCurrentForecastSupported ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameCurrentForecastSupported ofClass:NSNumber.class error:nil]; } - (void)setMaxMultidayForecastAmount:(nullable NSNumber *)maxMultidayForecastAmount { - [store sdl_setObject:maxMultidayForecastAmount forName:SDLRPCParameterNameMaxMultidayForecastAmount]; + [self.store sdl_setObject:maxMultidayForecastAmount forName:SDLRPCParameterNameMaxMultidayForecastAmount]; } - (nullable NSNumber *)maxMultidayForecastAmount { - return [store sdl_objectForName:SDLRPCParameterNameMaxMultidayForecastAmount ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMaxMultidayForecastAmount ofClass:NSNumber.class error:nil]; } - (void)setMaxHourlyForecastAmount:(nullable NSNumber *)maxHourlyForecastAmount { - [store sdl_setObject:maxHourlyForecastAmount forName:SDLRPCParameterNameMaxHourlyForecastAmount]; + [self.store sdl_setObject:maxHourlyForecastAmount forName:SDLRPCParameterNameMaxHourlyForecastAmount]; } - (nullable NSNumber *)maxHourlyForecastAmount { - return [store sdl_objectForName:SDLRPCParameterNameMaxHourlyForecastAmount ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMaxHourlyForecastAmount ofClass:NSNumber.class error:nil]; } - (void)setMaxMinutelyForecastAmount:(nullable NSNumber *)maxMinutelyForecastAmount { - [store sdl_setObject:maxMinutelyForecastAmount forName:SDLRPCParameterNameMaxMinutelyForecastAmount]; + [self.store sdl_setObject:maxMinutelyForecastAmount forName:SDLRPCParameterNameMaxMinutelyForecastAmount]; } - (nullable NSNumber *)maxMinutelyForecastAmount { - return [store sdl_objectForName:SDLRPCParameterNameMaxMinutelyForecastAmount ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameMaxMinutelyForecastAmount ofClass:NSNumber.class error:nil]; } - (void)setWeatherForLocationSupported:(nullable NSNumber *)weatherForLocationSupported { - [store sdl_setObject:weatherForLocationSupported forName:SDLRPCParameterNameWeatherForLocationSupported]; + [self.store sdl_setObject:weatherForLocationSupported forName:SDLRPCParameterNameWeatherForLocationSupported]; } - (nullable NSNumber *)weatherForLocationSupported { - return [store sdl_objectForName:SDLRPCParameterNameWeatherForLocationSupported ofClass:NSNumber.class error:nil]; + return [self.store sdl_objectForName:SDLRPCParameterNameWeatherForLocationSupported ofClass:NSNumber.class error:nil]; } @end From b4e84a0985f9552a612afff420439c4765a5ef46 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 14 May 2019 10:47:52 -0400 Subject: [PATCH 038/179] created new class to hold old,new,score to add and delete menu cells smarter using less RPC commands, built basic structure in manager to run the loops --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 8 ++++ SmartDeviceLink/SDLMenuCell.m | 28 +++++++++++ SmartDeviceLink/SDLMenuManager.m | 46 +++++++++++++++++++ SmartDeviceLink/SDLMenuRunScore.h | 29 ++++++++++++ SmartDeviceLink/SDLMenuRunScore.m | 24 ++++++++++ 5 files changed, 135 insertions(+) create mode 100644 SmartDeviceLink/SDLMenuRunScore.h create mode 100644 SmartDeviceLink/SDLMenuRunScore.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 183bfcf37..ddbf02435 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1220,6 +1220,8 @@ 5DF40B26208FA7DE00DD6FDA /* SDLMenuManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */; }; 5DF40B28208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */; }; 5DFFB9151BD7C89700DB3F04 /* SDLConnectionManagerType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */; }; + 756C62762289F11F008B57A2 /* SDLMenuRunScore.h in Headers */ = {isa = PBXBuildFile; fileRef = 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */; }; + 756C62772289F11F008B57A2 /* SDLMenuRunScore.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */; }; 880245A420F79C3400ED195B /* SDLFileManagerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; 880245A520F79C3400ED195B /* SDLFileManagerConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 880245A320F79C3400ED195B /* SDLFileManagerConfiguration.m */; }; 880D267A220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */; }; @@ -2849,6 +2851,8 @@ 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuManagerSpec.m; path = DevAPISpecs/SDLMenuManagerSpec.m; sourceTree = ""; }; 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandManagerSpec.m; path = DevAPISpecs/SDLVoiceCommandManagerSpec.m; sourceTree = ""; }; 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLConnectionManagerType.h; sourceTree = ""; }; + 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuRunScore.h; sourceTree = ""; }; + 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuRunScore.m; sourceTree = ""; }; 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFileManagerConfiguration.h; sourceTree = ""; }; 880245A320F79C3400ED195B /* SDLFileManagerConfiguration.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLFileManagerConfiguration.m; sourceTree = ""; }; 880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherServiceDataSpec.m; sourceTree = ""; }; @@ -3796,6 +3800,8 @@ 5D339CF2207C0ACE000CC364 /* SDLMenuManager.m */, 5DF40B20208E761A00DD6FDA /* SDLVoiceCommandManager.h */, 5DF40B21208E761A00DD6FDA /* SDLVoiceCommandManager.m */, + 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */, + 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */, ); name = Menu; sourceTree = ""; @@ -6375,6 +6381,7 @@ 5D61FC821A84238C00846EE7 /* SDLDeviceInfo.h in Headers */, 5DD60D98221C5D7D00A82A4F /* SDLVersion.h in Headers */, 5D61FCA91A84238C00846EE7 /* SDLFileType.h in Headers */, + 756C62762289F11F008B57A2 /* SDLMenuRunScore.h in Headers */, 8877F5EE1F34A72200DC128A /* SDLSendHapticDataResponse.h in Headers */, DA8966F21E56973700413EAB /* SDLStreamingMediaManagerConstants.h in Headers */, 883C22C8222ED84D00939C4C /* SDLRPCFunctionNames.h in Headers */, @@ -7196,6 +7203,7 @@ 880D267E220DE5DF00B3F496 /* SDLWeatherServiceManifest.m in Sources */, 5D9FC2A21FD8814A00ACA5C2 /* SDLAudioFile.m in Sources */, E9C32B9F1AB20C5900F283AF /* EAAccessoryManager+SDLProtocols.m in Sources */, + 756C62772289F11F008B57A2 /* SDLMenuRunScore.m in Sources */, 5D61FDA81A84238C00846EE7 /* SDLSpeakResponse.m in Sources */, 5DB92D331AC9C8BA00C15BB0 /* SDLRPCStruct.m in Sources */, 1EAA474220355FF3000FE74B /* SDLLightControlCapabilities.m in Sources */, diff --git a/SmartDeviceLink/SDLMenuCell.m b/SmartDeviceLink/SDLMenuCell.m index cc7bfd53c..aaf25b85c 100644 --- a/SmartDeviceLink/SDLMenuCell.m +++ b/SmartDeviceLink/SDLMenuCell.m @@ -12,6 +12,7 @@ NS_ASSUME_NONNULL_BEGIN + @interface SDLMenuCell() @property (assign, nonatomic) UInt32 parentCellId; @@ -58,6 +59,33 @@ - (NSString *)description { return [NSString stringWithFormat:@"SDLMenuCell: %u-\"%@\", artworkName: %@, voice commands: %lu, isSubcell: %@, hasSubcells: %@", (unsigned int)_cellId, _title, _icon.name, (unsigned long)_voiceCommands.count, (_parentCellId != UINT32_MAX ? @"YES" : @"NO"), (_subCells.count > 0 ? @"YES" : @"NO")]; } +#pragma mark - Object Equality + +NSUInteger const NSUIntBitCell = (CHAR_BIT * sizeof(NSUInteger)); +NSUInteger NSUIntRotateCell(NSUInteger val, NSUInteger howMuch) { + return ((((NSUInteger)val) << howMuch) | (((NSUInteger)val) >> (NSUIntBitCell - howMuch))); +} + +- (NSUInteger)hash { + return NSUIntRotateCell(self.title.hash, NSUIntBitCell / 2) + ^ NSUIntRotateCell(self.icon.name.hash, NSUIntBitCell / 3) + ^ NSUIntRotateCell(self.voiceCommands.hash, NSUIntBitCell / 4) + ^ NSUIntRotateCell(self.subCells.hash, NSUIntBitCell / 5); +} + +- (BOOL)isEqual:(id)object { + if (self == object) { return YES; } + if (![object isMemberOfClass:[self class]]) { return NO; } + + return [self isEqualToChoice:(SDLMenuCell *)object]; +} + +- (BOOL)isEqualToChoice:(SDLMenuCell *)choice { + if (choice == nil) { return NO; } + + return (self.hash == choice.hash); +} + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 14bdcccc6..a21a8fdeb 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -29,10 +29,17 @@ #import "SDLRPCResponseNotification.h" #import "SDLSetDisplayLayoutResponse.h" #import "SDLVoiceCommand.h" +#import "SDLMenuRunScore.h" NS_ASSUME_NONNULL_BEGIN +typedef NS_ENUM(NSUInteger, MenuCellState) { + MenuCellStateDelete, + MenuCellStateAdd, + MenuCellStateKeep +}; + @interface SDLMenuCell() @property (assign, nonatomic) UInt32 parentCellId; @@ -146,6 +153,8 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; + //Compare menus and buiild a RunScore object that contains delete commands and add commands. + SDLMenuRunScore *runScore = [self compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; if (artworksToBeUploaded.count > 0) { @@ -162,6 +171,43 @@ - (void)setMenuCells:(NSArray *)menuCells { [self sdl_updateWithCompletionHandler:nil]; } +#pragma mark - Update Menu Cells +- (SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ + //Compare old and new menus + if((!oldMenuCells.count) && updatedMenuCells.count) { + return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[self buildAddStatus:updatedMenuCells] score:0]; + } + + for (int run = 0; run < (int)oldMenuCells.count; run++) { //For each run + // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds + NSMutableArray *oldMenuStatus = [self buildDeleteStatus:oldMenuCells]; + NSMutableArray *newMenuStatus = [self buildAddStatus:updatedMenuCells]; + + int global = 0; + for(int oldCellItems = run; oldCellItems < oldMenuCells.count; oldCellItems++) { + + } + } + + return [SDLMenuRunScore new]; //toUpdate +} + +- (NSMutableArray *)buildDeleteStatus:(NSArray *)oldMenu { + NSMutableArray *oldMenuStatus = [[NSMutableArray alloc] init]; + for(SDLMenuCell *cells in oldMenu) { + [oldMenuStatus addObject:@(MenuCellStateDelete)]; + } + return [oldMenuStatus copy]; +} + +- (NSMutableArray *)buildAddStatus:(NSArray *)newMenu { + NSMutableArray *newMenuStatus = [[NSMutableArray alloc] init]; + for(SDLMenuCell *cells in newMenu) { + [newMenuStatus addObject:@(MenuCellStateAdd)]; + } + return [newMenuStatus copy]; +} + #pragma mark - Updating System - (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { diff --git a/SmartDeviceLink/SDLMenuRunScore.h b/SmartDeviceLink/SDLMenuRunScore.h new file mode 100644 index 000000000..359e20bc6 --- /dev/null +++ b/SmartDeviceLink/SDLMenuRunScore.h @@ -0,0 +1,29 @@ +// +// SDLMenuRunScore.h +// SmartDeviceLink +// +// Created by Justin Gluck on 5/13/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLMenuRunScore : NSObject + +@property (copy, nonatomic, readonly) NSArray *oldStatus; +@property (copy, nonatomic, readonly) NSArray *updatedStatus; +@property (assign, nonatomic, readonly) NSUInteger score; + +- (instancetype)initWithOldStatus:(NSArray *)oldStatus updatedStatus:(NSArray *)updatedStatus score:(NSUInteger)score; + +@end + +NS_ASSUME_NONNULL_END + +//int i = 0; +// +//NSNumber *testNum = @(i); +// +//int testNumInt = testNum.intValue; diff --git a/SmartDeviceLink/SDLMenuRunScore.m b/SmartDeviceLink/SDLMenuRunScore.m new file mode 100644 index 000000000..6a731fa0c --- /dev/null +++ b/SmartDeviceLink/SDLMenuRunScore.m @@ -0,0 +1,24 @@ +// +// SDLMenuRunScore.m +// SmartDeviceLink +// +// Created by Justin Gluck on 5/13/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLMenuRunScore.h" + +@implementation SDLMenuRunScore + +- (instancetype)initWithOldStatus:(NSArray *)oldStatus updatedStatus:(NSArray *)updatedStatus score:(NSUInteger)score { + self = [super init]; + if (!self) { return nil; } + + _oldStatus = oldStatus; + _updatedStatus = updatedStatus; + _score = score; + + return self; +} + +@end From 7fc4b95eec7ce930e8524d66170cef6f7594655b Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 10:59:18 -0400 Subject: [PATCH 039/179] Setting session to nil --- SmartDeviceLink/SDLIAPControlSession.m | 3 +-- SmartDeviceLink/SDLIAPDataSession.m | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 1a8b77e24..ec14b7d39 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -81,8 +81,7 @@ - (void)stopSession { SDLLogD(@"Stopping the control session"); [self.session stop]; self.session.streamDelegate = nil; - - // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. + self.session = nil; } - (void)sdl_destroySession { diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index ab40c635f..4a69f341b 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -72,8 +72,7 @@ - (void)stopSession { SDLLogD(@"Stopping the data session"); [self.session stop]; self.session.streamDelegate = nil; - - // Important - Do not destroy the session as it can a few seconds to close the input and output streams. If set to `nil`, the session will not close properly and a new session with the accessory can not be created. + self.session = nil; } #pragma mark - Data Stream Handlers From 8464d356a5cc404068101dc4b116a9ae9ad12a8b Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 14 May 2019 11:59:55 -0400 Subject: [PATCH 040/179] Fix the unit tests --- .../SDLRPCNotificationNotificationSpec.m | 3 ++ .../SDLRPCRequestNotificationSpec.m | 3 ++ .../SDLRPCResponseNotificationSpec.m | 3 ++ .../MessageSpecs/SDLProtocolSpec.m | 8 ++- .../SDLOnAppInterfaceUnregisteredSpec.m | 3 ++ .../SDLOnAppServiceDataSpec.m | 3 ++ .../NotificationSpecs/SDLOnButtonEventSpec.m | 3 ++ .../NotificationSpecs/SDLOnButtonPressSpec.m | 3 ++ .../NotificationSpecs/SDLOnCommandSpec.m | 3 ++ .../SDLOnDriverDistractionSpec.m | 3 ++ .../SDLOnEncodedSyncPDataSpec.m | 3 ++ .../NotificationSpecs/SDLOnHMIStatusSpec.m | 3 ++ .../NotificationSpecs/SDLOnHashChangeSpec.m | 3 ++ .../SDLOnInteriorVehicleDataSpec.m | 3 ++ .../SDLOnKeyboardInputSpec.m | 3 ++ .../SDLOnLanguageChangeSpec.m | 3 ++ .../SDLOnLockScreenStatusSpec.m | 3 ++ .../SDLOnPermissionsChangeSpec.m | 3 ++ .../NotificationSpecs/SDLOnRCStatusSpec.m | 3 ++ .../NotificationSpecs/SDLOnSyncPDataSpec.m | 3 ++ .../SDLOnSystemCapabilityUpdatedSpec.m | 3 ++ .../SDLOnSystemRequestSpec.m | 3 ++ .../SDLOnTBTClientStateSpec.m | 3 ++ .../NotificationSpecs/SDLOnTouchEventSpec.m | 3 ++ .../NotificationSpecs/SDLOnVehicleDataSpec.m | 3 ++ .../SDLOnWaypointChangeSpec.m | 8 ++- .../RPCSpecs/RequestSpecs/SDLAddCommandSpec.m | 6 ++- .../RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m | 3 ++ .../RequestSpecs/SDLAlertManeuverSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLAlertSpec.m | 6 +++ .../RequestSpecs/SDLButtonPressSpec.m | 3 ++ .../RequestSpecs/SDLChangeRegistrationSpec.m | 7 ++- .../SDLCreateInteractionChoiceSetSpec.m | 3 ++ .../RequestSpecs/SDLDeleteCommandSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLDeleteFileSpec.m | 3 ++ .../SDLDeleteInteractionChoiceSetSpec.m | 3 ++ .../RequestSpecs/SDLDeleteSubMenuSpec.m | 3 ++ .../RequestSpecs/SDLDiagnosticMessageSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLDialNumberSpec.m | 8 ++- .../RequestSpecs/SDLEncodedSyncPDataSpec.m | 3 ++ .../RequestSpecs/SDLGetAppServiceDataSpec.m | 3 ++ .../SDLGetCloudAppPropertiesSpec.m | 4 +- .../RPCSpecs/RequestSpecs/SDLGetDTCsSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLGetFileSpec.m | 3 ++ .../SDLGetInteriorVehicleDataSpec.m | 3 ++ .../SDLGetSystemCapabilitiesSpec.m | 3 ++ .../RequestSpecs/SDLGetSystemCapabilitySpec.m | 3 ++ .../RequestSpecs/SDLGetVehicleDataSpec.m | 3 ++ .../RequestSpecs/SDLGetWaypointsSpec.m | 3 ++ .../SDLPerformAppServiceInteractionSpec.m | 3 ++ .../SDLPerformAudioPassThruSpec.m | 3 ++ .../RequestSpecs/SDLPerformInteractionSpec.m | 3 ++ .../RequestSpecs/SDLPublishAppServiceSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLPutFileSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLReadDIDSpec.m | 3 ++ .../SDLRegisterAppInterfaceSpec.m | 6 +++ .../SDLResetGlobalPropertiesSpec.m | 3 ++ .../RequestSpecs/SDLScrollableMessageSpec.m | 3 ++ .../RequestSpecs/SDLSendHapticDataSpec.m | 3 ++ .../RequestSpecs/SDLSendLocationSpec.m | 8 ++- .../RPCSpecs/RequestSpecs/SDLSetAppIconSpec.m | 3 ++ .../SDLSetCloudAppPropertiesSpec.m | 3 ++ .../RequestSpecs/SDLSetDisplayLayoutSpec.m | 3 ++ .../RequestSpecs/SDLSetGlobalPropertiesSpec.m | 3 ++ .../SDLSetInteriorVehicleDataSpec.m | 3 ++ .../RequestSpecs/SDLSetMediaClockTimerSpec.m | 3 ++ .../RequestSpecs/SDLShowConstantTBTSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLShowSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLSliderSpec.m | 3 ++ .../RPCSpecs/RequestSpecs/SDLSpeakSpec.m | 3 ++ .../RequestSpecs/SDLSubscribeButtonSpec.m | 3 ++ .../SDLSubscribeVehicleDataSpec.m | 3 ++ .../RequestSpecs/SDLSystemRequestSpec.m | 3 ++ .../RequestSpecs/SDLUnsubscribeButtonSpec.m | 3 ++ .../SDLUnsubscribeVehicleDataSpec.m | 3 ++ .../RequestSpecs/SDLUpdateTurnListSpec.m | 3 ++ .../ResponseSpecs/SDLDeleteFileResponseSpec.m | 3 ++ .../SDLDiagnosticMessageResponseSpec.m | 3 ++ .../SDLGetAppServiceDataResponseSpec.m | 3 ++ .../SDLGetCloudAppPropertiesResponseSpec.m | 3 ++ .../ResponseSpecs/SDLGetDTCsResponseSpec.m | 3 ++ .../ResponseSpecs/SDLGetFileResponseSpec.m | 3 ++ .../SDLGetInteriorVehicleDataResponseSpec.m | 3 ++ .../SDLGetSystemCapabilityResponseSpec.m | 3 ++ .../SDLGetVehicleDataResponseSpec.m | 3 ++ .../SDLGetWaypointsResponseSpec.m | 8 ++- .../ResponseSpecs/SDLListFilesResponseSpec.m | 3 ++ ...PerformAppServiceInteractionResponseSpec.m | 3 ++ .../SDLPerformInteractionResponseSpec.m | 3 ++ .../SDLPublishAppServiceResponseSpec.m | 3 ++ .../ResponseSpecs/SDLPutFileResponseSpec.m | 3 ++ .../ResponseSpecs/SDLReadDIDResponseSpec.m | 3 ++ .../SDLRegisterAppInterfaceResponseSpec.m | 6 +++ .../SDLSetCloudAppPropertiesResponseSpec.m | 3 ++ .../SDLSetDisplayLayoutResponseSpec.m | 3 ++ .../SDLSetInteriorVehicleDataResponseSpec.m | 3 ++ .../ResponseSpecs/SDLSliderResponseSpec.m | 3 ++ .../SDLSubscribeVehicleDataResponseSpec.m | 3 ++ .../SDLUnsubscribeVehicleDataResponseSpec.m | 3 ++ .../StructSpecs/SDLAirbagStatusSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLAppInfoSpec.m | 3 ++ .../StructSpecs/SDLAppServiceCapabilitySpec.m | 7 ++- .../StructSpecs/SDLAppServiceDataSpec.m | 3 ++ .../StructSpecs/SDLAppServiceManifestSpec.m | 3 ++ .../StructSpecs/SDLAppServiceRecordSpec.m | 6 +++ .../SDLAppServicesCapabilitiesSpec.m | 6 +++ .../SDLAudioControlCapabilitiesSpec.m | 3 ++ .../StructSpecs/SDLAudioControlDataSpec.m | 3 ++ .../SDLAudioPassThruCapabilitiesSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLBeltStatusSpec.m | 3 ++ .../StructSpecs/SDLBodyInformationSpec.m | 3 ++ .../StructSpecs/SDLButtonCapabilitiesSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLChoiceSpec.m | 3 ++ .../SDLClimateControlCapabilitiesSpec.m | 3 ++ .../StructSpecs/SDLClimateControlDataSpec.m | 5 +- .../StructSpecs/SDLCloudAppPropertiesSpec.m | 3 ++ .../StructSpecs/SDLClusterModeStatusSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLDIDResult.m | 3 ++ .../RPCSpecs/StructSpecs/SDLDateTimeSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLDeviceInfoSpec.m | 3 ++ .../StructSpecs/SDLDeviceStatusSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLECallInfoSpec.m | 3 ++ .../StructSpecs/SDLEmergencyEventSpec.m | 3 ++ .../StructSpecs/SDLEqualizerSettingsSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLFuelRangeSpec.m | 4 +- .../RPCSpecs/StructSpecs/SDLGPSDataSpec.m | 3 ++ .../StructSpecs/SDLHMICapabilitiesSpec.m | 3 ++ .../StructSpecs/SDLHMIPermissionsSpec.m | 3 ++ .../SDLHMISettingsControlCapabilitiesSpec.m | 3 ++ .../SDLHMISettingsControlDataSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLHapticRectSpec.m | 3 ++ .../StructSpecs/SDLHeadLampStatusSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLImageFieldSpec.m | 3 ++ .../StructSpecs/SDLImageResolutionSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLImageSpec.m | 3 ++ .../StructSpecs/SDLKeyboardPropertiesSpec.m | 3 ++ .../StructSpecs/SDLLightCapabilitiesSpec.m | 3 ++ .../SDLLightControlCapabilitiesSpec.m | 4 +- .../StructSpecs/SDLLightControlDataSpec.m | 4 +- .../RPCSpecs/StructSpecs/SDLLightStateSpec.m | 3 ++ .../StructSpecs/SDLLocationCoordinateSpec.m | 8 ++- .../StructSpecs/SDLLocationDetailsSpec.m | 8 ++- .../SDLMassageCushionFirmnessSpec.m | 3 ++ .../StructSpecs/SDLMassageModeDataSpec.m | 3 ++ .../StructSpecs/SDLMediaServiceDataSpec.m | 3 ++ .../StructSpecs/SDLMediaServiceManifestSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLMenuParamsSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLModuleDataSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLMyKeySpec.m | 3 ++ .../StructSpecs/SDLNavigationCapabilitySpec.m | 3 ++ .../SDLNavigationInstructionSpec.m | 3 ++ .../SDLNavigationServiceDataSpec.m | 3 ++ .../SDLNavigationServiceManifestSpec.m | 3 ++ .../StructSpecs/SDLOasisAddressSpec.m | 3 ++ .../StructSpecs/SDLParameterPermissionsSpec.m | 3 ++ .../StructSpecs/SDLPermissionItemSpec.m | 3 ++ .../StructSpecs/SDLPhoneCapabilitySpec.m | 3 ++ .../SDLPresetBankCapabilitiesSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLRDSDataSpec.m | 6 ++- .../RPCSpecs/StructSpecs/SDLRGBColorSpec.m | 3 ++ .../SDLRadioControlCapabilitiesSpec.m | 3 ++ .../StructSpecs/SDLRadioControlDataSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLRectangleSpec.m | 3 ++ .../SDLRemoteControlCapabilitiesSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLSISDataSpec.m | 4 +- .../StructSpecs/SDLScreenParamsSpec.m | 3 ++ .../SDLSeatControlCapabilitiesSpec.m | 3 ++ .../StructSpecs/SDLSeatControlDataSpec.m | 3 ++ .../StructSpecs/SDLSeatMemoryActionSpec.m | 3 ++ .../StructSpecs/SDLSingleTireStatusSpec.m | 3 ++ .../SDLSoftButtonCapabilitiesSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLSoftButtonSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLStartTimeSpec.m | 3 ++ .../StructSpecs/SDLStationIDNumberSpec.m | 4 +- .../StructSpecs/SDLSyncMsgVersionSpec.m | 3 ++ .../StructSpecs/SDLSystemCapabilitySpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTTSChunkSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTemperatureSpec.m | 3 ++ .../StructSpecs/SDLTemplateColorSchemeSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTextFieldSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTireStatusSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTouchCoordSpec.m | 3 ++ .../SDLTouchEventCapabilitiesSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTouchEventSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLTurnSpec.m | 3 ++ .../StructSpecs/SDLVehicleDataResultSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m | 3 ++ .../SDLVideoStreamingCapabilitySpec.m | 4 +- .../StructSpecs/SDLVideoStreamingFormatSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLVrHelpItemSpec.m | 3 ++ .../StructSpecs/SDLWeatherAlertSpec.m | 3 ++ .../RPCSpecs/StructSpecs/SDLWeatherDataSpec.m | 3 ++ .../StructSpecs/SDLWeatherServiceDataSpec.m | 6 +++ .../SDLWeatherServiceManifestSpec.m | 3 ++ .../SuperclassSpecs/SDLRPCMessageSpec.m | 52 ++++++++++++++++--- .../SuperclassSpecs/SDLRPCRequestSpec.m | 5 +- .../SuperclassSpecs/SDLRPCResponseSpec.m | 8 ++- .../SuperclassSpecs/SDLRPCStructSpec.m | 3 ++ 198 files changed, 690 insertions(+), 36 deletions(-) diff --git a/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCNotificationNotificationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCNotificationNotificationSpec.m index 307e45d81..c1ed2e966 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCNotificationNotificationSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCNotificationNotificationSpec.m @@ -21,7 +21,10 @@ __block NSString *testName = nil; beforeEach(^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testNotification = [[SDLOnCommand alloc] initWithName:@"testNotification"]; +#pragma clang diagnostic pop testName = SDLDidReceiveCommandNotification; }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCRequestNotificationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCRequestNotificationSpec.m index 4751c9361..b317f00f8 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCRequestNotificationSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCRequestNotificationSpec.m @@ -21,7 +21,10 @@ __block NSString *testName = nil; beforeEach(^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLAddCommand alloc] initWithName:@"testRequest"]; +#pragma clang diagnostic pop testName = SDLDidReceiveAddCommandResponse; }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCResponseNotificationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCResponseNotificationSpec.m index a0aaf3b08..14349a7fa 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCResponseNotificationSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/Notification Tests/SDLRPCResponseNotificationSpec.m @@ -20,7 +20,10 @@ __block NSString *testName = nil; beforeEach(^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testResponse = [[SDLAddCommandResponse alloc] initWithName:@"testResponse"]; +#pragma clang diagnostic pop testName = SDLDidReceiveAddCommandRequest; }); diff --git a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m index a087dc86f..579658c79 100644 --- a/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m +++ b/SmartDeviceLinkTests/ProtocolSpecs/MessageSpecs/SDLProtocolSpec.m @@ -215,7 +215,10 @@ context(@"During V1 session", ^ { it(@"Should send the correct data", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" [[[[mockRequest stub] andReturn:dictionaryV1] ignoringNonObjectArgs] serializeAsDictionary:1]; +#pragma clang diagnostic pop SDLProtocol* testProtocol = [[SDLProtocol alloc] init]; SDLV1ProtocolHeader *testHeader = [[SDLV1ProtocolHeader alloc] init]; @@ -252,9 +255,12 @@ context(@"During V2 session", ^ { it(@"Should send the correct data bulk data when bulk data is available", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" [[[[mockRequest stub] andReturn:dictionaryV2] ignoringNonObjectArgs] serializeAsDictionary:2]; +#pragma clang diagnostic pop [[[mockRequest stub] andReturn:@0x98765] correlationID]; - [[[mockRequest stub] andReturn:@"DeleteCommand"] getFunctionName]; + [[[mockRequest stub] andReturn:@"DeleteCommand"] name]; [[[mockRequest stub] andReturn:[NSData dataWithBytes:"COMMAND" length:strlen("COMMAND")]] bulkData]; SDLProtocol* testProtocol = [[SDLProtocol alloc] init]; diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppInterfaceUnregisteredSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppInterfaceUnregisteredSpec.m index fd5980b58..334e9fe8b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppInterfaceUnregisteredSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppInterfaceUnregisteredSpec.m @@ -29,7 +29,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameReason:SDLAppInterfaceUnregisteredReasonAppUnauthorized}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnAppInterfaceUnregistered}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnAppInterfaceUnregistered* testNotification = [[SDLOnAppInterfaceUnregistered alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.reason).to(equal(SDLAppInterfaceUnregisteredReasonAppUnauthorized)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppServiceDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppServiceDataSpec.m index b5fe3fff0..35e43e2ab 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppServiceDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnAppServiceDataSpec.m @@ -37,7 +37,10 @@ SDLRPCParameterNameServiceData:testAppServiceData }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnAppServiceData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnAppServiceData *testNotification = [[SDLOnAppServiceData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.serviceData).to(equal(testAppServiceData)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonEventSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonEventSpec.m index 2a298eb5e..55d11cc3f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonEventSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonEventSpec.m @@ -37,7 +37,10 @@ SDLRPCParameterNameButtonEventMode:SDLButtonEventModeButtonDown, SDLRPCParameterNameCustomButtonId:@4252}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnButtonEvent}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnButtonEvent* testNotification = [[SDLOnButtonEvent alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.buttonName).to(equal(SDLButtonNameCustomButton)); expect(testNotification.buttonEventMode).to(equal(SDLButtonEventModeButtonDown)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonPressSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonPressSpec.m index 1b098318b..4bc510738 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonPressSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnButtonPressSpec.m @@ -37,7 +37,10 @@ SDLRPCParameterNameButtonPressMode:SDLButtonPressModeLong, SDLRPCParameterNameCustomButtonId:@5642}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnButtonPress}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnButtonPress* testNotification = [[SDLOnButtonPress alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.buttonName).to(equal(SDLButtonNameCustomButton)); expect(testNotification.buttonPressMode).to(equal(SDLButtonPressModeLong)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnCommandSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnCommandSpec.m index aac8b32b1..d815683b1 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnCommandSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnCommandSpec.m @@ -32,7 +32,10 @@ @{SDLRPCParameterNameCommandId:@5676544, SDLRPCParameterNameTriggerSource:SDLTriggerSourceKeyboard}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnCommand}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnCommand* testNotification = [[SDLOnCommand alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.cmdID).to(equal(@5676544)); expect(testNotification.triggerSource).to(equal(SDLTriggerSourceKeyboard)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnDriverDistractionSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnDriverDistractionSpec.m index b03394532..b242c0a3a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnDriverDistractionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnDriverDistractionSpec.m @@ -29,7 +29,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameState:SDLDriverDistractionStateOn}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnDriverDistraction}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnDriverDistraction* testNotification = [[SDLOnDriverDistraction alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.state).to(equal(SDLDriverDistractionStateOn)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnEncodedSyncPDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnEncodedSyncPDataSpec.m index c2760571d..9078bbf16 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnEncodedSyncPDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnEncodedSyncPDataSpec.m @@ -34,7 +34,10 @@ SDLRPCParameterNameURLUppercase:@"www.zombo.com", SDLRPCParameterNameTimeoutCapitalized:@564}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnEncodedSyncPData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnEncodedSyncPData* testNotification = [[SDLOnEncodedSyncPData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.data).to(equal([@[@"0"] mutableCopy])); expect(testNotification.URL).to(equal(@"www.zombo.com")); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m index c3aca6127..61b1165d3 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHMIStatusSpec.m @@ -41,7 +41,10 @@ SDLRPCParameterNameSystemContext: SDLSystemContextHMIObscured, SDLRPCParameterNameVideoStreamingState: SDLVideoStreamingStateStreamable}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnHMIStatus}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnHMIStatus* testNotification = [[SDLOnHMIStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.hmiLevel).to(equal(SDLHMILevelLimited)); expect(testNotification.audioStreamingState).to(equal(SDLAudioStreamingStateAttenuated)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHashChangeSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHashChangeSpec.m index 035afda9d..b76ef13fc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHashChangeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnHashChangeSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameHashId:@"hash"}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnHashChange}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnHashChange* testNotification = [[SDLOnHashChange alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.hashID).to(equal(@"hash")); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnInteriorVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnInteriorVehicleDataSpec.m index 45ae4c993..1afa25d05 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnInteriorVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnInteriorVehicleDataSpec.m @@ -35,7 +35,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameModuleData:someModuleData}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnInteriorVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnInteriorVehicleData* testNotification = [[SDLOnInteriorVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.moduleData).to(equal(someModuleData)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnKeyboardInputSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnKeyboardInputSpec.m index baec5f3c7..899ccf768 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnKeyboardInputSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnKeyboardInputSpec.m @@ -32,7 +32,10 @@ @{SDLRPCParameterNameEvent:SDLKeyboardEventSubmitted, SDLRPCParameterNameData:@"qwertyg"}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnKeyboardInput}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnKeyboardInput* testNotification = [[SDLOnKeyboardInput alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.event).to(equal(SDLKeyboardEventSubmitted)); expect(testNotification.data).to(equal(@"qwertyg")); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLanguageChangeSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLanguageChangeSpec.m index c8e589a54..d371737a1 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLanguageChangeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLanguageChangeSpec.m @@ -33,7 +33,10 @@ @{SDLRPCParameterNameLanguage:SDLLanguageEsEs, SDLRPCParameterNameHMIDisplayLanguage:SDLLanguageDeDe}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnLanguageChange}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnLanguageChange* testNotification = [[SDLOnLanguageChange alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.language).to(equal(SDLLanguageEsEs)); expect(testNotification.hmiDisplayLanguage).to(equal(SDLLanguageDeDe)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLockScreenStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLockScreenStatusSpec.m index 3355797d8..cd12a3d46 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLockScreenStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnLockScreenStatusSpec.m @@ -39,7 +39,10 @@ @"OnLockScreenStatus":SDLLockScreenStatusRequired, @"hmiLevel":SDLHMILevelNone}, SDLRPCParameterNameOperationName:@"OnLockScreenStatus"}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnLockScreenStatus* testNotification = [[SDLOnLockScreenStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.driverDistractionStatus).to(equal(@NO)); expect(testNotification.userSelected).to(equal(@3)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnPermissionsChangeSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnPermissionsChangeSpec.m index 70e5c103a..d0d8e07d5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnPermissionsChangeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnPermissionsChangeSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNamePermissionItem:[@[item] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnPermissionsChange}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnPermissionsChange* testNotification = [[SDLOnPermissionsChange alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.permissionItem).to(equal([@[item] mutableCopy])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m index 584bcd3ec..618950bd0 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnRCStatusSpec.m @@ -36,7 +36,10 @@ SDLRPCParameterNameAllowed:@YES }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnRCStatus}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnRCStatus* testNotification = [[SDLOnRCStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.allowed).to(equal(@YES)); expect(testNotification.allocatedModules).to(equal([@[allocatedModule] copy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSyncPDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSyncPDataSpec.m index 89f0d5b7e..197b77fbe 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSyncPDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSyncPDataSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameURLUppercase:@"https://www.youtube.com/watch?v=ygr5AHufBN4", SDLRPCParameterNameTimeoutCapitalized:@8357}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnSyncPData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnSyncPData* testNotification = [[SDLOnSyncPData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.URL).to(equal(@"https://www.youtube.com/watch?v=ygr5AHufBN4")); expect(testNotification.Timeout).to(equal(@8357)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemCapabilityUpdatedSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemCapabilityUpdatedSpec.m index b6102042d..2c1844a80 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemCapabilityUpdatedSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemCapabilityUpdatedSpec.m @@ -38,7 +38,10 @@ SDLRPCParameterNameSystemCapability:testSystemCapability }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnSystemCapabilityUpdated}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnSystemCapabilityUpdated *testNotification = [[SDLOnSystemCapabilityUpdated alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.systemCapability).to(equal(testSystemCapability)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m index 3acaee1ac..63b2bbd58 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnSystemRequestSpec.m @@ -49,7 +49,10 @@ SDLRPCParameterNameOffset:@2532678684, SDLRPCParameterNameLength:@50000000000}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnSystemRequest}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnSystemRequest* testNotification = [[SDLOnSystemRequest alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.requestType).to(equal(SDLRequestTypeFileResume)); expect(testNotification.requestSubType).to(equal(@"subtype")); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTBTClientStateSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTBTClientStateSpec.m index f0a39c387..fdbe9039c 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTBTClientStateSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTBTClientStateSpec.m @@ -30,7 +30,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameState:SDLTBTStateETARequest}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnTBTClientState}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnTBTClientState* testNotification = [[SDLOnTBTClientState alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.state).to(equal(SDLTBTStateETARequest)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTouchEventSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTouchEventSpec.m index 6445c2e64..72377a740 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTouchEventSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnTouchEventSpec.m @@ -36,7 +36,10 @@ @{SDLRPCParameterNameType:SDLTouchTypeBegin, SDLRPCParameterNameEvent:[@[event] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnTouchEvent}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnTouchEvent* testNotification = [[SDLOnTouchEvent alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.type).to(equal(SDLTouchTypeBegin)); expect(testNotification.event).to(equal([@[event] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m index d28a9c843..d835c5f9b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnVehicleDataSpec.m @@ -146,7 +146,10 @@ SDLRPCParameterNameVIN:@"222222222722", SDLRPCParameterNameWiperStatus:SDLWiperStatusStalled}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnVehicleData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOnVehicleData* testNotification = [[SDLOnVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testNotification.accPedalPosition).to(equal(@99.99999999)); expect(testNotification.airbagStatus).to(equal(airbag)); diff --git a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnWaypointChangeSpec.m b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnWaypointChangeSpec.m index 94e319360..48a9b5668 100644 --- a/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnWaypointChangeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/NotificationSpecs/SDLOnWaypointChangeSpec.m @@ -71,8 +71,10 @@ }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameOnWayPointChange }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testNotification = [[SDLOnWayPointChange alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); // Since all the properties are immutable, a copy should be executed as a retain, which means they should be identical @@ -89,8 +91,10 @@ SDLRPCParameterNameParameters: @{} } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testNotification = [[SDLOnWayPointChange alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); it(@"should return nil for waypoints", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m index 7d7d3214c..c89033af5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddCommandSpec.m @@ -42,9 +42,11 @@ SDLRPCParameterNameVRCommands:[@[@"name", @"anotherName"] mutableCopy], SDLRPCParameterNameCommandIcon:image}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameAddCommand}} mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAddCommand* testRequest = [[SDLAddCommand alloc] initWithDictionary:dict]; - +#pragma clang diagnostic pop + expect(testRequest.cmdID).to(equal(@434577)); expect(testRequest.menuParams).to(equal(menu)); expect(testRequest.vrCommands).to(equal([@[@"name", @"anotherName"] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m index 28584c689..2efd1eee2 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAddSubMenuSpec.m @@ -80,7 +80,10 @@ } }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameAddSubMenu}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAddSubMenu* testRequest = [[SDLAddSubMenu alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.menuID).to(equal(@(menuId))); expect(testRequest.position).to(equal(@(position))); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertManeuverSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertManeuverSpec.m index 63ee96868..a17065993 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertManeuverSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertManeuverSpec.m @@ -36,7 +36,10 @@ @{SDLRPCParameterNameTTSChunks:[@[tts] mutableCopy], SDLRPCParameterNameSoftButtons:[@[button] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameAlertManeuver}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAlertManeuver* testRequest = [[SDLAlertManeuver alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.ttsChunks).to(equal([@[tts] mutableCopy])); expect(testRequest.softButtons).to(equal([@[button] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertSpec.m index 58d6c6fe5..27d853822 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLAlertSpec.m @@ -54,7 +54,10 @@ SDLRPCParameterNameProgressIndicator:@NO, SDLRPCParameterNameSoftButtons:[@[button] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameAlert}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAlert* testRequest = [[SDLAlert alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.alertText1).to(equal(@"alert#1")); expect(testRequest.alertText2).to(equal(@"alert#2")); @@ -78,7 +81,10 @@ SDLRPCParameterNameProgressIndicator:@NO, SDLRPCParameterNameSoftButtons:[NSNull null]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameAlert}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAlert* testRequest = [[SDLAlert alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expectAction(^{ NSArray *softButtons = testRequest.softButtons; }).to(raiseException()); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLButtonPressSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLButtonPressSpec.m index fc22e5c54..648d4cbc9 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLButtonPressSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLButtonPressSpec.m @@ -38,7 +38,10 @@ SDLRPCParameterNameButtonName : SDLButtonNameAC, SDLRPCParameterNameButtonPressMode : SDLButtonPressModeShort}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameButtonPress}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLButtonPress* testRequest = [[SDLButtonPress alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.moduleType).to(equal(SDLModuleTypeClimate)); expect(testRequest.buttonName).to(equal(SDLButtonNameAC)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLChangeRegistrationSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLChangeRegistrationSpec.m index 40ada9d6f..8fac41395 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLChangeRegistrationSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLChangeRegistrationSpec.m @@ -122,8 +122,10 @@ SDLRPCParameterNameNGNMediaScreenAppName:someNGNMediaAppName, SDLRPCParameterNameVRSynonyms:someVRSynonyms}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameChangeRegistration}} mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLChangeRegistration alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop }); // Since the properties are immutable, a copy should be executed as a retain, so they should be identical @@ -154,7 +156,10 @@ context(@"when no parameters are set", ^{ beforeEach(^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLChangeRegistration alloc] initWithDictionary:[NSMutableDictionary dictionary]]; +#pragma clang diagnostic pop }); it(@"Should return nil if for language", ^ { diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLCreateInteractionChoiceSetSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLCreateInteractionChoiceSetSpec.m index 973189701..c4c20ea47 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLCreateInteractionChoiceSetSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLCreateInteractionChoiceSetSpec.m @@ -34,7 +34,10 @@ @{SDLRPCParameterNameInteractionChoiceSetId:@141414, SDLRPCParameterNameChoiceSet:[@[choice] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameCreateInteractionChoiceSet}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLCreateInteractionChoiceSet* testRequest = [[SDLCreateInteractionChoiceSet alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.interactionChoiceSetID).to(equal(@141414)); expect(testRequest.choiceSet).to(equal([@[choice] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteCommandSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteCommandSpec.m index fc275fd96..42b036672 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteCommandSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteCommandSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameCommandId:@11223344}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDeleteCommand}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeleteCommand* testRequest = [[SDLDeleteCommand alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.cmdID).to(equal(@11223344)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteFileSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteFileSpec.m index bb07a874d..50e5d2af3 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteFileSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteFileSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameSyncFileName:@"synchro"}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDeleteFile}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeleteFile* testRequest = [[SDLDeleteFile alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.syncFileName).to(equal(@"synchro")); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteInteractionChoiceSetSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteInteractionChoiceSetSpec.m index 81e6f9d2c..a06bd3836 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteInteractionChoiceSetSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteInteractionChoiceSetSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameInteractionChoiceSetId:@20314}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDeleteInteractionChoiceSet}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeleteInteractionChoiceSet* testRequest = [[SDLDeleteInteractionChoiceSet alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.interactionChoiceSetID).to(equal(@20314)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteSubMenuSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteSubMenuSpec.m index 5f628f745..1a71c63f8 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteSubMenuSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDeleteSubMenuSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameMenuId:@25614}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDeleteSubMenu}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeleteSubMenu* testRequest = [[SDLDeleteSubMenu alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.menuID).to(equal(@25614)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDiagnosticMessageSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDiagnosticMessageSpec.m index bd75d5853..045840b41 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDiagnosticMessageSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDiagnosticMessageSpec.m @@ -34,7 +34,10 @@ SDLRPCParameterNameMessageLength:@55555, SDLRPCParameterNameMessageData:[@[@1, @4, @16, @64] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDiagnosticMessage}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDiagnosticMessage* testRequest = [[SDLDiagnosticMessage alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.targetID).to(equal(@3562)); expect(testRequest.messageLength).to(equal(@55555)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDialNumberSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDialNumberSpec.m index 100b6786e..dcb2c211c 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDialNumberSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLDialNumberSpec.m @@ -49,8 +49,10 @@ } } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLDialNumber alloc] initWithDictionary:[initDict mutableCopy]]; +#pragma clang diagnostic pop }); it(@"should get 'number' correctly", ^{ @@ -67,8 +69,10 @@ } } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLDialNumber alloc] initWithDictionary:[initDict mutableCopy]]; +#pragma clang diagnostic pop }); it(@"should return nil for number", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLEncodedSyncPDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLEncodedSyncPDataSpec.m index d838bcebb..95d110a1f 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLEncodedSyncPDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLEncodedSyncPDataSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameData:[@[@"2", @"2", @"2"] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameEncodedSyncPData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLEncodedSyncPData* testRequest = [[SDLEncodedSyncPData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.data).to(equal([@[@"2", @"2", @"2"] mutableCopy])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetAppServiceDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetAppServiceDataSpec.m index a217223a8..a02387d79 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetAppServiceDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetAppServiceDataSpec.m @@ -43,7 +43,10 @@ SDLRPCParameterNameSubscribe:@(testSubscribe) }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetAppServiceData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetAppServiceData *testRequest = [[SDLGetAppServiceData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.serviceType).to(equal(testServiceType)); expect(testRequest.subscribe).to(beTrue()); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetCloudAppPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetCloudAppPropertiesSpec.m index 37c1810a2..b831c1f00 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetCloudAppPropertiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetCloudAppPropertiesSpec.m @@ -37,10 +37,12 @@ SDLRPCParameterNameAppId:testAppID }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetCloudAppProperties}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetCloudAppProperties *testRequest = [[SDLGetCloudAppProperties alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.appID).to(equal(testAppID)); - expect(testRequest.getFunctionName).to(equal(SDLRPCFunctionNameGetCloudAppProperties)); }); it(@"Should initialize correctly with the convenience init", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetDTCsSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetDTCsSpec.m index 25e489c46..b1b4cb5df 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetDTCsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetDTCsSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameECUName:@4321, SDLRPCParameterNameDTCMask:@22}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameEndAudioPassThru}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetDTCs* testRequest = [[SDLGetDTCs alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.ecuName).to(equal(@4321)); expect(testRequest.dtcMask).to(equal(@22)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetFileSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetFileSpec.m index f2f25dfbc..ba594e259 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetFileSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetFileSpec.m @@ -54,7 +54,10 @@ SDLRPCParameterNameLength:@(testLength) }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetFile}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetFile *testRequest = [[SDLGetFile alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.fileName).to(equal(testFileName)); expect(testRequest.appServiceId).to(equal(testAppServiceId)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetInteriorVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetInteriorVehicleDataSpec.m index 600c9826b..d3ed4c409 100755 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetInteriorVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetInteriorVehicleDataSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameModuleType : SDLModuleTypeRadio, SDLRPCParameterNameSubscribe : @YES}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetInteriorVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetInteriorVehicleData* testRequest = [[SDLGetInteriorVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.moduleType).to(equal(SDLModuleTypeRadio)); expect(testRequest.subscribe).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitiesSpec.m index a5cbac428..13f9f156a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitiesSpec.m @@ -28,7 +28,10 @@ } } }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetSystemCapability *testRequest = [[SDLGetSystemCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.systemCapabilityType).to(equal(SDLSystemCapabilityTypePhoneCall)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitySpec.m index 77d175818..3fe6ca695 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetSystemCapabilitySpec.m @@ -49,7 +49,10 @@ SDLRPCParameterNameSubscribe:@(testSubcribe) }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetSystemCapability}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetSystemCapability *testRequest = [[SDLGetSystemCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.systemCapabilityType).to(equal(testSystemCapabilityType)); expect(testRequest.subscribe).to(beFalse()); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m index 4945d87fd..eab7f6210 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetVehicleDataSpec.m @@ -112,7 +112,10 @@ SDLRPCParameterNameTurnSignal:@NO, SDLRPCParameterNameWiperStatus:@YES}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetVehicleData* testRequest = [[SDLGetVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.accPedalPosition).to(equal(@YES)); expect(testRequest.airbagStatus).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetWaypointsSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetWaypointsSpec.m index 3b0c706c3..f22c4722e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetWaypointsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLGetWaypointsSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameWayPointType:SDLWayPointTypeAll}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetWayPoints}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetWayPoints* testRequest = [[SDLGetWayPoints alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.waypointType).to(equal(SDLWayPointTypeAll)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAppServiceInteractionSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAppServiceInteractionSpec.m index 7d5cde77a..56b4b7584 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAppServiceInteractionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAppServiceInteractionSpec.m @@ -50,7 +50,10 @@ SDLRPCParameterNameRequestServiceActive:@(testRequestServiceActive) }, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePerformAppServiceInteraction}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPerformAppServiceInteraction *testRequest = [[SDLPerformAppServiceInteraction alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.serviceUri).to(equal(testServiceUri)); expect(testRequest.serviceID).to(equal(testServiceID)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAudioPassThruSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAudioPassThruSpec.m index ec8799689..539fbe77a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAudioPassThruSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformAudioPassThruSpec.m @@ -50,7 +50,10 @@ SDLRPCParameterNameAudioType:SDLAudioTypePCM, SDLRPCParameterNameMuteAudio:@NO}, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePerformAudioPassThru}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPerformAudioPassThru* testRequest = [[SDLPerformAudioPassThru alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.audioPassThruDisplayText1).to(equal(@"passthru#1")); expect(testRequest.audioPassThruDisplayText2).to(equal(@"passthru#2")); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformInteractionSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformInteractionSpec.m index 6c905afbe..6424d27f7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformInteractionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPerformInteractionSpec.m @@ -61,7 +61,10 @@ SDLRPCParameterNameVRHelp:[@[helpItem] mutableCopy], SDLRPCParameterNameInteractionLayout:SDLLayoutModeIconWithSearch}, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePerformInteraction}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPerformInteraction* testRequest = [[SDLPerformInteraction alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.initialText).to(equal(@"a")); expect(testRequest.initialPrompt).to(equal([@[chunk1] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPublishAppServiceSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPublishAppServiceSpec.m index a11ec3fb0..2268eea1e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPublishAppServiceSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPublishAppServiceSpec.m @@ -43,7 +43,10 @@ SDLRPCParameterNameAppServiceManifest:testAppServiceManifest }, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePublishAppService}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPublishAppService *testRequest = [[SDLPublishAppService alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.appServiceManifest).to(equal(testAppServiceManifest)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m index b8c8f4f6b..4d5a6948d 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLPutFileSpec.m @@ -54,7 +54,10 @@ + (unsigned long)sdl_getCRC32ChecksumForBulkData:(NSData *)data; SDLRPCParameterNameLength:@123456789, SDLRPCParameterNameCRC:@0xffffffff}, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePutFile}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPutFile* testRequest = [[SDLPutFile alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.syncFileName).to(equal(@"fileName")); expect(testRequest.fileType).to(equal(SDLFileTypeJPEG)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLReadDIDSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLReadDIDSpec.m index a5ee105d1..d255c8dbc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLReadDIDSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLReadDIDSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameECUName:@33112, SDLRPCParameterNameDIDLocation:[@[@200, @201, @205] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameEndAudioPassThru}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLReadDID* testRequest = [[SDLReadDID alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.ecuName).to(equal(@33112)); expect(testRequest.didLocation).to(equal([@[@200, @201, @205] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m index d559adaa2..fbc22b5a2 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLRegisterAppInterfaceSpec.m @@ -113,7 +113,10 @@ SDLRPCParameterNameNightColorScheme: colorScheme, }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameRegisterAppInterface}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRegisterAppInterface* testRegisterAppInterface = [[SDLRegisterAppInterface alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRegisterAppInterface.syncMsgVersion).to(equal(version)); expect(testRegisterAppInterface.appName).to(match(appName)); @@ -211,7 +214,10 @@ }); it(@"initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:", ^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRegisterAppInterface *testRegisterAppInterface = [[SDLRegisterAppInterface alloc] initWithAppName:appName appId:appId languageDesired:language isMediaApp:isMediaApp appTypes:appTypes shortAppName:shortAppName]; +#pragma clang diagnostic pop expect(testRegisterAppInterface.fullAppID).to(beNil()); expect(testRegisterAppInterface.appID).to(match(appId)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLResetGlobalPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLResetGlobalPropertiesSpec.m index 67ffbbec9..2a13731f8 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLResetGlobalPropertiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLResetGlobalPropertiesSpec.m @@ -29,7 +29,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameProperties:[@[SDLGlobalPropertyMenuName, SDLGlobalPropertyVoiceRecognitionHelpTitle] copy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameResetGlobalProperties}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLResetGlobalProperties* testRequest = [[SDLResetGlobalProperties alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.properties).to(equal([@[SDLGlobalPropertyMenuName, SDLGlobalPropertyVoiceRecognitionHelpTitle] copy])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLScrollableMessageSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLScrollableMessageSpec.m index d8074b2eb..0514b1936 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLScrollableMessageSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLScrollableMessageSpec.m @@ -37,7 +37,10 @@ SDLRPCParameterNameTimeout:@9182, SDLRPCParameterNameSoftButtons:[@[button] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameScrollableMessage}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLScrollableMessage* testRequest = [[SDLScrollableMessage alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.scrollableMessageBody).to(equal(@"thatmessagebody")); expect(testRequest.timeout).to(equal(@9182)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendHapticDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendHapticDataSpec.m index d02e8f9bb..d6fba321a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendHapticDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendHapticDataSpec.m @@ -41,7 +41,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameHapticRectData:@[testStruct]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSendHapticData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSendHapticData *testRequest = [[SDLSendHapticData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.hapticRectData).to(equal(@[testStruct])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendLocationSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendLocationSpec.m index 244d3fdce..d7e15a019 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendLocationSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSendLocationSpec.m @@ -164,8 +164,10 @@ SDLRPCParameterNameOperationName:SDLRPCFunctionNameSendLocation } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLSendLocation alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); // Since all the properties are immutable, a copy should be executed as a retain, which means they should be identical @@ -190,8 +192,10 @@ SDLRPCParameterNameParameters: @{} } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLSendLocation alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); it(@"should return nil for parameters", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetAppIconSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetAppIconSpec.m index 983d79eeb..12b66d4a7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetAppIconSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetAppIconSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameSyncFileName:@"A/File/Name"}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetAppIcon}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetAppIcon* testRequest = [[SDLSetAppIcon alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.syncFileName).to(equal(@"A/File/Name")); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetCloudAppPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetCloudAppPropertiesSpec.m index 974170a3d..3068de94c 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetCloudAppPropertiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetCloudAppPropertiesSpec.m @@ -36,7 +36,10 @@ SDLRPCParameterNameProperties:testProperties }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetCloudAppProperties}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetCloudAppProperties *testRequest = [[SDLSetCloudAppProperties alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.properties).to(equal(testProperties)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetDisplayLayoutSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetDisplayLayoutSpec.m index 397b2e88b..5d8b1b9ce 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetDisplayLayoutSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetDisplayLayoutSpec.m @@ -48,7 +48,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameDisplayLayout:@"wat"}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetDisplayLayout}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetDisplayLayout* testRequest = [[SDLSetDisplayLayout alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.displayLayout).to(equal(@"wat")); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetGlobalPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetGlobalPropertiesSpec.m index f983a1da9..b12672582 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetGlobalPropertiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetGlobalPropertiesSpec.m @@ -57,7 +57,10 @@ SDLRPCParameterNameMenuIcon:image, SDLRPCParameterNameKeyboardProperties:keyboard}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetGlobalProperties}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetGlobalProperties* testRequest = [[SDLSetGlobalProperties alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.helpPrompt).to(equal([@[chunk1] mutableCopy])); expect(testRequest.timeoutPrompt).to(equal([@[chunk2] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetInteriorVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetInteriorVehicleDataSpec.m index d77ce6a89..99d30b21f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetInteriorVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetInteriorVehicleDataSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameModuleData : someModuleData}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetInteriorVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetInteriorVehicleData* testRequest = [[SDLSetInteriorVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.moduleData).to(equal(someModuleData)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m index bd806af6b..255ce747d 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSetMediaClockTimerSpec.m @@ -35,7 +35,10 @@ SDLRPCParameterNameAudioStreamingIndicator:testIndicator }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetMediaClockTimer}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetMediaClockTimer* testRequest = [[SDLSetMediaClockTimer alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.startTime).to(equal(time1)); expect(testRequest.endTime).to(equal(time2)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowConstantTBTSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowConstantTBTSpec.m index 451dece6d..69c9195eb 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowConstantTBTSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowConstantTBTSpec.m @@ -65,7 +65,10 @@ SDLRPCParameterNameManeuverComplete:@NO, SDLRPCParameterNameSoftButtons:[@[button] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameShowConstantTBT}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLShowConstantTBT* testRequest = [[SDLShowConstantTBT alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.navigationText1).to(equal(@"nav1")); expect(testRequest.navigationText2).to(equal(@"nav2")); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m index 341500b20..d9274e8e9 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLShowSpec.m @@ -329,7 +329,10 @@ SDLRPCParameterNameCustomPresets:[@[@"preset1", @"preset2"] mutableCopy], SDLRPCParameterNameMetadataTags:testMetadata}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameShow}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLShow* testRequest = [[SDLShow alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.mainField1).to(equal(@"field1")); expect(testRequest.mainField2).to(equal(@"field2")); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSliderSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSliderSpec.m index e5b3ba339..7689b8904 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSliderSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSliderSpec.m @@ -58,7 +58,10 @@ SDLRPCParameterNameSliderFooter:testFooters, SDLRPCParameterNameTimeout:@(testTimeout)}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSlider}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testRequest = [[SDLSlider alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.numTicks).to(equal(testNumTicks)); expect(testRequest.position).to(equal(testPosition)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSpeakSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSpeakSpec.m index 761c10505..8642bb4a2 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSpeakSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSpeakSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameTTSChunks:[@[chunk] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSpeak}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSpeak* testRequest = [[SDLSpeak alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.ttsChunks).to(equal([@[chunk] mutableCopy])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeButtonSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeButtonSpec.m index d748e24bd..67a99173b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeButtonSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeButtonSpec.m @@ -30,7 +30,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameButtonName:SDLButtonNamePreset5}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeButton}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSubscribeButton* testRequest = [[SDLSubscribeButton alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.buttonName).to(equal(SDLButtonNamePreset5)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m index c90c8a45e..b4d677936 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSubscribeVehicleDataSpec.m @@ -112,7 +112,10 @@ SDLRPCParameterNameTurnSignal:@NO, SDLRPCParameterNameWiperStatus:@NO}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSubscribeVehicleData* testRequest = [[SDLSubscribeVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.accPedalPosition).to(equal(@YES)); expect(testRequest.airbagStatus).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSystemRequestSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSystemRequestSpec.m index 1b27f45a8..19954c463 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSystemRequestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLSystemRequestSpec.m @@ -28,7 +28,10 @@ SDLRPCParameterNameRequestSubType: testSubType, SDLRPCParameterNameFilename:testFileName}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSystemRequest}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSystemRequest* testRequest = [[SDLSystemRequest alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.requestType).to(equal(testRequestType)); expect(testRequest.requestSubType).to(equal(testSubType)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeButtonSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeButtonSpec.m index dd7f72d28..48f6ef76b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeButtonSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeButtonSpec.m @@ -30,7 +30,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameButtonName:SDLButtonNamePreset0}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeButton}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLUnsubscribeButton* testRequest = [[SDLUnsubscribeButton alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.buttonName).to(equal(SDLButtonNamePreset0)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m index f538f412e..adb9307bd 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUnsubscribeVehicleDataSpec.m @@ -112,7 +112,10 @@ SDLRPCParameterNameTurnSignal:@YES, SDLRPCParameterNameWiperStatus:@YES}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLUnsubscribeVehicleData* testRequest = [[SDLUnsubscribeVehicleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.accPedalPosition).to(equal(@YES)); expect(testRequest.airbagStatus).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUpdateTurnListSpec.m b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUpdateTurnListSpec.m index 1fe93731f..ec31cd98f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUpdateTurnListSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/RequestSpecs/SDLUpdateTurnListSpec.m @@ -36,7 +36,10 @@ @{SDLRPCParameterNameTurnList:[@[turn] mutableCopy], SDLRPCParameterNameSoftButtons:[@[button] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameUpdateTurnList}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLUpdateTurnList* testRequest = [[SDLUpdateTurnList alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testRequest.turnList).to(equal([@[turn] mutableCopy])); expect(testRequest.softButtons).to(equal([@[button] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDeleteFileResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDeleteFileResponseSpec.m index 6eb54798e..9ff80e15a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDeleteFileResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDeleteFileResponseSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameSpaceAvailable:@0}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDeleteFile}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeleteFileResponse* testResponse = [[SDLDeleteFileResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.spaceAvailable).to(equal(@0)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDiagnosticMessageResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDiagnosticMessageResponseSpec.m index b8efd9c97..239581a67 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDiagnosticMessageResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLDiagnosticMessageResponseSpec.m @@ -28,7 +28,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameMessageDataResult:@[@3, @9, @27, @81]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameDiagnosticMessage}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDiagnosticMessageResponse* testResponse = [[SDLDiagnosticMessageResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.messageDataResult).to(equal(@[@3, @9, @27, @81])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetAppServiceDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetAppServiceDataResponseSpec.m index 53b04382b..2df52a5ab 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetAppServiceDataResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetAppServiceDataResponseSpec.m @@ -38,7 +38,10 @@ SDLRPCParameterNameServiceData:testAppServiceData }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetAppServiceData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetAppServiceDataResponse *testResponse = [[SDLGetAppServiceDataResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.serviceData).to(equal(testAppServiceData)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetCloudAppPropertiesResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetCloudAppPropertiesResponseSpec.m index 4da3f7c89..0109daf10 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetCloudAppPropertiesResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetCloudAppPropertiesResponseSpec.m @@ -36,7 +36,10 @@ SDLRPCParameterNameProperties:testProperties }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetCloudAppProperties}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetCloudAppPropertiesResponse *testResponse = [[SDLGetCloudAppPropertiesResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.properties).to(equal(testProperties)); expect(testResponse.name).to(equal(SDLRPCFunctionNameSetCloudAppProperties)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetDTCsResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetDTCsResponseSpec.m index 5c6ea8658..ec2afbdb5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetDTCsResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetDTCsResponseSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameECUHeader:@404, SDLRPCParameterNameDTC:[@[@"FFFF", @"FFFE", @"FFFD"] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetDTCs}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetDTCsResponse* testResponse = [[SDLGetDTCsResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.ecuHeader).to(equal(@404)); expect(testResponse.dtc).to(equal([@[@"FFFF", @"FFFE", @"FFFD"] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetFileResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetFileResponseSpec.m index 04bc119be..908a88a60 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetFileResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetFileResponseSpec.m @@ -48,7 +48,10 @@ SDLRPCParameterNameCRC:@(testCrc) }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetFile}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetFileResponse *testResponse = [[SDLGetFileResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.offset).to(equal(testOffset)); expect(testResponse.length).to(equal(testLength)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetInteriorVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetInteriorVehicleDataResponseSpec.m index 7541d2625..94d086cff 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetInteriorVehicleDataResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetInteriorVehicleDataResponseSpec.m @@ -40,7 +40,10 @@ @{SDLRPCParameterNameModuleData:someModuleData, SDLRPCParameterNameIsSubscribed:@NO}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetInteriorVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetInteriorVehicleDataResponse* testResponse = [[SDLGetInteriorVehicleDataResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.moduleData).to(equal(someModuleData)); expect(testResponse.isSubscribed).to(equal(@NO)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetSystemCapabilityResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetSystemCapabilityResponseSpec.m index 54d9c561e..96f69128e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetSystemCapabilityResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetSystemCapabilityResponseSpec.m @@ -41,7 +41,10 @@ SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetSystemCapability } }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetSystemCapabilityResponse *testResponse = [[SDLGetSystemCapabilityResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.systemCapability.systemCapabilityType).to(equal(SDLSystemCapabilityTypeNavigation)); expect(testResponse.systemCapability.navigationCapability.sendLocationEnabled).to(equal(YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m index 9d672c532..ed1db8343 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetVehicleDataResponseSpec.m @@ -149,7 +149,10 @@ SDLRPCParameterNameVIN:vin, SDLRPCParameterNameWiperStatus:SDLWiperStatusAutomaticHigh}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameGetVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGetVehicleDataResponse* testResponse = [[SDLGetVehicleDataResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.accPedalPosition).to(equal(@0)); expect(testResponse.airbagStatus).to(equal(airbag)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetWaypointsResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetWaypointsResponseSpec.m index c54acf9fa..a5dcf14ea 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetWaypointsResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLGetWaypointsResponseSpec.m @@ -69,8 +69,10 @@ } } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testResponse = [[SDLGetWayPointsResponse alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); // Since all the properties are immutable, a copy should be executed as a retain, which means they should be identical @@ -87,8 +89,10 @@ SDLRPCParameterNameParameters: @{} } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testResponse = [[SDLGetWayPointsResponse alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); it(@"should return nil for waypoints", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLListFilesResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLListFilesResponseSpec.m index 02ab663c8..dd2b83867 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLListFilesResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLListFilesResponseSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameFilenames:[@[@"Music/music.mp3", @"Documents/document.txt", @"Downloads/format.exe"] mutableCopy], SDLRPCParameterNameSpaceAvailable:@500000000}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameListFiles}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLListFilesResponse* testResponse = [[SDLListFilesResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.filenames).to(equal([@[@"Music/music.mp3", @"Documents/document.txt", @"Downloads/format.exe"] mutableCopy])); expect(testResponse.spaceAvailable).to(equal(@500000000)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformAppServiceInteractionResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformAppServiceInteractionResponseSpec.m index 9ac23a78f..aa3eefcf7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformAppServiceInteractionResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformAppServiceInteractionResponseSpec.m @@ -35,7 +35,10 @@ SDLRPCParameterNameServiceSpecificResult:testServiceSpecificResult }, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePublishAppService}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPerformAppServiceInteractionResponse *testResponse = [[SDLPerformAppServiceInteractionResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.serviceSpecificResult).to(equal(testServiceSpecificResult)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformInteractionResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformInteractionResponseSpec.m index 832ed3e44..073c7bbcd 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformInteractionResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPerformInteractionResponseSpec.m @@ -36,7 +36,10 @@ SDLRPCParameterNameManualTextEntry:@"entry", SDLRPCParameterNameTriggerSource:SDLTriggerSourceKeyboard}, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePerformInteraction}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPerformInteractionResponse* testResponse = [[SDLPerformInteractionResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.choiceID).to(equal(@25)); expect(testResponse.manualTextEntry).to(equal(@"entry")); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPublishAppServiceResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPublishAppServiceResponseSpec.m index 7c3e84317..2ab9c517a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPublishAppServiceResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPublishAppServiceResponseSpec.m @@ -37,7 +37,10 @@ SDLRPCParameterNameAppServiceRecord:testAppServiceRecord }, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePublishAppService}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPublishAppServiceResponse *testResponse = [[SDLPublishAppServiceResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.appServiceRecord).to(equal(testAppServiceRecord)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPutFileResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPutFileResponseSpec.m index 347be0314..575dc0f6b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPutFileResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLPutFileResponseSpec.m @@ -29,7 +29,10 @@ @{SDLRPCParameterNameSpaceAvailable:@1248, }, SDLRPCParameterNameOperationName:SDLRPCFunctionNamePutFile}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPutFileResponse* testResponse = [[SDLPutFileResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.spaceAvailable).to(equal(@1248)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLReadDIDResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLReadDIDResponseSpec.m index 1ecc59fc9..05626af68 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLReadDIDResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLReadDIDResponseSpec.m @@ -31,7 +31,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameDIDResult:[@[result] mutableCopy]}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameReadDID}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLReadDIDResponse* testResponse = [[SDLReadDIDResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.didResult).to(equal([@[result] mutableCopy])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m index b8c1c816b..4d7918de4 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLRegisterAppInterfaceResponseSpec.m @@ -93,7 +93,10 @@ SDLRPCParameterNameIconResumed: @YES, }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameRegisterAppInterface}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRegisterAppInterfaceResponse* testResponse = [[SDLRegisterAppInterfaceResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.syncMsgVersion).to(equal(version)); expect(testResponse.language).to(equal(SDLLanguageEsMx)); @@ -164,7 +167,10 @@ SDLRPCParameterNameIconResumed: NSNull.null, }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameRegisterAppInterface}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRegisterAppInterfaceResponse* testResponse = [[SDLRegisterAppInterfaceResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expectAction(^{ [testResponse syncMsgVersion]; }).to(raiseException()); expectAction(^{ [testResponse language]; }).to(raiseException()); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetCloudAppPropertiesResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetCloudAppPropertiesResponseSpec.m index fdcf9144e..4a49b7d6b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetCloudAppPropertiesResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetCloudAppPropertiesResponseSpec.m @@ -26,7 +26,10 @@ NSDictionary *dict = @{SDLRPCParameterNameResponse:@{ SDLRPCParameterNameParameters:@{}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetCloudAppProperties}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetCloudAppPropertiesResponse *testResponse = [[SDLSetCloudAppPropertiesResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse).toNot(beNil()); expect(testResponse.name).to(equal(SDLRPCFunctionNameSetCloudAppProperties)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m index 41e36b842..7a82e0456 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetDisplayLayoutResponseSpec.m @@ -47,7 +47,10 @@ SDLRPCParameterNameSoftButtonCapabilities:[@[softButton] mutableCopy], SDLRPCParameterNamePresetBankCapabilities:presetBank}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetDisplayLayout}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetDisplayLayoutResponse* testResponse = [[SDLSetDisplayLayoutResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.displayCapabilities).to(equal(info)); expect(testResponse.buttonCapabilities).to(equal([@[button] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetInteriorVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetInteriorVehicleDataResponseSpec.m index cbb26be8b..ae989b0a9 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetInteriorVehicleDataResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSetInteriorVehicleDataResponseSpec.m @@ -36,7 +36,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameModuleData:someModuleData}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSetInteriorVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSetInteriorVehicleDataResponse* testResponse = [[SDLSetInteriorVehicleDataResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.moduleData).to(equal(someModuleData)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSliderResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSliderResponseSpec.m index bddbb04a4..b1e269dfc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSliderResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSliderResponseSpec.m @@ -29,7 +29,10 @@ @{SDLRPCParameterNameParameters: @{SDLRPCParameterNameSliderPosition:@13}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSlider}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSliderResponse* testResponse = [[SDLSliderResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.sliderPosition).to(equal(@13)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m index fa3f163a4..6b1f4303b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSubscribeVehicleDataResponseSpec.m @@ -116,7 +116,10 @@ SDLRPCParameterNameTurnSignal:vehicleDataResult, SDLRPCParameterNameWiperStatus:vehicleDataResult}, SDLRPCParameterNameOperationName:SDLRPCFunctionNameSubscribeVehicleData}}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSubscribeVehicleDataResponse* testResponse = [[SDLSubscribeVehicleDataResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.accPedalPosition).to(equal(vehicleDataResult)); expect(testResponse.airbagStatus).to(equal(vehicleDataResult)); diff --git a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m index d9ba58f6b..8e91afc1d 100644 --- a/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLUnsubscribeVehicleDataResponseSpec.m @@ -117,7 +117,10 @@ SDLRPCParameterNameCloudAppVehicleID:vehicleDataResult }, SDLRPCParameterNameOperationName:SDLRPCFunctionNameUnsubscribeVehicleData}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLUnsubscribeVehicleDataResponse* testResponse = [[SDLUnsubscribeVehicleDataResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testResponse.gps).to(equal(vehicleDataResult)); expect(testResponse.speed).to(equal(vehicleDataResult)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAirbagStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAirbagStatusSpec.m index 032857f4b..ca3f98a20 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAirbagStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAirbagStatusSpec.m @@ -47,7 +47,10 @@ SDLRPCParameterNameDriverKneeAirbagDeployed:SDLVehicleDataEventStatusNo, SDLRPCParameterNamePassengerSideAirbagDeployed:SDLVehicleDataEventStatusYes, SDLRPCParameterNamePassengerKneeAirbagDeployed:SDLVehicleDataEventStatusNoEvent} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAirbagStatus* testStruct = [[SDLAirbagStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.driverAirbagDeployed).to(equal(SDLVehicleDataEventStatusYes)); expect(testStruct.driverSideAirbagDeployed).to(equal(SDLVehicleDataEventStatusNoEvent)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppInfoSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppInfoSpec.m index f230a7898..894149a49 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppInfoSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppInfoSpec.m @@ -31,7 +31,10 @@ NSMutableDictionary *dict = [@{SDLRPCParameterNameAppDisplayName:@"display name", SDLRPCParameterNameAppVersion:@"1.2.3.4", SDLRPCParameterNameAppBundleId:@"com.app.bundle"} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAppInfo* testStruct = [[SDLAppInfo alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.appDisplayName).to(equal(@"display name")); expect(testStruct.appVersion).to(equal(@"1.2.3.4")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceCapabilitySpec.m index 220ce9e30..b39ad49b7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceCapabilitySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceCapabilitySpec.m @@ -21,7 +21,10 @@ beforeEach(^{ testUpdateReason = SDLServiceUpdateActivated; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testUpdatedAppServiceRecord = [[SDLAppServiceRecord alloc] initWithDictionary:@{SDLRPCParameterNameServiceID:@"1234", SDLRPCParameterNameServicePublished:@YES}]; +#pragma clang diagnostic pop }); it(@"Should set and get correctly", ^{ @@ -37,8 +40,10 @@ NSDictionary *dict = @{SDLRPCParameterNameUpdateReason:testUpdateReason, SDLRPCParameterNameUpdatedAppServiceRecord:testUpdatedAppServiceRecord }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAppServiceCapability *testStruct = [[SDLAppServiceCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.updateReason).to(equal(testUpdateReason)); expect(testStruct.updatedAppServiceRecord).to(equal(testUpdatedAppServiceRecord)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceDataSpec.m index ec1aef4ab..bfd451fa8 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceDataSpec.m @@ -57,7 +57,10 @@ SDLRPCParameterNameWeatherServiceData:testWeatherServiceData, SDLRPCParameterNameNavigationServiceData:testNavigationServiceData }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAppServiceData *testStruct = [[SDLAppServiceData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.serviceType).to(equal(testServiceType)); expect(testStruct.serviceId).to(equal(testServiceId)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceManifestSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceManifestSpec.m index b12c8e8ad..430d869b5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceManifestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceManifestSpec.m @@ -81,7 +81,10 @@ SDLRPCParameterNameMediaServiceManifest:testMediaServiceManifest, SDLRPCParameterNameNavigationServiceManifest:testNavigationServiceManifest }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAppServiceManifest *testStruct = [[SDLAppServiceManifest alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.serviceName).to(match(testServiceName)); expect(testStruct.serviceType).to(equal(testServiceType)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceRecordSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceRecordSpec.m index f0d99c84f..ec56f1da5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceRecordSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServiceRecordSpec.m @@ -23,7 +23,10 @@ beforeEach(^{ testServiceID = @"12345"; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testAppServiceManifest = [[SDLAppServiceManifest alloc] initWithDictionary:@{SDLRPCParameterNameAllowAppConsumers:@NO}]; +#pragma clang diagnostic pop testServicePublished = @NO; testServiceActive = @YES; }); @@ -56,7 +59,10 @@ SDLRPCParameterNameServicePublished:testServicePublished, SDLRPCParameterNameServiceActive:testServiceActive }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAppServiceRecord *testStruct = [[SDLAppServiceRecord alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.serviceID).to(match(testServiceID)); expect(testStruct.serviceManifest).to(equal(testAppServiceManifest)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServicesCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServicesCapabilitiesSpec.m index 486a664e8..14b88578f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServicesCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAppServicesCapabilitiesSpec.m @@ -19,7 +19,10 @@ __block NSArray *testAppServices = nil; beforeEach(^{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testAppServices = @[[[SDLAppServiceCapability alloc] initWithDictionary:@{SDLRPCParameterNameUpdateReason:SDLServiceUpdateRemoved}]]; +#pragma clang diagnostic pop }); it(@"Should set and get correctly", ^{ @@ -38,7 +41,10 @@ it(@"Should get correctly when initialized with a dictionary", ^{ NSDictionary *dict = @{SDLRPCParameterNameAppServices:testAppServices }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAppServicesCapabilities *testStruct = [[SDLAppServicesCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.appServices).to(equal(testAppServices)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlCapabilitiesSpec.m index d99d76c22..d4ba87009 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlCapabilitiesSpec.m @@ -63,7 +63,10 @@ SDLRPCParameterNameEqualizerAvailable:@(NO), SDLRPCParameterNameEqualizerMaxChannelId:@12 } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAudioControlCapabilities* testStruct = [[SDLAudioControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleName).to(equal(@"module")); expect(testStruct.sourceAvailable).to(equal(@(NO))); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlDataSpec.m index 19b88b71b..bd350d32b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioControlDataSpec.m @@ -48,7 +48,10 @@ SDLRPCParameterNameVolume:@(NO), SDLRPCParameterNameEqualizerSettings:[@[someEqualizerSettings] copy] } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAudioControlData* testStruct = [[SDLAudioControlData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.source).to(equal(SDLPrimaryAudioSourceCD)); expect(testStruct.keepContext).to(equal(@(NO))); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioPassThruCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioPassThruCapabilitiesSpec.m index 915af499a..60a5624da 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioPassThruCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLAudioPassThruCapabilitiesSpec.m @@ -34,7 +34,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameSamplingRate:SDLSamplingRate22KHZ, SDLRPCParameterNameBitsPerSample:SDLBitsPerSample8Bit, SDLRPCParameterNameAudioType:SDLAudioTypePCM} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLAudioPassThruCapabilities* testStruct = [[SDLAudioPassThruCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.samplingRate).to(equal(SDLSamplingRate22KHZ)); expect(testStruct.bitsPerSample).to(equal(SDLBitsPerSample8Bit)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBeltStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBeltStatusSpec.m index dbe9d7b1f..704f4c370 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBeltStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBeltStatusSpec.m @@ -68,7 +68,10 @@ SDLRPCParameterNameRightRearInflatableBelted:SDLVehicleDataEventStatusFault, SDLRPCParameterNameMiddleRow1BeltDeployed:SDLVehicleDataEventStatusNoEvent, SDLRPCParameterNameMiddleRow1BuckleBelted:SDLVehicleDataEventStatusNotSupported} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLBeltStatus* testStruct = [[SDLBeltStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.driverBeltDeployed).to(equal(SDLVehicleDataEventStatusNoEvent)); expect(testStruct.passengerBeltDeployed).to(equal(SDLVehicleDataEventStatusYes)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m index 9c8765525..cd75a33b0 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLBodyInformationSpec.m @@ -44,7 +44,10 @@ SDLRPCParameterNamePassengerDoorAjar:@NO, SDLRPCParameterNameRearLeftDoorAjar:@NO, SDLRPCParameterNameRearRightDoorAjar:@YES} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLBodyInformation* testStruct = [[SDLBodyInformation alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.parkBrakeActive).to(equal(@YES)); expect(testStruct.ignitionStableStatus).to(equal(SDLIgnitionStableStatusNotStable)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLButtonCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLButtonCapabilitiesSpec.m index f4a0a3a89..f60e67998 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLButtonCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLButtonCapabilitiesSpec.m @@ -35,7 +35,10 @@ SDLRPCParameterNameShortPressAvailable:@YES, SDLRPCParameterNameLongPressAvailable:@YES, SDLRPCParameterNameUpDownAvailable:@NO} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLButtonCapabilities* testStruct = [[SDLButtonCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.name).to(equal(SDLButtonNameCustomButton)); expect(testStruct.shortPressAvailable).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLChoiceSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLChoiceSpec.m index 7cb870b61..770f83cf7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLChoiceSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLChoiceSpec.m @@ -47,7 +47,10 @@ SDLRPCParameterNameSecondaryText:@"Arbitrary", SDLRPCParameterNameTertiaryText:@"qwerty", SDLRPCParameterNameSecondaryImage:secondaryImage} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLChoice* testStruct = [[SDLChoice alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.choiceID).to(equal(@3)); expect(testStruct.menuName).to(equal(@"Hello")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlCapabilitiesSpec.m index 1bc146b4e..5867bb897 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlCapabilitiesSpec.m @@ -74,7 +74,10 @@ SDLRPCParameterNameHeatedRearWindowAvailable:@YES, SDLRPCParameterNameHeatedMirrorsAvailable:@NO } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLClimateControlCapabilities* testStruct = [[SDLClimateControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleName).to(equal(@"Name")); expect(testStruct.fanSpeedAvailable).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlDataSpec.m index 8864f9ef5..9c89ff291 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClimateControlDataSpec.m @@ -115,8 +115,11 @@ SDLRPCParameterNameHeatedRearWindowEnable:@NO, SDLRPCParameterNameHeatedMirrorsEnable:@YES, } mutableCopy]; - + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLClimateControlData* testStruct = [[SDLClimateControlData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.fanSpeed).to(equal(@43)); expect(testStruct.currentTemperature).to(equal(currentTemp)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLCloudAppPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLCloudAppPropertiesSpec.m index 8e933275e..4c505753d 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLCloudAppPropertiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLCloudAppPropertiesSpec.m @@ -63,7 +63,10 @@ SDLRPCParameterNameHybridAppPreference:testHybridAppPreference, SDLRPCParameterNameEndpoint:testEndpoint }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLCloudAppProperties *testStruct = [[SDLCloudAppProperties alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.nicknames).to(equal(testNicknames)); expect(testStruct.appID).to(equal(testAppID)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClusterModeStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClusterModeStatusSpec.m index fcafcde1b..1b8fe4a53 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClusterModeStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLClusterModeStatusSpec.m @@ -36,7 +36,10 @@ SDLRPCParameterNamePowerModeQualificationStatus:SDLPowerModeQualificationStatusOk, SDLRPCParameterNameCarModeStatus:SDLCarModeStatusCrash, SDLRPCParameterNamePowerModeStatus:SDLPowerModeStatusKeyOut} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLClusterModeStatus* testStruct = [[SDLClusterModeStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.powerModeActive).to(equal(@NO)); expect(testStruct.powerModeQualificationStatus).to(equal(SDLPowerModeQualificationStatusOk)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDIDResult.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDIDResult.m index 263793455..fc8354588 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDIDResult.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDIDResult.m @@ -32,7 +32,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameResultCode:SDLVehicleDataResultCodeDataNotSubscribed, SDLRPCParameterNameDIDLocation:@300, SDLRPCParameterNameData:@"gertwydhty4235tdhedt4tue"} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDIDResult* testStruct = [[SDLDIDResult alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.resultCode).to(equal(SDLVehicleDataResultCodeDataNotSubscribed)); expect(testStruct.didLocation).to(equal(@300)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDateTimeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDateTimeSpec.m index 5f4091d0f..2961c9b9e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDateTimeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDateTimeSpec.m @@ -51,7 +51,10 @@ SDLRPCParameterNameYear:@4000, SDLRPCParameterNameTimezoneMinuteOffset:@0, SDLRPCParameterNameTimezoneHourOffset:@1000} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDateTime* testStruct = [[SDLDateTime alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.millisecond).to(equal(@100)); expect(testStruct.second).to(equal(@4)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceInfoSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceInfoSpec.m index d1fcc5b55..f59877d3f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceInfoSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceInfoSpec.m @@ -39,7 +39,10 @@ SDLRPCParameterNameOSVersion:@"9.9", SDLRPCParameterNameCarrier:@"ThatOneWirelessCompany", SDLRPCParameterNameMaxNumberRFCOMMPorts:@20} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeviceInfo* testStruct = [[SDLDeviceInfo alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.hardware).to(equal(@"GDFR34F")); expect(testStruct.firmwareRev).to(equal(@"4.2a")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceStatusSpec.m index 847c7b95c..f2c404d60 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDeviceStatusSpec.m @@ -57,7 +57,10 @@ SDLRPCParameterNameSignalLevelStatus:SDLDeviceLevelStatusTwoBars, SDLRPCParameterNamePrimaryAudioSource:SDLPrimaryAudioSourceBluetoothStereo, SDLRPCParameterNameECallEventActive:@NO} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLDeviceStatus* testStruct = [[SDLDeviceStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.voiceRecOn).to(equal(@NO)); expect(testStruct.btIconOn).to(equal(@NO)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLECallInfoSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLECallInfoSpec.m index d7229bdbc..49abcafbe 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLECallInfoSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLECallInfoSpec.m @@ -33,7 +33,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameECallNotificationStatus:SDLVehicleDataNotificationStatusNormal, SDLRPCParameterNameAuxECallNotificationStatus:SDLVehicleDataNotificationStatusActive, SDLRPCParameterNameECallConfirmationStatus:SDLECallConfirmationStatusInProgress} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLECallInfo* testStruct = [[SDLECallInfo alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.eCallNotificationStatus).to(equal(SDLVehicleDataNotificationStatusNormal)); expect(testStruct.auxECallNotificationStatus).to(equal(SDLVehicleDataNotificationStatusActive)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEmergencyEventSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEmergencyEventSpec.m index 3ac05c2e5..0c7047863 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEmergencyEventSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEmergencyEventSpec.m @@ -40,7 +40,10 @@ SDLRPCParameterNameRolloverEvent:SDLVehicleDataEventStatusYes, SDLRPCParameterNameMaximumChangeVelocity:@33, SDLRPCParameterNameMultipleEvents:SDLVehicleDataEventStatusNo} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLEmergencyEvent* testStruct = [[SDLEmergencyEvent alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.emergencyEventType).to(equal(SDLEmergencyEventTypeFrontal)); expect(testStruct.fuelCutoffStatus).to(equal(SDLFuelCutoffStatusNormalOperation)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEqualizerSettingsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEqualizerSettingsSpec.m index 599a36b1c..3a3e9ab1b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEqualizerSettingsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLEqualizerSettingsSpec.m @@ -39,7 +39,10 @@ SDLRPCParameterNameChannelName:@"channel", SDLRPCParameterNameChannelSetting:@45 } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLEqualizerSettings* testStruct = [[SDLEqualizerSettings alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.channelId).to(equal(@2)); expect(testStruct.channelName).to(equal(@"channel")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m index 8461f67a9..faad50b3b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLFuelRangeSpec.m @@ -31,8 +31,10 @@ NSDictionary *dict = @{SDLRPCParameterNameType:SDLFuelTypeLPG, SDLRPCParameterNameRange:@23 }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLFuelRange *testStruct = [[SDLFuelRange alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.type).to(equal(SDLFuelTypeLPG)); expect(testStruct.range).to(equal(@23)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGPSDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGPSDataSpec.m index 9251e315f..dc1361833 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGPSDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGPSDataSpec.m @@ -78,7 +78,10 @@ SDLRPCParameterNameAltitude:@3000, SDLRPCParameterNameHeading:@96, SDLRPCParameterNameSpeed:@64} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLGPSData* testStruct = [[SDLGPSData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.longitudeDegrees).to(equal(@31.41592653589793)); expect(testStruct.latitudeDegrees).to(equal(@45)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m index c47c4ce24..9f64d4af8 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMICapabilitiesSpec.m @@ -46,7 +46,10 @@ SDLRPCParameterNamePhoneCall: somePhoneCallState, SDLRPCParameterNameVideoStreaming: someVideoStreamState }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testStruct = [[SDLHMICapabilities alloc] initWithDictionary:[structInitDict mutableCopy]]; +#pragma clang diagnostic pop }); it(@"should properly set phone call", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMIPermissionsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMIPermissionsSpec.m index 9b677e6ee..0e97bb117 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMIPermissionsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMIPermissionsSpec.m @@ -28,7 +28,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary* dict = [@{SDLRPCParameterNameAllowed:[@[SDLHMILevelBackground, SDLHMILevelFull] copy], SDLRPCParameterNameUserDisallowed:[@[SDLHMILevelNone, SDLHMILevelLimited] copy]} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLHMIPermissions* testStruct = [[SDLHMIPermissions alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.allowed).to(equal([@[SDLHMILevelBackground, SDLHMILevelFull] copy])); expect(testStruct.userDisallowed).to(equal([@[SDLHMILevelNone, SDLHMILevelLimited] copy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlCapabilitiesSpec.m index 7bc085453..7b766f176 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlCapabilitiesSpec.m @@ -53,7 +53,10 @@ SDLRPCParameterNameDistanceUnitAvailable:@(YES), SDLRPCParameterNameDisplayModeUnitAvailable:@(NO) } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLHMISettingsControlCapabilities* testStruct = [[SDLHMISettingsControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleName).to(equal(@"temperatureUnit")); expect(testStruct.distanceUnitAvailable).to(equal(@(YES))); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlDataSpec.m index 59f730476..ec0ac4984 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHMISettingsControlDataSpec.m @@ -37,7 +37,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameDisplayMode:SDLDisplayModeAuto, SDLRPCParameterNameTemperatureUnit:SDLTemperatureUnitCelsius, SDLRPCParameterNameDistanceUnit:SDLDistanceUnitKilometers} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLHMISettingsControlData* testStruct = [[SDLHMISettingsControlData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.displayMode).to(equal(SDLDisplayModeAuto)); expect(testStruct.temperatureUnit).to(equal(SDLTemperatureUnitCelsius)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHapticRectSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHapticRectSpec.m index b5ea6b725..0ea323c24 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHapticRectSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHapticRectSpec.m @@ -49,7 +49,10 @@ SDLRPCParameterNameHeight:@3000 } } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLHapticRect *testStruct = [[SDLHapticRect alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.id).to(equal(@2)); expect(testStruct.rect.x).to(equal(@20)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHeadLampStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHeadLampStatusSpec.m index 201ce6bce..c47ab6fe5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHeadLampStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLHeadLampStatusSpec.m @@ -32,7 +32,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameLowBeamsOn:@YES, SDLRPCParameterNameHighBeamsOn:@NO, SDLRPCParameterNameAmbientLightSensorStatus:SDLAmbientLightStatusTwilight3} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLHeadLampStatus* testStruct = [[SDLHeadLampStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.lowBeamsOn).to(equal(@YES)); expect(testStruct.highBeamsOn).to(equal(@NO)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageFieldSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageFieldSpec.m index 3850163be..26317d657 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageFieldSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageFieldSpec.m @@ -36,7 +36,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameName:SDLImageFieldNameTurnIcon, SDLRPCParameterNameImageTypeSupported:[@[SDLFileTypePNG, SDLFileTypeJPEG] copy], SDLRPCParameterNameImageResolution:resolution} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLImageField* testStruct = [[SDLImageField alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.name).to(equal(SDLImageFieldNameTurnIcon)); expect(testStruct.imageTypeSupported).to(equal([@[SDLFileTypePNG, SDLFileTypeJPEG] copy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m index 8bacdab56..6754178b4 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageResolutionSpec.m @@ -28,7 +28,10 @@ NSDictionary *dict = @{SDLRPCParameterNameResolutionHeight:@69, SDLRPCParameterNameResolutionWidth:@869, }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLImageResolution *testStruct = [[SDLImageResolution alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.resolutionWidth).to(equal(@869)); expect(testStruct.resolutionHeight).to(equal(@69)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m index 62335c659..85bac3a78 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLImageSpec.m @@ -51,7 +51,10 @@ SDLRPCParameterNameImageType:imageType, SDLRPCParameterNameImageTemplate:@YES } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testSDLImage = [[SDLImage alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expectedValue = value; expectedImageType = imageType; diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m index a615413fa..e535cc100 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m @@ -40,7 +40,10 @@ SDLRPCParameterNameKeypressMode:SDLKeypressModeResendCurrentEntry, SDLRPCParameterNameLimitedCharacterList:[@[@"s", @"r", @"f", @"q"] mutableCopy], SDLRPCParameterNameAutoCompleteText:@"Auto Carrot"} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.language).to(equal(SDLLanguageDaDk)); expect(testStruct.keyboardLayout).to(equal(SDLKeyboardLayoutQWERTZ)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightCapabilitiesSpec.m index a5aa62996..b89f3dbb9 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightCapabilitiesSpec.m @@ -42,7 +42,10 @@ SDLRPCParameterNameRGBColorSpaceAvailable:@NO } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLLightCapabilities* testStruct = [[SDLLightCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.name).to(equal(SDLLightNameFogLights)); expect(testStruct.densityAvailable).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlCapabilitiesSpec.m index 837a6cacd..7531a4813 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlCapabilitiesSpec.m @@ -40,8 +40,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameModuleName:@"moduleName", SDLRPCParameterNameSupportedLights:[@[somelightCapabilities] copy] } mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLLightControlCapabilities* testStruct = [[SDLLightControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleName).to(equal(@"moduleName")); expect(testStruct.supportedLights).to(equal([@[somelightCapabilities] copy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlDataSpec.m index a882bdf2f..bad28c0dc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightControlDataSpec.m @@ -32,8 +32,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary* dict = [@{SDLRPCParameterNameLightState:[@[someLightState] copy]} mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLLightControlData* testStruct = [[SDLLightControlData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.lightState).to(equal([@[someLightState] copy])); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightStateSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightStateSpec.m index dc478bb06..54afdb804 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightStateSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLightStateSpec.m @@ -68,7 +68,10 @@ SDLRPCParameterNameDensity:@(0.5), SDLRPCParameterNameColor:someRGBColor} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLLightState* testStruct = [[SDLLightState alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.id).to(equal(SDLLightNameFogLights)); expect(testStruct.status).to(equal(SDLLightStatusOn)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationCoordinateSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationCoordinateSpec.m index 011c8f8e4..5908c7c0e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationCoordinateSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationCoordinateSpec.m @@ -54,8 +54,10 @@ SDLRPCParameterNameLongitudeDegrees: someLongitude, SDLRPCParameterNameLatitudeDegrees: someLatitude, }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testStruct = [[SDLLocationCoordinate alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); // Since all the properties are immutable, a copy should be executed as a retain, which means they should be identical @@ -85,8 +87,10 @@ beforeEach(^{ NSDictionary *initDict = @{ }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testStruct = [[SDLLocationCoordinate alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); it(@"should return nil for longitude", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationDetailsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationDetailsSpec.m index 5bbdd7f00..e7a2e5dde 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationDetailsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLLocationDetailsSpec.m @@ -152,8 +152,10 @@ SDLRPCParameterNameLocationImage: someImage, SDLRPCParameterNameSearchAddress: someAddress }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testStruct = [[SDLLocationDetails alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); // Since all the properties are immutable, a copy should be executed as a retain, which means they should be identical @@ -200,8 +202,10 @@ SDLRPCParameterNameParameters: @{} } }; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testStruct = [[SDLLocationDetails alloc] initWithDictionary:[NSMutableDictionary dictionaryWithDictionary:initDict]]; +#pragma clang diagnostic pop }); it(@"should return nil for coordinate", ^{ diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m index 1bd9b0a83..b41de4f8e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageCushionFirmnessSpec.m @@ -34,7 +34,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameCushion:SDLMassageCushionSeatBolsters, SDLRPCParameterNameFirmness:@12 } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLMassageCushionFirmness* testStruct = [[SDLMassageCushionFirmness alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.cushion).to(equal(SDLMassageCushionSeatBolsters)); expect(testStruct.firmness).to(equal(@12)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m index 486049ffe..3e9abffcc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMassageModeDataSpec.m @@ -35,7 +35,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameMassageMode:SDLMassageModeLow, SDLRPCParameterNameMassageZone:SDLMassageZoneLumbar } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLMassageModeData* testStruct = [[SDLMassageModeData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.massageZone).to(equal(SDLMassageZoneLumbar)); expect(testStruct.massageMode).to(equal(SDLMassageModeLow)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceDataSpec.m index 821b7a098..66e98b741 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceDataSpec.m @@ -81,7 +81,10 @@ SDLRPCParameterNameQueueCurrentTrackNumber:@(testQueueCurrentTrackNumber), SDLRPCParameterNameQueueTotalTrackCount:@(testQueueTotalTrackCount) }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLMediaServiceData *testStruct = [[SDLMediaServiceData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.mediaType).to(equal(testMediaType)); expect(testStruct.mediaTitle).to(equal(testMediaTitle)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceManifestSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceManifestSpec.m index bdd8dab4b..90dca89d0 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceManifestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMediaServiceManifestSpec.m @@ -23,7 +23,10 @@ it(@"Should get correctly when initialized with a dictionary", ^{ NSDictionary *dict = @{}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLMediaServiceManifest *testStruct = [[SDLMediaServiceManifest alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop // no parameters to test expect(testStruct).toNot(beNil()); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m index 3b70bbfc8..95af8629e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMenuParamsSpec.m @@ -30,7 +30,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameParentId:@(testParentId), SDLRPCParameterNamePosition:@(testPosition), SDLRPCParameterNameMenuName:testMenuName} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLMenuParams* testStruct = [[SDLMenuParams alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.parentID).to(equal(@(testParentId))); expect(testStruct.position).to(equal(@(testPosition))); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m index 5a67924ad..10789bd9c 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLModuleDataSpec.m @@ -50,7 +50,10 @@ SDLRPCParameterNameAudioControlData:someAudioData, SDLRPCParameterNameLightControlData:someLightData, SDLRPCParameterNameHmiSettingsControlData:someHMISettingsData} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLModuleData* testStruct = [[SDLModuleData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleType).to(equal(SDLModuleTypeRadio)); expect(testStruct.radioControlData).to(equal(someRadioData)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMyKeySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMyKeySpec.m index 0eab03e46..f3c30f866 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMyKeySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLMyKeySpec.m @@ -26,7 +26,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary* dict = [@{SDLRPCParameterNameE911Override:SDLVehicleDataStatusOn} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLMyKey* testStruct = [[SDLMyKey alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.e911Override).to(equal(SDLVehicleDataStatusOn)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationCapabilitySpec.m index e6db95484..d13388fbf 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationCapabilitySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationCapabilitySpec.m @@ -25,7 +25,10 @@ it(@"Should get correctly when initialized with a dictionary", ^ { NSDictionary *dict = @{SDLRPCParameterNameGetWayPointsEnabled: @(YES), SDLRPCParameterNameSendLocationEnabled: @(YES)}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLNavigationCapability* testStruct = [[SDLNavigationCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.getWayPointsEnabled).to(equal(YES)); expect(testStruct.sendLocationEnabled).to(equal(YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationInstructionSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationInstructionSpec.m index f7edb055b..9f3a3ff76 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationInstructionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationInstructionSpec.m @@ -68,7 +68,10 @@ SDLRPCParameterNameDetails:testDetails, SDLRPCParameterNameImage:testImage }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLNavigationInstruction *testStruct = [[SDLNavigationInstruction alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.locationDetails).to(equal(testLocationDetails)); expect(testStruct.action).to(equal(testAction)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceDataSpec.m index 96ec6dae7..a2d884800 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceDataSpec.m @@ -73,7 +73,10 @@ SDLRPCParameterNameNextInstructionDistanceScale:@(testNextInstructionDistanceScale), SDLRPCParameterNamePrompt:testPrompt }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLNavigationServiceData *testStruct = [[SDLNavigationServiceData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.timestamp).to(equal(testTimestamp)); expect(testStruct.origin).to(equal(testOrigin)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceManifestSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceManifestSpec.m index 30786c531..25078a1c8 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceManifestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLNavigationServiceManifestSpec.m @@ -30,7 +30,10 @@ it(@"Should get correctly when initialized with a dictionary", ^{ NSDictionary *dict = @{SDLRPCParameterNameAcceptsWayPoints:@(testAcceptsWayPoints)}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLNavigationServiceManifest *testStruct = [[SDLNavigationServiceManifest alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.acceptsWayPoints).to(equal(testAcceptsWayPoints)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLOasisAddressSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLOasisAddressSpec.m index dbada5f4e..4ad5eb98c 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLOasisAddressSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLOasisAddressSpec.m @@ -47,7 +47,10 @@ SDLRPCParameterNameSubLocality:@"18", SDLRPCParameterNameThoroughfare:@"Candy Lane", SDLRPCParameterNameSubThoroughfare:@"123"} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLOasisAddress* testStruct = [[SDLOasisAddress alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.countryName).to(equal(@"United States")); expect(testStruct.countryCode).to(equal(@"US")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLParameterPermissionsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLParameterPermissionsSpec.m index 746bbea63..74297dd0d 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLParameterPermissionsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLParameterPermissionsSpec.m @@ -28,7 +28,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary* dict = [@{SDLRPCParameterNameAllowed:[@[SDLHMILevelBackground, SDLHMILevelFull] copy], SDLRPCParameterNameUserDisallowed:[@[SDLHMILevelNone, SDLHMILevelLimited] copy]} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLParameterPermissions* testStruct = [[SDLParameterPermissions alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.allowed).to(equal([@[SDLHMILevelBackground, SDLHMILevelFull] copy])); expect(testStruct.userDisallowed).to(equal([@[SDLHMILevelNone, SDLHMILevelLimited] copy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPermissionItemSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPermissionItemSpec.m index 8f629a11d..83b7f57cc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPermissionItemSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPermissionItemSpec.m @@ -35,7 +35,10 @@ NSMutableDictionary *dict = [@{SDLRPCParameterNameRPCName:@"RPCNameThing", SDLRPCParameterNameHMIPermissions:hmiPermissions, SDLRPCParameterNameParameterPermissions:parameterPermissions} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPermissionItem* testStruct = [[SDLPermissionItem alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.rpcName).to(equal(@"RPCNameThing")); expect(testStruct.hmiPermissions).to(equal(hmiPermissions)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPhoneCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPhoneCapabilitySpec.m index a38ddec4b..3d57f7084 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPhoneCapabilitySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPhoneCapabilitySpec.m @@ -21,7 +21,10 @@ describe(@"Initialization tests", ^{ it(@"Should get correctly when initialized with a dictionary", ^ { NSDictionary *dict = @{SDLRPCParameterNameDialNumberEnabled: @(YES)}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPhoneCapability *testStruct = [[SDLPhoneCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.dialNumberEnabled).to(equal(YES)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPresetBankCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPresetBankCapabilitiesSpec.m index b10eace7b..5aef07a2f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPresetBankCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLPresetBankCapabilitiesSpec.m @@ -24,7 +24,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary *dict = [@{SDLRPCParameterNameOnScreenPresetsAvailable:@YES} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLPresetBankCapabilities* testStruct = [[SDLPresetBankCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.onScreenPresetsAvailable).to(equal(@YES)); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRDSDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRDSDataSpec.m index 082f201e3..211eb03ac 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRDSDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRDSDataSpec.m @@ -38,8 +38,12 @@ SDLRPCParameterNameTrafficProgramIdentification : @NO, SDLRPCParameterNameTrafficAnnouncementIdentification : @YES, SDLRPCParameterNameRegion : @"reg"} mutableCopy]; - SDLRDSData* testStruct = [[SDLRDSData alloc] initWithDictionary:dict]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + SDLRDSData* testStruct = [[SDLRDSData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop + expect(testStruct.programService).to(equal(@"ps")); expect(testStruct.radioText).to(equal(@"rt")); expect(testStruct.clockText).to(equal(@"2017-07-25T19:20:30-5:00")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRGBColorSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRGBColorSpec.m index 766b72298..355bebbb1 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRGBColorSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRGBColorSpec.m @@ -41,7 +41,10 @@ NSDictionary *dict = @{SDLRPCParameterNameRed: @0, SDLRPCParameterNameGreen: @100, SDLRPCParameterNameBlue: @255}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRGBColor *testStruct = [[SDLRGBColor alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.red).to(equal(@0)); expect(testStruct.green).to(equal(@100)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m index 8ac7c7563..20c057b60 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlCapabilitiesSpec.m @@ -50,7 +50,10 @@ SDLRPCParameterNameSiriusXMRadioAvailable : @NO, SDLRPCParameterNameSISDataAvailable:@YES } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRadioControlCapabilities* testStruct = [[SDLRadioControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleName).to(equal(@"someName")); expect(testStruct.radioEnableAvailable).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m index 58d9f8f92..49ba62568 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRadioControlDataSpec.m @@ -49,7 +49,10 @@ SDLRPCParameterNameState : SDLRadioStateNotFound, SDLRPCParameterNameHDRadioEnable : @NO } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRadioControlData* testStruct = [[SDLRadioControlData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.frequencyInteger).to(equal(@101)); expect(testStruct.frequencyFraction).to(equal(@7)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m index ceb7628e9..4fcadd62d 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRectangleSpec.m @@ -37,7 +37,10 @@ SDLRPCParameterNameY:@200, SDLRPCParameterNameWidth:@2000, SDLRPCParameterNameHeight:@3000}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRectangle *testStruct = [[SDLRectangle alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.x).to(equal(@20)); expect(testStruct.y).to(equal(@200)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m index c8b359d49..d444905a2 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRemoteControlCapabilitiesSpec.m @@ -57,7 +57,10 @@ SDLRPCParameterNameLightControlCapabilities :[@[someLightControlCapabilities] copy], SDLRPCParameterNameHmiSettingsControlCapabilities : [@[someHMISettingsControlCapabilities] copy] } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRemoteControlCapabilities* testStruct = [[SDLRemoteControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.seatControlCapabilities).to(equal([@[someSeatControlCapabilities] copy])); expect(testStruct.climateControlCapabilities).to(equal([@[someClimateControlCapabilities] copy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSISDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSISDataSpec.m index 6803917cb..7e82d7cf9 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSISDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSISDataSpec.m @@ -54,8 +54,10 @@ SDLRPCParameterNameStationIDNumber:someID, SDLRPCParameterNameStationMessage:@"message" } mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSISData* testStruct = [[SDLSISData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.stationShortName).to(equal(@"short")); expect(testStruct.stationIDNumber).to(equal(someID)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLScreenParamsSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLScreenParamsSpec.m index 421272ba4..6f730982a 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLScreenParamsSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLScreenParamsSpec.m @@ -33,7 +33,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary *dict = [@{SDLRPCParameterNameResolution:resolution, SDLRPCParameterNameTouchEventAvailable:capabilities} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLScreenParams* testStruct = [[SDLScreenParams alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.resolution).to(equal(resolution)); expect(testStruct.touchEventAvailable).to(equal(capabilities)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m index ed1cb779b..bb320be41 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlCapabilitiesSpec.m @@ -117,7 +117,10 @@ SDLRPCParameterNameMassageCushionFirmnessAvailable:@NO, SDLRPCParameterNameMemoryAvailable:@NO } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSeatControlCapabilities *testStruct = [[SDLSeatControlCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.moduleName).to(equal(@"moduleName")); expect(testStruct.heatingEnabledAvailable).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m index f7b75b357..ee3a4638e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatControlDataSpec.m @@ -126,7 +126,10 @@ SDLRPCParameterNameMassageCushionFirmness:[@[massageCushionFirmness] mutableCopy], SDLRPCParameterNameMemory:seatMemoryAction } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSeatControlData *testStruct = [[SDLSeatControlData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.id).to(equal(SDLSupportedSeatDriver)); expect(testStruct.heatingEnabled).to(equal(@NO)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m index aaeece688..1d5573ebc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSeatMemoryActionSpec.m @@ -41,7 +41,10 @@ SDLRPCParameterNameLabel:@"none", SDLRPCParameterNameAction: SDLSeatMemoryActionTypeNone } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSeatMemoryAction *testStruct = [[SDLSeatMemoryAction alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.id).to(equal(@54)); expect(testStruct.action).to(equal(SDLSeatMemoryActionTypeNone)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m index 41b685e31..c5bb0a4fa 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSingleTireStatusSpec.m @@ -33,7 +33,10 @@ SDLRPCParameterNameTPMS: SDLTPMSLow, SDLRPCParameterNamePressure: @67.78 }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSingleTireStatus* testStruct = [[SDLSingleTireStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.status).to(equal(SDLComponentVolumeStatusLow)); expect(testStruct.monitoringSystemStatus).to(equal(SDLTPMSLow)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonCapabilitiesSpec.m index 131ddebf1..3e4397e75 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonCapabilitiesSpec.m @@ -33,7 +33,10 @@ SDLRPCParameterNameLongPressAvailable:@YES, SDLRPCParameterNameUpDownAvailable:@NO, SDLRPCParameterNameImageSupported:@NO} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSoftButtonCapabilities* testStruct = [[SDLSoftButtonCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.shortPressAvailable).to(equal(@NO)); expect(testStruct.longPressAvailable).to(equal(@YES)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonSpec.m index 6c637bc38..0c4eb1b44 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSoftButtonSpec.m @@ -45,7 +45,10 @@ SDLRPCParameterNameIsHighlighted:@YES, SDLRPCParameterNameSoftButtonId:@5423, SDLRPCParameterNameSystemAction:SDLSystemActionKeepContext} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSoftButton* testStruct = [[SDLSoftButton alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.type).to(equal(SDLSoftButtonTypeImage)); expect(testStruct.text).to(equal(@"Button")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStartTimeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStartTimeSpec.m index f4ba0eacd..704d059dc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStartTimeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStartTimeSpec.m @@ -33,7 +33,10 @@ NSDictionary *dict = @{SDLRPCParameterNameHours:@(testHours), SDLRPCParameterNameMinutes:@(testMinutes), SDLRPCParameterNameSeconds:@(testSeconds)}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLStartTime *testStruct = [[SDLStartTime alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.hours).to(equal(@(testHours))); expect(testStruct.minutes).to(equal(@(testMinutes))); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStationIDNumberSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStationIDNumberSpec.m index 92390aab4..b0ee6efc5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStationIDNumberSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLStationIDNumberSpec.m @@ -36,8 +36,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameCountryCode:@91, SDLRPCParameterNameFCCFacilityId:@23 } mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLStationIDNumber* testStruct = [[SDLStationIDNumber alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.countryCode).to(equal(@91)); expect(testStruct.fccFacilityId).to(equal(@23)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSyncMsgVersionSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSyncMsgVersionSpec.m index f8bc93df5..061e72072 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSyncMsgVersionSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSyncMsgVersionSpec.m @@ -30,7 +30,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameMajorVersion:@4, SDLRPCParameterNameMinorVersion:@532, SDLRPCParameterNamePatchVersion:@12} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSyncMsgVersion* testStruct = [[SDLSyncMsgVersion alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.majorVersion).to(equal(@4)); expect(testStruct.minorVersion).to(equal(@532)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m index c759058d8..ea41d0163 100755 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLSystemCapabilitySpec.m @@ -62,7 +62,10 @@ SDLRPCParameterNameRemoteControlCapability:testRemoteControlCapabilities, SDLRPCParameterNameVideoStreamingCapability:testVideoStreamingCapability }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLSystemCapability *testStruct = [[SDLSystemCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.systemCapabilityType).to(equal(SDLSystemCapabilityTypeNavigation)); expect(testStruct.appServicesCapabilities).to(equal(testAppServicesCapabilities)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m index 3111d04a0..c5418c6e6 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTTSChunkSpec.m @@ -32,7 +32,10 @@ it(@"should correctly initialize with initWithDictionary", ^{ NSDictionary* dict = @{SDLRPCParameterNameText: testText, SDLRPCParameterNameType: testCapabilities}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testStruct = [[SDLTTSChunk alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.text).to(equal(testText)); expect(testStruct.type).to(equal(testCapabilities)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemperatureSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemperatureSpec.m index 3e234d098..32e23e50e 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemperatureSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemperatureSpec.m @@ -27,7 +27,10 @@ NSMutableDictionary* dict = [@{SDLRPCParameterNameUnit : SDLTemperatureUnitCelsius , SDLRPCParameterNameValue:@30 } mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTemperature* testStruct = [[SDLTemperature alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.unit).to(equal(SDLTemperatureUnitCelsius)); expect(testStruct.value).to(equal(@30)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemplateColorSchemeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemplateColorSchemeSpec.m index f52354d7b..09315c1c5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemplateColorSchemeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTemplateColorSchemeSpec.m @@ -54,7 +54,10 @@ NSDictionary *dict = @{SDLRPCParameterNameRed: @0, SDLRPCParameterNameGreen: @100, SDLRPCParameterNameBlue: @255}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRGBColor *testStruct = [[SDLRGBColor alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.red).to(equal(@0)); expect(testStruct.green).to(equal(@100)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m index 983ec47a1..330d53a3f 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTextFieldSpec.m @@ -36,7 +36,10 @@ SDLRPCParameterNameCharacterSet:SDLCharacterSetType5, SDLRPCParameterNameWidth:@111, SDLRPCParameterNameRows:@4} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTextField* testStruct = [[SDLTextField alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.name).to(equal(SDLTextFieldNameTertiaryText)); expect(testStruct.characterSet).to(equal(SDLCharacterSetType5)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m index 67243d863..1787e04c9 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTireStatusSpec.m @@ -51,7 +51,10 @@ SDLRPCParameterNameRightRear:tire4, SDLRPCParameterNameInnerLeftRear:tire5, SDLRPCParameterNameInnerRightRear:tire6} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTireStatus* testStruct = [[SDLTireStatus alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.pressureTelltale).to(equal(SDLWarningLightStatusOff)); expect(testStruct.leftFront).to(equal(tire1)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchCoordSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchCoordSpec.m index c0dcee58a..b2cbcda17 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchCoordSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchCoordSpec.m @@ -27,7 +27,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary *dict = [@{SDLRPCParameterNameX:@67, SDLRPCParameterNameY:@362} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTouchCoord* testStruct = [[SDLTouchCoord alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.x).to(equal(@67)); expect(testStruct.y).to(equal(@362)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventCapabilitiesSpec.m index e54ec7b26..aaf9137d7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventCapabilitiesSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventCapabilitiesSpec.m @@ -30,7 +30,10 @@ NSMutableDictionary *dict = [@{SDLRPCParameterNamePressAvailable:@YES, SDLRPCParameterNameMultiTouchAvailable:@NO, SDLRPCParameterNameDoublePressAvailable:@NO} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTouchEventCapabilities* testStruct = [[SDLTouchEventCapabilities alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.pressAvailable).to(equal(@YES)); expect(testStruct.multiTouchAvailable).to(equal(@NO)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventSpec.m index 1939c356e..85c35feeb 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTouchEventSpec.m @@ -33,7 +33,10 @@ NSMutableDictionary *dict = [@{SDLRPCParameterNameId:@3, SDLRPCParameterNameTS:[@[@23, @52, @41345234] mutableCopy], SDLRPCParameterNameCoordinate:[@[coord] mutableCopy]} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTouchEvent* testStruct = [[SDLTouchEvent alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.touchEventId).to(equal(@3)); expect(testStruct.timeStamp).to(equal([@[@23, @52, @41345234] mutableCopy])); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTurnSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTurnSpec.m index defce62e7..22b76fc33 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTurnSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLTurnSpec.m @@ -30,7 +30,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary *dict = [@{SDLRPCParameterNameNavigationText:@"NAVTEXT", SDLRPCParameterNameTurnIcon:image} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLTurn* testStruct = [[SDLTurn alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.navigationText).to(equal(@"NAVTEXT")); expect(testStruct.turnIcon).to(equal(image)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleDataResultSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleDataResultSpec.m index 0c1c6c899..8a504b85b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleDataResultSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleDataResultSpec.m @@ -29,7 +29,10 @@ it(@"Should get correctly when initialized", ^ { NSMutableDictionary* dict = [@{SDLRPCParameterNameDataType:SDLVehicleDataTypeAirbagStatus, SDLRPCParameterNameResultCode:SDLVehicleDataResultCodeDisallowed} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLVehicleDataResult* testStruct = [[SDLVehicleDataResult alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.dataType).to(equal(SDLVehicleDataTypeAirbagStatus)); expect(testStruct.resultCode).to(equal(SDLVehicleDataResultCodeDisallowed)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m index a4f3efa0d..cf7582276 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVehicleTypeSpec.m @@ -33,7 +33,10 @@ SDLRPCParameterNameModel:@"Model", SDLRPCParameterNameModelYear:@"3.141*10^36", SDLRPCParameterNameTrim:@"AE"} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLVehicleType* testStruct = [[SDLVehicleType alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.make).to(equal(@"Make")); expect(testStruct.model).to(equal(@"Model")); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m index 274d625d5..7c83fe99b 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingCapabilitySpec.m @@ -43,8 +43,10 @@ SDLRPCParameterNameMaxBitrate: maxBitrate, SDLRPCParameterNameSupportedFormats: formatArray, SDLRPCParameterNameHapticSpatialDataSupported: hapticDataSupported} mutableCopy]; - +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLVideoStreamingCapability* testStruct = [[SDLVideoStreamingCapability alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.preferredResolution).to(equal(resolution)); expect(testStruct.maxBitrate).to(equal(maxBitrate)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingFormatSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingFormatSpec.m index a6b386738..08d53cde8 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingFormatSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVideoStreamingFormatSpec.m @@ -22,7 +22,10 @@ it(@"Should get correctly when initialized with a dictionary", ^ { NSMutableDictionary* dict = [@{SDLRPCParameterNameVideoProtocol: SDLVideoStreamingProtocolRAW, SDLRPCParameterNameVideoCodec: SDLVideoStreamingCodecH264} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLVideoStreamingFormat* testStruct = [[SDLVideoStreamingFormat alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.protocol).to(equal(SDLVideoStreamingProtocolRAW)); expect(testStruct.codec).to(equal(SDLVideoStreamingCodecH264)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVrHelpItemSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVrHelpItemSpec.m index ea2153359..f3ae63c5c 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVrHelpItemSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLVrHelpItemSpec.m @@ -34,7 +34,10 @@ NSMutableDictionary *dict = [@{SDLRPCParameterNameText:@"DON'T PANIC", SDLRPCParameterNameImage:image, SDLRPCParameterNamePosition:@42} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLVRHelpItem* testStruct = [[SDLVRHelpItem alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.text).to(equal(@"DON'T PANIC")); expect(testStruct.image).to(equal(image)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherAlertSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherAlertSpec.m index e4c34b529..594988bd5 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherAlertSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherAlertSpec.m @@ -57,7 +57,10 @@ SDLRPCParameterNameSeverity:testSeverity, SDLRPCParameterNameTimeIssued:testTimeIssued }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLWeatherAlert *testStruct = [[SDLWeatherAlert alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.title).to(equal(testTitle)); expect(testStruct.summary).to(equal(testSummary)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherDataSpec.m index f46cb0539..911e92935 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherDataSpec.m @@ -127,7 +127,10 @@ SDLRPCParameterNameVisibility:@(testVisibility), SDLRPCParameterNameWeatherIcon:testWeatherIcon }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLWeatherData *testStruct = [[SDLWeatherData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.currentTemperature).to(equal(testCurrentTemp)); expect(testStruct.temperatureHigh).to(equal(testTempHigh)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceDataSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceDataSpec.m index dadf888a4..cd5360074 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceDataSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceDataSpec.m @@ -29,6 +29,8 @@ testLocation = [[SDLLocationDetails alloc] init]; testLocation.locationName = @"testLocationName"; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLWeatherData *testWeatherDataA = [[SDLWeatherData alloc] initWithDictionary:@{SDLRPCParameterNameWeatherSummary:@"testWeatherDataA"}]; SDLWeatherData *testWeatherDataB = [[SDLWeatherData alloc] initWithDictionary:@{SDLRPCParameterNameWeatherSummary:@"testWeatherDataB"}]; SDLWeatherData *testWeatherDataC = [[SDLWeatherData alloc] initWithDictionary:@{SDLRPCParameterNameWeatherSummary:@"testWeatherDataC"}]; @@ -38,6 +40,7 @@ testMultidayForecast = @[testWeatherDataA, testWeatherDataC]; SDLWeatherAlert *testWeatherAlertA = [[SDLWeatherAlert alloc] initWithDictionary:@{SDLRPCParameterNameTitle:@"testWeatherAlertA"}]; +#pragma clang diagnostic pop testAlerts = @[testWeatherAlertA]; }); @@ -66,7 +69,10 @@ SDLRPCParameterNameMultidayForecast:testMultidayForecast, SDLRPCParameterNameAlerts:testAlerts }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLWeatherServiceData *testStruct = [[SDLWeatherServiceData alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.location).to(equal(testLocation)); expect(testStruct.currentForecast).to(equal(testCurrentForecast)); diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceManifestSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceManifestSpec.m index 1a495d633..666b680d7 100644 --- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceManifestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWeatherServiceManifestSpec.m @@ -48,7 +48,10 @@ SDLRPCParameterNameMaxMinutelyForecastAmount:@(testMaxMinutelyForecastAmount), SDLRPCParameterNameWeatherForLocationSupported:@(testWeatherForLocationSupported) }; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLWeatherServiceManifest *testStruct = [[SDLWeatherServiceManifest alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop expect(testStruct.currentForecastSupported).to(equal(testCurrentForecastSupported)); expect(testStruct.maxMultidayForecastAmount).to(equal(testMaxMultidayForecastAmount)); diff --git a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m index 0ace806a0..415c43bcc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m @@ -15,16 +15,22 @@ describe(@"Readonly Property Tests", ^ { it(@"Should get name correctly when initialized with name", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@"Poorly Named"]; +#pragma clang diagnostic pop expect(testMessage.name).to(equal(@"Poorly Named")); }); it(@"Should get correctly when initialized with dictionary", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithDictionary:[@{SDLRPCParameterNameNotification: @{SDLRPCParameterNameParameters: @{@"name":@"George"}, SDLRPCParameterNameOperationName:@"Poorly Named"}} mutableCopy]]; +#pragma clang diagnostic pop expect(testMessage.name).to(equal(@"Poorly Named")); expect(testMessage.messageType).to(equal(SDLRPCParameterNameNotification)); @@ -33,62 +39,86 @@ describe(@"Parameter Tests", ^ { it(@"Should set and get correctly", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@""]; [testMessage setParameters:@"ADogAPanicInAPagoda" value:@"adogaPAnIcinaPAgoDA"]; +#pragma clang diagnostic pop - expect([testMessage getParameters:@"ADogAPanicInAPagoda"]).to(equal(@"adogaPAnIcinaPAgoDA")); + expect(testMessage.parameters[@"ADogAPanicInAPagoda"]).to(equal(@"adogaPAnIcinaPAgoDA")); }); it(@"Should get correctly when initialized", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithDictionary:[@{SDLRPCParameterNameResponse: @{SDLRPCParameterNameParameters: @{@"age":@25}, SDLRPCParameterNameOperationName:@"Nameless"}} mutableCopy]]; +#pragma clang diagnostic pop - expect([testMessage getParameters:@"age"]).to(equal(@25)); + expect(testMessage.parameters[@"age"]).to(equal(@25)); }); it(@"Should be nil if not set", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@""]; - expect([testMessage getParameters:@"ADogAPanicInAPagoda"]).to(beNil()); + expect(testMessage.parameters[@"ADogAPanicInAPagoda"]).to(beNil()); +#pragma clang diagnostic pop }); }); describe(@"FunctionName Tests", ^ { it(@"Should set and get correctly", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@""]; [testMessage setFunctionName:@"Functioning"]; +#pragma clang diagnostic pop - expect([testMessage getFunctionName]).to(equal(@"Functioning")); + expect(testMessage.name).to(equal(@"Functioning")); }); it(@"Should get correctly when initialized", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithDictionary:[@{SDLRPCParameterNameRequest: @{SDLRPCParameterNameParameters: @{@"age":@25}, SDLRPCParameterNameOperationName:@"DoNothing"}} mutableCopy]]; +#pragma clang diagnostic pop - expect([testMessage getFunctionName]).to(equal(@"DoNothing")); - + expect(testMessage.name).to(equal(@"DoNothing")); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" testMessage = [[SDLRPCMessage alloc] initWithName:@"DoSomething"]; +#pragma clang diagnostic pop - expect([testMessage getFunctionName]).to(equal(@"DoSomething")); + expect(testMessage.name).to(equal(@"DoSomething")); }); it(@"Should be nil if not set", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithDictionary:[@{SDLRPCParameterNameNotification: @{SDLRPCParameterNameParameters: @{}}} mutableCopy]]; - expect([testMessage getFunctionName]).to(beNil()); +#pragma clang diagnostic pop + expect(testMessage.name).to(beNil()); }); }); describe(@"BulkDataTests", ^ { it(@"Should set and get correctly", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@""]; +#pragma clang diagnostic pop const char* testString = "ImportantData"; testMessage.bulkData = [NSData dataWithBytes:testString length:strlen(testString)]; @@ -97,16 +127,22 @@ }); it(@"Should get correctly when initialized", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithDictionary:[@{SDLRPCParameterNameNotification: @{SDLRPCParameterNameParameters: @{}}, SDLRPCParameterNameBulkData:[NSData dataWithBytes:"ImageData" length:strlen("ImageData")]} mutableCopy]]; +#pragma clang diagnostic pop expect(testMessage.bulkData).to(equal([NSData dataWithBytes:"ImageData" length:strlen("ImageData")])); }); it(@"Should be nil if not set", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@""]; +#pragma clang diagnostic pop expect(testMessage.bulkData).to(beNil()); }); diff --git a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCRequestSpec.m b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCRequestSpec.m index 1846e0700..a8f771928 100644 --- a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCRequestSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCRequestSpec.m @@ -14,7 +14,10 @@ describe(@"Getter/Setter Tests", ^ { it(@"Should set and get correctly", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCRequest* testRequest = [[SDLRPCRequest alloc] initWithName:@"A Legitimate Request"]; +#pragma clang diagnostic pop testRequest.correlationID = @14641; @@ -22,4 +25,4 @@ }); }); -QuickSpecEnd \ No newline at end of file +QuickSpecEnd diff --git a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCResponseSpec.m b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCResponseSpec.m index edb1a3cab..637c7f3ee 100644 --- a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCResponseSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCResponseSpec.m @@ -17,7 +17,10 @@ describe(@"Getter/Setter Tests", ^ { it(@"Should set and get correctly", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCResponse* response = [[SDLRPCResponse alloc] initWithName:@"A Legitimate Response"]; +#pragma clang diagnostic pop response.correlationID = @14641; response.success = @YES; @@ -38,9 +41,12 @@ SDLRPCParameterNameInfo:@"Test Info"}, SDLRPCParameterNameCorrelationId:@1004, SDLRPCParameterNameOperationName:SDLRPCParameterNameResponse}} mutableCopy]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" SDLRPCResponse* testResponse = [[SDLRPCResponse alloc] initWithDictionary:dict]; +#pragma clang diagnostic pop - expect(testResponse.getFunctionName).to(equal(SDLRPCParameterNameResponse)); + expect(testResponse.name).to(equal(SDLRPCParameterNameResponse)); expect(testResponse.correlationID).to(equal(@1004)); expect(testResponse.success).to(equal(@YES)); expect(testResponse.resultCode).to(equal(SDLRPCParameterNameSuccess)); diff --git a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCStructSpec.m b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCStructSpec.m index 1b2c4d348..8dd6eaf99 100644 --- a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCStructSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCStructSpec.m @@ -14,10 +14,13 @@ describe(@"SerializeAsDictionary Tests", ^ { it(@"Should serialize correctly", ^ { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" NSMutableDictionary *dict = [@{@"Key":@"Value", @"Answer":@42, @"Struct":[[SDLRPCStruct alloc] initWithDictionary:[@{@"Array":@[@1, @1, @1, @1]} mutableCopy]]} mutableCopy]; SDLRPCStruct* testStruct = [[SDLRPCStruct alloc] initWithDictionary:dict]; expect([testStruct serializeAsDictionary:2]).to(equal([@{@"Key":@"Value", @"Answer":@42, @"Struct":@{@"Array":@[@1, @1, @1, @1]}} mutableCopy])); +#pragma clang diagnostic pop }); }); From 283ea385ee6c884263ac68931c0bbcd970fcddaf Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 12:11:26 -0400 Subject: [PATCH 041/179] Sessions are now started --- SmartDeviceLink/SDLIAPTransport.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 5a0ad5e94..347f6d3bd 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -40,7 +40,7 @@ @interface SDLIAPTransport () Date: Tue, 14 May 2019 13:30:51 -0400 Subject: [PATCH 042/179] Fixed test cases --- SmartDeviceLink/SDLIAPControlSession.m | 10 ++--- .../SDLIAPControlSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPDataSession.m | 12 +++--- SmartDeviceLink/SDLIAPDataSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPSession.m | 37 ++++++++++++++----- SmartDeviceLink/SDLIAPTransport.m | 9 ++--- .../iAP/SDLIAPControlSessionSpec.m | 20 +++++----- .../iAP/SDLIAPDataSessionSpec.m | 26 +++++-------- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 8 ++-- 9 files changed, 69 insertions(+), 57 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index ec14b7d39..18065439e 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -50,7 +50,7 @@ - (void)startSession { if (_session == nil) { SDLLogW(@"There is no control session in progress, attempting to create a new control session."); if (self.delegate == nil) { return; } - [self.delegate retryControlSession:self.session]; + [self.delegate retryControlSession]; } else { SDLLogD(@"Starting a control session with accessory (%@)", self.session.accessory.name); EAAccessory *accessory = self.session.accessory; @@ -64,7 +64,7 @@ - (void)startSession { SDLLogW(@"Control session failed to setup with accessory: %@. Attempting to create a new control session", accessory); [self stopSession]; if (self.delegate == nil) { return; } - [self.delegate retryControlSession:self.session]; + [self.delegate retryControlSession]; } else { SDLLogD(@"Waiting for the protocol string from Core, setting timer for %d seconds", ProtocolIndexTimeoutSeconds); self.protocolIndexTimer = [self sdl_createProtocolIndexTimer]; @@ -119,7 +119,7 @@ - (SDLStreamEndHandler)sdl_controlStreamEnded { [strongSelf stopSession]; if (strongSelf.delegate == nil) { return; } - [strongSelf.delegate retryControlSession:strongSelf.session]; + [strongSelf.delegate retryControlSession]; } }; } @@ -182,7 +182,7 @@ - (SDLStreamErrorHandler)sdl_controlStreamErrored { [strongSelf stopSession]; if (self.delegate == nil) { return; } - [self.delegate retryControlSession:self.session]; + [self.delegate retryControlSession]; }; } @@ -203,7 +203,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { [strongSelf.session stop]; if (strongSelf.delegate == nil) { return; } - [strongSelf.delegate retryControlSession:strongSelf.session]; + [strongSelf.delegate retryControlSession]; }; protocolIndexTimer.elapsedBlock = elapsedBlock; diff --git a/SmartDeviceLink/SDLIAPControlSessionDelegate.h b/SmartDeviceLink/SDLIAPControlSessionDelegate.h index 930d8688a..c9a62e389 100644 --- a/SmartDeviceLink/SDLIAPControlSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPControlSessionDelegate.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol SDLIAPControlSessionDelegate -- (void)retryControlSession:(nullable SDLIAPSession *)controlSession; +- (void)retryControlSession; - (void)controlSession:(SDLIAPSession *)controlSession didGetProtocolString:(NSString *)protocolString forConnectedAccessory:(EAAccessory *)accessory; @end diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 4a69f341b..185b857b1 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -45,7 +45,7 @@ - (void)startSession { if (_session == nil) { SDLLogW(@"Failed to setup data session"); if (self.delegate == nil) { return; } - [self.delegate retryDataSession:self.session]; + [self.delegate retryDataSession]; } else { SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, self.session.protocol); SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; @@ -58,7 +58,7 @@ - (void)startSession { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.session.accessory); [self stopSession]; if (self.delegate == nil) { return; } - [self.delegate retryDataSession:self.session]; + [self.delegate retryDataSession]; } } } @@ -70,8 +70,8 @@ - (void)stopSession { } SDLLogD(@"Stopping the data session"); - [self.session stop]; - self.session.streamDelegate = nil; + [self.session stop]; // Calling stop but easession may not yet be set to `nil` + self.session.streamDelegate = nil; // self.session = nil; } @@ -98,7 +98,7 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { [strongSelf stopSession]; if (self.delegate == nil) { return; } - [self.delegate retryDataSession:self.session]; + [self.delegate retryDataSession]; }); // To prevent deadlocks the handler must return to the runloop and not block the thread @@ -155,7 +155,7 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { [strongSelf stopSession]; if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { if (self.delegate == nil) { return; } - [self.delegate retryDataSession:strongSelf.session]; + [self.delegate retryDataSession]; } }); diff --git a/SmartDeviceLink/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/SDLIAPDataSessionDelegate.h index 491f05414..8f5ea5039 100644 --- a/SmartDeviceLink/SDLIAPDataSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPDataSessionDelegate.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol SDLIAPDataSessionDelegate -- (void)retryDataSession:(nullable SDLIAPSession *)dataSession; +- (void)retryDataSession; - (void)dataReceived:(NSData *)dataIn; @end diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 2fedc3679..4de18f9aa 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -60,18 +60,19 @@ - (BOOL)sdl_startWithSession:(EASession *)session { SDLLogE(@"Error creating the session object"); return NO; } else { - SDLLogD(@"Created the session object successfully"); __strong typeof(self) strongSelf = weakSelf; strongSelf.streamDelegate.streamErrorHandler = [self streamErroredHandler]; strongSelf.streamDelegate.streamOpenHandler = [self streamOpenedHandler]; if (self.isDataSession) { + SDLLogD(@"Created the data session successfully"); self.streamDelegate.streamHasSpaceHandler = [self sdl_streamHasSpaceHandler]; // Start I/O event loop processing events in iAP channel self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil]; [self.ioStreamThread setName:IOStreamThreadName]; [self.ioStreamThread start]; } else { - // Set up control session -- no need for its own thread + // No need for its own thread as only a small amount of data will be transmitted before control session is destroyed + SDLLogD(@"Created the control session successfully"); [self startStream:self.easession.outputStream]; [self startStream:self.easession.inputStream]; } @@ -91,9 +92,12 @@ - (void)stop { - (void)sdl_stop { NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); + if (self.isDataSession) { + SDLLogV(@"Stopping the data session"); [self.ioStreamThread cancel]; + // Waiting on the I/O threads of the data session to close [self sdl_isIOThreadCanceled:self.canceledSemaphore completionHandler:^(BOOL success) { if (success == NO) { SDLLogE(@"About to destroy a thread that has not yet closed."); @@ -103,13 +107,19 @@ - (void)sdl_stop { self.easession = nil; }]; } else { - // Stop control session + SDLLogV(@"Stopping the control session"); [self stopStream:self.easession.outputStream]; [self stopStream:self.easession.inputStream]; self.easession = nil; } } +/** + * Wait for the data session to detroy its input and output streams. The data EASession can not be destroyed until both streams have closed. + * + * @param canceledSemaphore When the canceled semaphore is released, the data session's input and output streams have been destroyed. + * @param completionHandler Returns whether or not the data session's I/O streams were closed successfully. + */ - (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completionHandler:(void (^)(BOOL success))completionHandler { long lWait = dispatch_semaphore_wait(canceledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(StreamThreadWaitSecs * NSEC_PER_SEC))); if (lWait == 0) { @@ -135,8 +145,14 @@ - (void)sendData:(NSData *)data { } - (void)sdl_dequeueAndWriteToOutputStream { + if ([self.ioStreamThread isCancelled]) { + SDLLogV(@"Attempted to send data on I/O thread but the thread is cancelled."); + return; + } + NSOutputStream *ostream = self.easession.outputStream; if (!ostream.hasSpaceAvailable) { + SDLLogV(@"Attempted to send data with output stream but there is no space available."); return; } @@ -177,7 +193,7 @@ - (void)sdl_handleOutputStreamWriteError:(NSError *)error { // Data session I/O thread - (void)sdl_accessoryEventLoop { @autoreleasepool { - NSAssert(self.easession, @"_session must be assigned before calling"); + NSAssert(self.easession, @"Session must be assigned before calling"); if (!self.easession) { return; @@ -186,15 +202,16 @@ - (void)sdl_accessoryEventLoop { [self startStream:self.easession.inputStream]; [self startStream:self.easession.outputStream]; - SDLLogD(@"Starting the accessory event loop"); + SDLLogD(@"Starting the accessory event loop on thread: %@", NSThread.currentThread.name); + while (!NSThread.currentThread.cancelled) { // Enqueued data will be written to and read from the streams in the runloop [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25f]]; } - SDLLogD(@"Closing the accessory session for id: %tu, name: %@", self.easession.accessory.connectionID, self.easession.accessory.name); + SDLLogD(@"Closing the accessory event loop on thread: %@", NSThread.currentThread.name); - // Close I/O streams of the iAP session + // Close I/O streams of the data session. When the streams are closed. Notify the thread that it can close [self sdl_closeSession]; dispatch_semaphore_signal(self.canceledSemaphore); } @@ -206,7 +223,7 @@ - (void)sdl_closeSession { return; } - SDLLogD(@"Close EASession for accessory id: %tu, name: %@", self.easession.accessory.connectionID, self.easession.accessory.name); + SDLLogD(@"Closing EASession for accessory connection id: %tu, name: %@", self.easession.accessory.connectionID, self.easession.accessory.name); [self stopStream:[self.easession inputStream]]; [self stopStream:[self.easession outputStream]]; @@ -243,10 +260,10 @@ - (void)stopStream:(NSStream *)stream { NSUInteger status2 = stream.streamStatus; if (status2 == NSStreamStatusClosed) { if (stream == [self.easession inputStream]) { - SDLLogD(@"Input Stream Closed"); + SDLLogD(@"Input stream closed"); self.isInputStreamOpen = NO; } else if (stream == [self.easession outputStream]) { - SDLLogD(@"Output Stream Closed"); + SDLLogD(@"Output stream closed"); self.isOutputStreamOpen = NO; } } diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 347f6d3bd..220458ee9 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -40,7 +40,7 @@ @interface SDLIAPTransport () Date: Tue, 14 May 2019 13:41:00 -0400 Subject: [PATCH 043/179] Fixed documentation for control session class --- SmartDeviceLink/SDLIAPControlSession.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 76b209ed7..667151802 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -18,7 +18,7 @@ NS_ASSUME_NONNULL_BEGIN /** - * A control session is used to get the unique protocol string needed to create a session with Core. The control session is only used with legacy head units that do not support the multisession protocol. The multisession protocol allows multiple apps to connect over the same protocol string. A control session is needed because each app on the device needs to connect to the accessory using a unique protocol string. + * The communications channel between the app and the SDL enabled accessory. The control session is used to get the unique protocol string needed to create a session with Core. The control session is only used with legacy head units that do not support the multisession protocol (the multisession protocol allows multiple apps to connect over the same protocol string). A control session is needed because each SDL enabled app needs to connect to the accessory using a unique protocol string. * * When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core. */ From 32970a376a5adaed7bcaaea5995ec6385bf47201 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 13:42:58 -0400 Subject: [PATCH 044/179] Fixed control session checking timer for `nil` --- SmartDeviceLink/SDLIAPControlSession.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 18065439e..d76a2e7b8 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -95,7 +95,7 @@ - (void)sdl_destroySession { } - (void)startSessionTimer { - if (!self.protocolIndexTimer) { return; } + if (self.protocolIndexTimer == nil) { return; } [self.protocolIndexTimer start]; } From 816e889521b69d5c88a0e693220f49e40eb348bc Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 13:45:51 -0400 Subject: [PATCH 045/179] Fixed line spacing --- SmartDeviceLink/SDLIAPDataSession.m | 1 + 1 file changed, 1 insertion(+) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 185b857b1..6e4d6bd1e 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -93,6 +93,7 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { SDLLogD(@"Data session is nil"); return; } + // The handler will be called on the IO thread, but the session stop method must be called on the main thread dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; From ce82bdc48d00b34774638d1162a0d7bcd9efa1ca Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 14:44:50 -0400 Subject: [PATCH 046/179] Refactoring control and data sessions --- SmartDeviceLink/SDLIAPControlSession.h | 4 +--- SmartDeviceLink/SDLIAPDataSession.h | 1 + SmartDeviceLink/SDLIAPDataSession.m | 4 ++-- SmartDeviceLink/SDLIAPTransport.m | 29 +++++++++++++------------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 667151802..46836d11c 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -7,11 +7,9 @@ // #import -#import "SDLIAPSessionDelegate.h" -@class EAAccessory; -@class SDLIAPControlSessionDelegate; @class SDLIAPSession; +@class EAAccessory; @protocol SDLIAPControlSessionDelegate; diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index 3573ddedf..e3e9a68fa 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -12,6 +12,7 @@ @protocol SDLIAPDataSessionDelegate; + NS_ASSUME_NONNULL_BEGIN @interface SDLIAPDataSession : NSObject diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 6e4d6bd1e..2a6541a0e 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -93,7 +93,7 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { SDLLogD(@"Data session is nil"); return; } - + // The handler will be called on the IO thread, but the session stop method must be called on the main thread dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; @@ -154,7 +154,7 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { SDLLogE(@"Data stream error"); dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; - if (![LegacyProtocolString isEqualToString:strongSelf.session.protocol]) { + if (![strongSelf.session.protocol isEqualToString:LegacyProtocolString]) { if (self.delegate == nil) { return; } [self.delegate retryDataSession]; } diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 220458ee9..2d035a1e0 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -41,19 +41,22 @@ @implementation SDLIAPTransport - (instancetype)init { SDLLogV(@"SDLIAPTransport init"); - if (self = [super init]) { - _sessionSetupInProgress = NO; - _dataSession = nil; - _controlSession = nil; - _retryCounter = 0; - _accessoryConnectDuringActiveSession = NO; - - // Get notifications if an accessory connects in future - [self sdl_startEventListening]; - - // Wait for setup to complete before scanning for accessories + self = [super init]; + if (!self) { + return nil; } - + + _sessionSetupInProgress = NO; + _dataSession = nil; + _controlSession = nil; + _retryCounter = 0; + _accessoryConnectDuringActiveSession = NO; + + // Get notifications if an accessory connects in future + [self sdl_startEventListening]; + + // Wait for setup to complete before scanning for accessories + return self; } @@ -578,8 +581,6 @@ - (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolStr /** * Called when the control session should be retried. - * - * @param controlSession The control session */ - (void)retryControlSession { [self sdl_retryEstablishSession]; From bb2f2db53211a9e794c605e167f357dc8182ff0c Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 14:48:19 -0400 Subject: [PATCH 047/179] Refactored SDLIAPTransport class --- SmartDeviceLink/SDLIAPTransport.m | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 2d035a1e0..4db33ba28 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -196,7 +196,7 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { } else if (accessory.connectionID == self.dataSession.connectionID) { // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); - [self sdl_destroySession]; + [self sdl_destroyTransport]; } else if (accessory.connectionID == self.controlSession.connectionID) { // The data session has yet to be established so we will only destroy the control session. SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber); @@ -207,7 +207,7 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { } else if (accessory.connectionID == self.dataSession.connectionID) { // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); - [self sdl_destroySession]; + [self sdl_destroyTransport]; } else { SDLLogV(@"Accessory (%@, %@) disconnecting during an unknown session", accessory.name, accessory.serialNumber); } @@ -216,7 +216,7 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { /** * Tells the lifecycle manager that the data session has been closed. */ -- (void)sdl_destroySession { +- (void)sdl_destroyTransport { self.retryCounter = 0; self.sessionSetupInProgress = NO; [self disconnect]; @@ -284,12 +284,9 @@ - (void)connect { - (void)disconnect { // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications [self sdl_stopEventListening]; - if (self.controlSession != nil) { - [self.controlSession stopSession]; - } - if (self.dataSession != nil) { - [self.dataSession stopSession]; - } + + [self.controlSession stopSession]; + [self.dataSession stopSession]; } From 3e3e82e93003074268497dbadc4599dd328b3c51 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:07:40 -0400 Subject: [PATCH 048/179] Refactored the SDLIAPTransport class --- SmartDeviceLink/SDLIAPTransport.m | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 4db33ba28..35d8836ec 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -258,10 +258,7 @@ - (void)sdl_applicationDidEnterBackground:(NSNotification *)notification { * @param data The data to be sent to Core */ - (void)sendData:(NSData *)data { - if (self.dataSession.session == nil || !self.dataSession.session.accessory.connected) { - return; - } - + if (!self.dataSession.sessionInProgress) { return; } [self.dataSession.session sendData:data]; } @@ -432,15 +429,11 @@ - (void)sdl_retryEstablishSession { * @param session The current session */ - (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { - SDLLogV(@"%@ I/O streams opened for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); - - if ([ControlProtocolString isEqualToString:session.protocol]) { - if (!self.dataSession.session) { - [self.controlSession startSessionTimer]; - } - } - - if (![ControlProtocolString isEqualToString:session.protocol]) { + if ([session.protocol isEqualToString:ControlProtocolString]) { + SDLLogV(@"Control session I/O streams opened for protocol: %@", session.protocol); + [self.controlSession startSessionTimer]; + } else { + SDLLogV(@"Data session I/O streams opened for protocol: %@", session.protocol); self.sessionSetupInProgress = NO; [self.delegate onTransportConnected]; } @@ -452,12 +445,12 @@ - (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { * @param session The current session */ - (void)onSessionStreamsEnded:(SDLIAPSession *)session { - SDLLogV(@"%@ session I/O streams errored for protocol: %@", ([ControlProtocolString isEqualToString:session.protocol] ? @"Control" : @"Data"), session.protocol); - - if (!self.dataSession.session && [ControlProtocolString isEqualToString:session.protocol]) { - SDLLogV(@"Retrying control session for protocol: %@", session.protocol); + if ([session.protocol isEqualToString:ControlProtocolString]) { + SDLLogV(@"Control session I/O streams errored for protocol: %@. Retrying", session.protocol); [session stop]; [self sdl_retryEstablishSession]; + } else { + SDLLogV(@"Data session I/O streams errored for protocol: %@", session.protocol); } } From 6759cba1a31b85af8b6868471b0f9bc3dea7ef9f Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:37:50 -0400 Subject: [PATCH 049/179] Cleanup starting SDLIAPTransport session --- SmartDeviceLink/SDLIAPTransport.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 35d8836ec..8be68ba7b 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -295,9 +295,9 @@ - (void)disconnect { * @param accessory The accessory to attempt connection with or nil to scan for accessories. */ - (void)sdl_connect:(nullable EAAccessory *)accessory { - if ((self.dataSession == nil || !self.dataSession.isSessionInProgress) && !self.sessionSetupInProgress) { - // We don't have a session are not attempting to set one up, attempt to connect - SDLLogV(@"Data session I/O streams not opened. Starting setup."); + if (!self.dataSession.isSessionInProgress && !self.sessionSetupInProgress) { + // No data session has been established are not attempting to set one up, attempt to connect + SDLLogV(@"No data session in progress. Starting setup."); self.sessionSetupInProgress = YES; [self sdl_establishSessionWithAccessory:accessory]; } else if (self.dataSession.isSessionInProgress) { From 66fc63c51ed1cb84725310ad455e66e713f4cdb8 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:38:06 -0400 Subject: [PATCH 050/179] Add new classes to log file module --- SmartDeviceLink/SDLLogFileModuleMap.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLLogFileModuleMap.m b/SmartDeviceLink/SDLLogFileModuleMap.m index 9af182d88..8f5a8c372 100644 --- a/SmartDeviceLink/SDLLogFileModuleMap.m +++ b/SmartDeviceLink/SDLLogFileModuleMap.m @@ -32,7 +32,7 @@ @implementation SDLLogFileModuleMap } + (SDLLogFileModule *)sdl_transportModule { - return [SDLLogFileModule moduleWithName:@"Transport" files:[NSSet setWithArray:@[@"SDLIAPSession", @"SDLIAPTransport", @"SDLSecondaryTransportManager", @"SDLSecondaryTransportPrimaryProtocolHandler", @"SDLStreamDelegate", @"SDLTCPTransport"]]]; + return [SDLLogFileModule moduleWithName:@"Transport" files:[NSSet setWithArray:@[@"SDLIAPSession", @"SDLIAPTransport", @"SDLIAPDataSession", @"SDLIAPControlSession", @"SDLSecondaryTransportManager", @"SDLSecondaryTransportPrimaryProtocolHandler", @"SDLStreamDelegate", @"SDLTCPTransport"]]]; } + (SDLLogFileModule *)sdl_proxyModule { From 6da019b5dbf274e581a412ec4252c156da55107b Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:38:25 -0400 Subject: [PATCH 051/179] Removed logs from IAPSession class --- SmartDeviceLink/SDLIAPSession.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 4de18f9aa..ade553968 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -94,7 +94,6 @@ - (void)sdl_stop { NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); if (self.isDataSession) { - SDLLogV(@"Stopping the data session"); [self.ioStreamThread cancel]; // Waiting on the I/O threads of the data session to close @@ -107,7 +106,6 @@ - (void)sdl_stop { self.easession = nil; }]; } else { - SDLLogV(@"Stopping the control session"); [self stopStream:self.easession.outputStream]; [self stopStream:self.easession.inputStream]; self.easession = nil; From a4b27910d5d56160a75182165f71ee1cfedb2173 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:39:08 -0400 Subject: [PATCH 052/179] Removed redundant method in IAPControlSession method --- SmartDeviceLink/SDLIAPControlSession.m | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index d76a2e7b8..f744fcb82 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -84,16 +84,6 @@ - (void)stopSession { self.session = nil; } -- (void)sdl_destroySession { - if (self.session == nil || self.isSessionInProgress) { - SDLLogW(@"Control session in progress. Can not destroy"); - return; - } - - SDLLogV(@"Destroying control session"); - self.session = nil; -} - - (void)startSessionTimer { if (self.protocolIndexTimer == nil) { return; } [self.protocolIndexTimer start]; @@ -152,7 +142,6 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce // Destroy the control session as it is no longer needed, and then create the data session. dispatch_sync(dispatch_get_main_queue(), ^{ [strongSelf stopSession]; - [strongSelf sdl_destroySession]; }); if (accessory.isConnected) { From 818fe917baf597e5bec63b8857b5538a54f951e4 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:58:16 -0400 Subject: [PATCH 053/179] Added additional modules to the log file module --- SmartDeviceLink/SDLLogFileModuleMap.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLLogFileModuleMap.m b/SmartDeviceLink/SDLLogFileModuleMap.m index 8f5a8c372..1ce920cb7 100644 --- a/SmartDeviceLink/SDLLogFileModuleMap.m +++ b/SmartDeviceLink/SDLLogFileModuleMap.m @@ -28,7 +28,8 @@ @implementation SDLLogFileModuleMap [self sdl_screenManagerTextAndGraphicModule], [self sdl_screenManagerSoftButtonModule], [self sdl_screenManagerMenuModule], - [self sdl_screenManagerChoiceSetModule]]]; + [self sdl_screenManagerChoiceSetModule], + [self sdl_utilitiesModule]]]; } + (SDLLogFileModule *)sdl_transportModule { From 8dcff48ae0e1c38a2242e8e1b2360fca3145c053 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 15:58:42 -0400 Subject: [PATCH 054/179] Added check if data session is established --- SmartDeviceLink/SDLIAPDataSession.h | 6 ++++++ SmartDeviceLink/SDLIAPDataSession.m | 4 ++++ SmartDeviceLink/SDLIAPTransport.m | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index e3e9a68fa..9eff35888 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -32,6 +32,12 @@ NS_ASSUME_NONNULL_BEGIN */ @property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress; +/** + * Returns whether a connection has been established with the accessory. + */ +@property (assign, nonatomic, readonly, getter=isSessionConnected) BOOL sessionConnected; + + - (instancetype)init NS_UNAVAILABLE; /** diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 2a6541a0e..b24d55a30 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -174,6 +174,10 @@ - (BOOL)isSessionInProgress { return (self.session != nil && !self.session.isStopped); } +- (BOOL)isSessionConnected { + return (self.session != nil && self.session.accessory.isConnected); +} + #pragma mark - Lifecycle Destruction - (void)dealloc { diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 8be68ba7b..c1a927c35 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -295,7 +295,7 @@ - (void)disconnect { * @param accessory The accessory to attempt connection with or nil to scan for accessories. */ - (void)sdl_connect:(nullable EAAccessory *)accessory { - if (!self.dataSession.isSessionInProgress && !self.sessionSetupInProgress) { + if ((self.dataSession == nil || !self.dataSession.isSessionConnected) && !self.sessionSetupInProgress) { // No data session has been established are not attempting to set one up, attempt to connect SDLLogV(@"No data session in progress. Starting setup."); self.sessionSetupInProgress = YES; From 849a7f63f59af1051f72c41b820a94d65622ab0d Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 14 May 2019 16:42:44 -0400 Subject: [PATCH 055/179] Moved Algo logic into its own class updated cell compare to not use subcells as a factor in the hash --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 8 ++ SmartDeviceLink/SDLMenuCell.m | 4 +- SmartDeviceLink/SDLMenuManager.m | 43 +-------- SmartDeviceLink/SDLMenuUpdateAlgorithm.h | 24 +++++ SmartDeviceLink/SDLMenuUpdateAlgorithm.m | 92 +++++++++++++++++++ 5 files changed, 129 insertions(+), 42 deletions(-) create mode 100644 SmartDeviceLink/SDLMenuUpdateAlgorithm.h create mode 100644 SmartDeviceLink/SDLMenuUpdateAlgorithm.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index ddbf02435..2b88bfa9a 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1220,6 +1220,8 @@ 5DF40B26208FA7DE00DD6FDA /* SDLMenuManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */; }; 5DF40B28208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */; }; 5DFFB9151BD7C89700DB3F04 /* SDLConnectionManagerType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */; }; + 752ECDB6228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */; }; + 752ECDB7228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */; }; 756C62762289F11F008B57A2 /* SDLMenuRunScore.h in Headers */ = {isa = PBXBuildFile; fileRef = 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */; }; 756C62772289F11F008B57A2 /* SDLMenuRunScore.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */; }; 880245A420F79C3400ED195B /* SDLFileManagerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -2851,6 +2853,8 @@ 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuManagerSpec.m; path = DevAPISpecs/SDLMenuManagerSpec.m; sourceTree = ""; }; 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandManagerSpec.m; path = DevAPISpecs/SDLVoiceCommandManagerSpec.m; sourceTree = ""; }; 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLConnectionManagerType.h; sourceTree = ""; }; + 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuUpdateAlgorithm.h; sourceTree = ""; }; + 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuUpdateAlgorithm.m; sourceTree = ""; }; 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuRunScore.h; sourceTree = ""; }; 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuRunScore.m; sourceTree = ""; }; 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFileManagerConfiguration.h; sourceTree = ""; }; @@ -3802,6 +3806,8 @@ 5DF40B21208E761A00DD6FDA /* SDLVoiceCommandManager.m */, 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */, 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */, + 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */, + 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */, ); name = Menu; sourceTree = ""; @@ -6522,6 +6528,7 @@ 5D61FCAD1A84238C00846EE7 /* SDLFunctionID.h in Headers */, DA9F7E831DCC047200ACAE48 /* SDLWayPointType.h in Headers */, 5D61FDF51A84238C00846EE7 /* SDLV1ProtocolHeader.h in Headers */, + 752ECDB6228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h in Headers */, 5D92936320B3551600FCC775 /* SDLKeyboardDelegate.h in Headers */, 5D92936820B3601700FCC775 /* SDLChoiceSetManager.h in Headers */, 5DBF06351E64A9FE00A5CF03 /* SDLLogConstants.h in Headers */, @@ -7149,6 +7156,7 @@ 8818ADD92100FC18007D6F19 /* SDLTurnSignal.m in Sources */, 5D8B17541AC9E11B006A6E1C /* SDLDialNumberResponse.m in Sources */, DA6223BE1E7B088200878689 /* CVPixelBufferRef+SDLUtil.m in Sources */, + 752ECDB7228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m in Sources */, 1FF7DABC1F75B2BF00B46C30 /* SDLFocusableItemLocator.m in Sources */, EED5CA021F4D18EC00F04000 /* SDLRAWH264Packetizer.m in Sources */, 5D61FC851A84238C00846EE7 /* SDLDeviceLevelStatus.m in Sources */, diff --git a/SmartDeviceLink/SDLMenuCell.m b/SmartDeviceLink/SDLMenuCell.m index aaf25b85c..08a60d8d8 100644 --- a/SmartDeviceLink/SDLMenuCell.m +++ b/SmartDeviceLink/SDLMenuCell.m @@ -69,8 +69,7 @@ NSUInteger NSUIntRotateCell(NSUInteger val, NSUInteger howMuch) { - (NSUInteger)hash { return NSUIntRotateCell(self.title.hash, NSUIntBitCell / 2) ^ NSUIntRotateCell(self.icon.name.hash, NSUIntBitCell / 3) - ^ NSUIntRotateCell(self.voiceCommands.hash, NSUIntBitCell / 4) - ^ NSUIntRotateCell(self.subCells.hash, NSUIntBitCell / 5); + ^ NSUIntRotateCell(self.voiceCommands.hash, NSUIntBitCell / 4); } - (BOOL)isEqual:(id)object { @@ -83,6 +82,7 @@ - (BOOL)isEqual:(id)object { - (BOOL)isEqualToChoice:(SDLMenuCell *)choice { if (choice == nil) { return NO; } + // toDo Check for subCell stuff return (self.hash == choice.hash); } diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index a21a8fdeb..197ad166a 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -22,6 +22,8 @@ #import "SDLLogMacros.h" #import "SDLMenuCell.h" #import "SDLMenuParams.h" +#import "SDLMenuRunScore.h" +#import "SDLMenuUpdateAlgorithm.h" #import "SDLOnCommand.h" #import "SDLOnHMIStatus.h" #import "SDLRegisterAppInterfaceResponse.h" @@ -29,8 +31,6 @@ #import "SDLRPCResponseNotification.h" #import "SDLSetDisplayLayoutResponse.h" #import "SDLVoiceCommand.h" -#import "SDLMenuRunScore.h" - NS_ASSUME_NONNULL_BEGIN @@ -154,7 +154,7 @@ - (void)setMenuCells:(NSArray *)menuCells { _menuCells = menuCells; //Compare menus and buiild a RunScore object that contains delete commands and add commands. - SDLMenuRunScore *runScore = [self compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; + SDLMenuRunScore *runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; if (artworksToBeUploaded.count > 0) { @@ -171,43 +171,6 @@ - (void)setMenuCells:(NSArray *)menuCells { [self sdl_updateWithCompletionHandler:nil]; } -#pragma mark - Update Menu Cells -- (SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ - //Compare old and new menus - if((!oldMenuCells.count) && updatedMenuCells.count) { - return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[self buildAddStatus:updatedMenuCells] score:0]; - } - - for (int run = 0; run < (int)oldMenuCells.count; run++) { //For each run - // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds - NSMutableArray *oldMenuStatus = [self buildDeleteStatus:oldMenuCells]; - NSMutableArray *newMenuStatus = [self buildAddStatus:updatedMenuCells]; - - int global = 0; - for(int oldCellItems = run; oldCellItems < oldMenuCells.count; oldCellItems++) { - - } - } - - return [SDLMenuRunScore new]; //toUpdate -} - -- (NSMutableArray *)buildDeleteStatus:(NSArray *)oldMenu { - NSMutableArray *oldMenuStatus = [[NSMutableArray alloc] init]; - for(SDLMenuCell *cells in oldMenu) { - [oldMenuStatus addObject:@(MenuCellStateDelete)]; - } - return [oldMenuStatus copy]; -} - -- (NSMutableArray *)buildAddStatus:(NSArray *)newMenu { - NSMutableArray *newMenuStatus = [[NSMutableArray alloc] init]; - for(SDLMenuCell *cells in newMenu) { - [newMenuStatus addObject:@(MenuCellStateAdd)]; - } - return [newMenuStatus copy]; -} - #pragma mark - Updating System - (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.h b/SmartDeviceLink/SDLMenuUpdateAlgorithm.h new file mode 100644 index 000000000..ca0fa71b7 --- /dev/null +++ b/SmartDeviceLink/SDLMenuUpdateAlgorithm.h @@ -0,0 +1,24 @@ +// +// SDLMenuUpdateAlgorithm.h +// SmartDeviceLink +// +// Created by Justin Gluck on 5/14/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +@class SDLMenuRunScore; +@class SDLMenuCell; + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLMenuUpdateAlgorithm : NSObject + ++ (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells; ++ (NSMutableArray *)buildDeleteStatus:(NSArray *)oldMenu; ++ (NSMutableArray *)buildAddStatus:(NSArray *)newMenu; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m new file mode 100644 index 000000000..cb7155851 --- /dev/null +++ b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m @@ -0,0 +1,92 @@ +// +// SDLMenuUpdateAlgorithm.m +// SmartDeviceLink +// +// Created by Justin Gluck on 5/14/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLMenuUpdateAlgorithm.h" +#import "SDLMenuRunScore.h" +#import "SDLMenuCell.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSUInteger, MenuCellState) { + MenuCellStateDelete, + MenuCellStateAdd, + MenuCellStateKeep +}; + +@implementation SDLMenuUpdateAlgorithm + +#pragma mark - Update Menu Cells ++ (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ + //Compare old and new menus //Mae sure we only have 100 or less cells + if(oldMenuCells.count && !updatedMenuCells.count) { + return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells] score:0]; + } + if(!oldMenuCells.count && updatedMenuCells.count) { + return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLMenuUpdateAlgorithm buildAddStatus:updatedMenuCells] score:updatedMenuCells.count]; + } + + if(!oldMenuCells.count && !updatedMenuCells.count) { + return nil; + } + + SDLMenuRunScore *bestScoreMenu = nil; + for (NSUInteger run = 0; run < oldMenuCells.count; run++) { //For each run + // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds + NSMutableArray *oldMenuStatus = [SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells]; + NSMutableArray *newMenuStatus = [SDLMenuUpdateAlgorithm buildAddStatus:updatedMenuCells]; + + NSUInteger startIndex = 0; + for(NSUInteger oldCellIndex = run; oldCellIndex < oldMenuCells.count; oldCellIndex++) { //For each old item + //Create inner loop to compare old cells to new cells to find a match, if a match if found we mark the index at match for both the old and the new status to keep since we do not want to send RPCs for those cases + for(NSUInteger newCellIndex = startIndex; newCellIndex < updatedMenuCells.count; newCellIndex++) { + if([oldMenuCells[oldCellIndex] isEqual:updatedMenuCells[newCellIndex]]) { + oldMenuStatus[oldCellIndex] = @(MenuCellStateKeep); + newMenuStatus[newCellIndex] = @(MenuCellStateKeep); + startIndex = newCellIndex + 1; + break; + } + } + } + NSUInteger numberOfAdds = 0; + for(NSUInteger status = 0; status < newMenuStatus.count; status++){ + // 0 = Delete, 1 = Add, 2 = Keep + if(newMenuStatus[status].integerValue == 1) { + numberOfAdds++; + } + } + + NSLog(@"RunScore: %lu", (unsigned long)numberOfAdds); + if(bestScoreMenu == nil || numberOfAdds < bestScoreMenu.score) { + if(bestScoreMenu != nil){ + NSLog(@"Previosu Score: %lu", (unsigned long)bestScoreMenu.score); + } + bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; + } + } + return bestScoreMenu; +} + ++ (NSMutableArray *)buildDeleteStatus:(NSArray *)oldMenu { + NSMutableArray *oldMenuStatus = [[NSMutableArray alloc] init]; + for(SDLMenuCell *cells in oldMenu) { + [oldMenuStatus addObject:@(MenuCellStateDelete)]; + } + return [oldMenuStatus copy]; +} + ++ (NSMutableArray *)buildAddStatus:(NSArray *)newMenu { + NSMutableArray *newMenuStatus = [[NSMutableArray alloc] init]; + for(SDLMenuCell *cells in newMenu) { + [newMenuStatus addObject:@(MenuCellStateAdd)]; + } + return [newMenuStatus copy]; +} + +@end + +NS_ASSUME_NONNULL_END From f2910b97d33d82e084b85f275cba1bbf01feaf16 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 14 May 2019 16:46:13 -0400 Subject: [PATCH 056/179] Moved IAPSessionDelegate to data and control classes Moved SDLIAPSessionDelegate from the IAP Transport class to the data and control classes --- SmartDeviceLink/SDLIAPControlSession.h | 5 -- SmartDeviceLink/SDLIAPControlSession.m | 44 +++++++++++++- SmartDeviceLink/SDLIAPDataSession.m | 35 ++++++++++- SmartDeviceLink/SDLIAPDataSessionDelegate.h | 3 +- SmartDeviceLink/SDLIAPTransport.h | 4 +- SmartDeviceLink/SDLIAPTransport.m | 66 +++++---------------- 6 files changed, 92 insertions(+), 65 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 46836d11c..ee94fbf20 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -58,11 +58,6 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)stopSession; -/** - * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and the delegate will be notified that it should attempt to establish a new control session. - */ -- (void)startSessionTimer; - @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index f744fcb82..d87369bec 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -13,15 +13,17 @@ #import "SDLIAPConstants.h" #import "SDLIAPControlSessionDelegate.h" #import "SDLIAPSession.h" +#import "SDLIAPSessionDelegate.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" #import "SDLTimer.h" + NS_ASSUME_NONNULL_BEGIN int const ProtocolIndexTimeoutSeconds = 10; -@interface SDLIAPControlSession () +@interface SDLIAPControlSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; @@ -53,6 +55,7 @@ - (void)startSession { [self.delegate retryControlSession]; } else { SDLLogD(@"Starting a control session with accessory (%@)", self.session.accessory.name); + self.session.delegate = self; EAAccessory *accessory = self.session.accessory; SDLStreamDelegate *controlStreamDelegate = [[SDLStreamDelegate alloc] init]; controlStreamDelegate.streamHasBytesHandler = [self sdl_controlStreamHasBytesHandlerForAccessory:accessory]; @@ -84,7 +87,10 @@ - (void)stopSession { self.session = nil; } -- (void)startSessionTimer { +/** + * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and the delegate will be notified that it should attempt to establish a new control session. + */ +- (void)sdl_startSessionTimer { if (self.protocolIndexTimer == nil) { return; } [self.protocolIndexTimer start]; } @@ -199,6 +205,40 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { return protocolIndexTimer; } +#pragma mark - SDLIAPSessionDelegate + +/** + * Called after both the input and output streams of the session have opened. + * + * @param session The current session + */ +- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { + if (![session.protocol isEqualToString:ControlProtocolString]) { + return; + } + + SDLLogV(@"Control session I/O streams opened for protocol: %@", session.protocol); + [self sdl_startSessionTimer]; +} + +/** + * Called when either the input and output streams of the session have errored. When the control session errors, a new control session is attempted. + * + * @param session The current session + */ +- (void)onSessionStreamsEnded:(SDLIAPSession *)session { + if (![session.protocol isEqualToString:ControlProtocolString]) { + // Non control session + return; + } + + SDLLogV(@"Control session I/O streams errored for protocol: %@. Retrying", session.protocol); + [session stop]; + + if (self.delegate == nil) { return; } + [self.delegate retryControlSession]; +} + #pragma mark - Getters - (NSUInteger)connectionID { diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index b24d55a30..456cf59fd 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -10,15 +10,16 @@ #import "SDLGlobals.h" #import "SDLIAPConstants.h" +#import "SDLIAPDataSessionDelegate.h" #import "SDLIAPSession.h" +#import "SDLIAPSessionDelegate.h" #import "SDLLogMacros.h" #import "SDLStreamDelegate.h" -#import "SDLIAPDataSessionDelegate.h" NS_ASSUME_NONNULL_BEGIN -@interface SDLIAPDataSession () +@interface SDLIAPDataSession () @property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; @property (weak, nonatomic) id delegate; @@ -48,6 +49,7 @@ - (void)startSession { [self.delegate retryDataSession]; } else { SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, self.session.protocol); + self.session.delegate = self; SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; self.session.streamDelegate = ioStreamDelegate; ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandler]; @@ -164,6 +166,33 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { }; } +#pragma mark - SDLIAPSessionDelegate + +/** + * Called after both the input and output streams of the session have opened. + * + * @param session The current session + */ +- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { + if ([session.protocol isEqualToString:ControlProtocolString]) { + // Control session + return; + } + + SDLLogV(@"Data session I/O streams opened for protocol: %@", session.protocol); + if (self.delegate == nil) { return; } + [self.delegate transportConnected]; +} + +/** + * Called when either the input and output streams of the session have errored. If the data session errored, do nothing. + * + * @param session The current session + */ +- (void)onSessionStreamsEnded:(SDLIAPSession *)session { + SDLLogV(@"Data session I/O streams errored for protocol: %@", session.protocol); +} + #pragma mark - Getters - (NSUInteger)connectionID { @@ -175,7 +204,7 @@ - (BOOL)isSessionInProgress { } - (BOOL)isSessionConnected { - return (self.session != nil && self.session.accessory.isConnected); + return (self.session != nil && self.sessionInProgress); } #pragma mark - Lifecycle Destruction diff --git a/SmartDeviceLink/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/SDLIAPDataSessionDelegate.h index 8f5ea5039..b4f1ad85b 100644 --- a/SmartDeviceLink/SDLIAPDataSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPDataSessionDelegate.h @@ -8,14 +8,13 @@ #import -@class SDLIAPControlSession; - NS_ASSUME_NONNULL_BEGIN @protocol SDLIAPDataSessionDelegate - (void)retryDataSession; - (void)dataReceived:(NSData *)dataIn; +- (void)transportConnected; @end diff --git a/SmartDeviceLink/SDLIAPTransport.h b/SmartDeviceLink/SDLIAPTransport.h index a4261b2cf..5b768788a 100644 --- a/SmartDeviceLink/SDLIAPTransport.h +++ b/SmartDeviceLink/SDLIAPTransport.h @@ -4,11 +4,11 @@ #import #import "SDLTransportType.h" -#import "SDLIAPSessionDelegate.h" + NS_ASSUME_NONNULL_BEGIN -@interface SDLIAPTransport : NSObject +@interface SDLIAPTransport : NSObject /** * The subscribed listener. diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index c1a927c35..65ab844e5 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -198,16 +198,12 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); [self sdl_destroyTransport]; } else if (accessory.connectionID == self.controlSession.connectionID) { - // The data session has yet to be established so we will only destroy the control session. + // The data session has yet to be established so do NOT destroy the transport and DO NOT unregister for notifications from the accessory. SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber); self.retryCounter = 0; self.sessionSetupInProgress = NO; [self.controlSession stopSession]; [self.dataSession stopSession]; - } else if (accessory.connectionID == self.dataSession.connectionID) { - // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. - SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); - [self sdl_destroyTransport]; } else { SDLLogV(@"Accessory (%@, %@) disconnecting during an unknown session", accessory.name, accessory.serialNumber); } @@ -311,12 +307,10 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { * Helper method for creating a Control session * * @param accessory The SDL enabled accessory - * @param sessionDelegate The stream delegate * @return A SDLIAPControlSession object */ -- (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)accessory sessionDelegate:(id)sessionDelegate { +- (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)accessory { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; - session.delegate = sessionDelegate; return [[SDLIAPControlSession alloc] initWithSession:session delegate:self]; } @@ -325,12 +319,10 @@ - (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)a * * @param accessory The SDL enabled accessory * @param protocol The protocol string needed to open the session - * @param sessionDelegate The stream delegate * @return A SDLIAPDataSession object */ -- (SDLIAPDataSession *)sdl_createDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol sessionDelegate:(id)sessionDelegate { +- (SDLIAPDataSession *)sdl_createDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol { SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; - session.delegate = sessionDelegate; return [[SDLIAPDataSession alloc] initWithSession:session delegate:self]; } @@ -348,15 +340,15 @@ - (BOOL)sdl_connectAccessory:(EAAccessory *)accessory { } if ([accessory supportsProtocol:MultiSessionProtocolString] && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:MultiSessionProtocolString]; [self.dataSession startSession]; connecting = YES; } else if ([accessory supportsProtocol:ControlProtocolString]) { - self.controlSession = [self sdl_createControlSessionWithAccessory:accessory sessionDelegate:self]; + self.controlSession = [self sdl_createControlSessionWithAccessory:accessory]; [self.controlSession startSession]; connecting = YES; } else if ([accessory supportsProtocol:LegacyProtocolString]) { - self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:LegacyProtocolString sessionDelegate:self]; + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:LegacyProtocolString]; [self.dataSession startSession]; connecting = YES; } @@ -388,13 +380,13 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { // Determine if we can start a multi-app session or a legacy (single-app) session if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:MultiSessionProtocolString]) && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - self.dataSession = [self sdl_createDataSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString sessionDelegate:self]; + self.dataSession = [self sdl_createDataSessionWithAccessory:sdlAccessory forProtocol:MultiSessionProtocolString]; [self.dataSession startSession]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:ControlProtocolString])) { - self.controlSession = [self sdl_createControlSessionWithAccessory:sdlAccessory sessionDelegate:self]; + self.controlSession = [self sdl_createControlSessionWithAccessory:sdlAccessory]; [self.controlSession startSession]; } else if ((sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:LegacyProtocolString])) { - self.dataSession = [self sdl_createDataSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString sessionDelegate:self]; + self.dataSession = [self sdl_createDataSessionWithAccessory:sdlAccessory forProtocol:LegacyProtocolString]; [self.dataSession startSession]; } else { // No compatible accessory @@ -421,39 +413,6 @@ - (void)sdl_retryEstablishSession { [self sdl_connect:nil]; } -#pragma mark - SDLIAPSessionDelegate - -/** - * Called after both the input and output streams of the session have opened. - * - * @param session The current session - */ -- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { - if ([session.protocol isEqualToString:ControlProtocolString]) { - SDLLogV(@"Control session I/O streams opened for protocol: %@", session.protocol); - [self.controlSession startSessionTimer]; - } else { - SDLLogV(@"Data session I/O streams opened for protocol: %@", session.protocol); - self.sessionSetupInProgress = NO; - [self.delegate onTransportConnected]; - } -} - -/** - * Called when either the input and output streams of the session have errored. If the control session errored, a new control session is attempted. - * - * @param session The current session - */ -- (void)onSessionStreamsEnded:(SDLIAPSession *)session { - if ([session.protocol isEqualToString:ControlProtocolString]) { - SDLLogV(@"Control session I/O streams errored for protocol: %@. Retrying", session.protocol); - [session stop]; - [self sdl_retryEstablishSession]; - } else { - SDLLogV(@"Data session I/O streams errored for protocol: %@", session.protocol); - } -} - #pragma mark - Helpers /** @@ -565,7 +524,7 @@ - (void)dealloc { * @param accessory The accessory with which to create a data session */ - (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolString:(nonnull NSString *)protocolString forConnectedAccessory:(nonnull EAAccessory *)accessory { - self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:protocolString sessionDelegate:self]; + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:protocolString]; [self.dataSession startSession]; } @@ -587,6 +546,11 @@ - (void)retryDataSession { [self sdl_retryEstablishSession]; } +- (void)transportConnected { + self.sessionSetupInProgress = NO; + [self.delegate onTransportConnected]; +} + @end NS_ASSUME_NONNULL_END From 022b22305dc08b18e455514fd7a4e490c918fbf9 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 14 May 2019 17:26:45 -0400 Subject: [PATCH 057/179] WIP: will remove NSLogs when i make the finally commit, fixed an issue where function was returning an NSArray instead of NSMutableArray --- SmartDeviceLink/SDLMenuUpdateAlgorithm.m | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m index cb7155851..315e86fdb 100644 --- a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m +++ b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m @@ -54,13 +54,15 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM } NSUInteger numberOfAdds = 0; for(NSUInteger status = 0; status < newMenuStatus.count; status++){ - // 0 = Delete, 1 = Add, 2 = Keep + // 0 = Delete, + //1 = Add, + //2 = Keep if(newMenuStatus[status].integerValue == 1) { numberOfAdds++; } } - NSLog(@"RunScore: %lu", (unsigned long)numberOfAdds); + NSLog(@"Run: %lu, RunScore: %lu", (unsigned long)run, (unsigned long)numberOfAdds); if(bestScoreMenu == nil || numberOfAdds < bestScoreMenu.score) { if(bestScoreMenu != nil){ NSLog(@"Previosu Score: %lu", (unsigned long)bestScoreMenu.score); @@ -68,6 +70,11 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; } } + + NSLog(@"BestScore: %lu", (unsigned long)bestScoreMenu.score); + NSLog(@"OldMenuStatus: %@",bestScoreMenu.oldStatus); + NSLog(@"NewMenuStatus: %@",bestScoreMenu.updatedStatus); + return bestScoreMenu; } @@ -76,7 +83,7 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM for(SDLMenuCell *cells in oldMenu) { [oldMenuStatus addObject:@(MenuCellStateDelete)]; } - return [oldMenuStatus copy]; + return [oldMenuStatus mutableCopy]; } + (NSMutableArray *)buildAddStatus:(NSArray *)newMenu { @@ -84,7 +91,7 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM for(SDLMenuCell *cells in newMenu) { [newMenuStatus addObject:@(MenuCellStateAdd)]; } - return [newMenuStatus copy]; + return [newMenuStatus mutableCopy]; } @end From 1c18e0b79fe0c22b8f809d613a231344c474dedc Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 14 May 2019 17:31:34 -0400 Subject: [PATCH 058/179] Remove duplicate typedef Enum for MenuCellState , removed commented out code bit of whitespace cleanup --- SmartDeviceLink/SDLMenuManager.m | 7 ------- SmartDeviceLink/SDLMenuRunScore.h | 6 ------ 2 files changed, 13 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 197ad166a..cd2a46d62 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -34,12 +34,6 @@ NS_ASSUME_NONNULL_BEGIN -typedef NS_ENUM(NSUInteger, MenuCellState) { - MenuCellStateDelete, - MenuCellStateAdd, - MenuCellStateKeep -}; - @interface SDLMenuCell() @property (assign, nonatomic) UInt32 parentCellId; @@ -152,7 +146,6 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; - //Compare menus and buiild a RunScore object that contains delete commands and add commands. SDLMenuRunScore *runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; // Upload the artworks diff --git a/SmartDeviceLink/SDLMenuRunScore.h b/SmartDeviceLink/SDLMenuRunScore.h index 359e20bc6..31125b389 100644 --- a/SmartDeviceLink/SDLMenuRunScore.h +++ b/SmartDeviceLink/SDLMenuRunScore.h @@ -21,9 +21,3 @@ NS_ASSUME_NONNULL_BEGIN @end NS_ASSUME_NONNULL_END - -//int i = 0; -// -//NSNumber *testNum = @(i); -// -//int testNumInt = testNum.intValue; From 398cf8b8b08e473ceed9cba7ac9fe0bc4732fe15 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 15 May 2019 09:07:19 -0400 Subject: [PATCH 059/179] Added missing documentation --- SmartDeviceLink/SDLIAPTransport.m | 128 ++++++++++++++++++------------ 1 file changed, 76 insertions(+), 52 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 65ab844e5..5921adf74 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -175,7 +175,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc } /** - * Handles a notification sent by the system when an accessory has been disconnected by cleaning up after the disconnected device. Only check for the data session, the control session is handled separately + * Handles a notification sent by the system when an accessory has been disconnected by cleaning up after the disconnected device. * * @param notification Contains information about the connected accessory */ @@ -189,28 +189,34 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { } if (!self.controlSession.isSessionInProgress && !self.dataSession.isSessionInProgress) { - // No connection has yet been established so we will not destroy the current session as it needs to watch for accessory connections. - self.retryCounter = 0; - self.sessionSetupInProgress = NO; SDLLogV(@"Accessory (%@, %@), disconnected, but no session is in progress.", accessory.name, accessory.serialNumber); + [self sdl_closeSessions]; } else if (accessory.connectionID == self.dataSession.connectionID) { - // The data session has been established, which means we are in a connected state. The lifecycle manager will destroy and create a new transport object. + // The data session has been established. Tell the delegate that the transport has disconnected. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); [self sdl_destroyTransport]; } else if (accessory.connectionID == self.controlSession.connectionID) { - // The data session has yet to be established so do NOT destroy the transport and DO NOT unregister for notifications from the accessory. + // The data session has yet to be established so the transport has not yet connected. DO NOT unregister for notifications from the accessory. SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber); - self.retryCounter = 0; - self.sessionSetupInProgress = NO; - [self.controlSession stopSession]; - [self.dataSession stopSession]; + [self sdl_closeSessions]; } else { SDLLogV(@"Accessory (%@, %@) disconnecting during an unknown session", accessory.name, accessory.serialNumber); + [self sdl_closeSessions]; } } /** - * Tells the lifecycle manager that the data session has been closed. + * Closes and cleans up the sessions after a control session has been closed. Since a data session has not been established, the lifecycle manager has not transitioned to state started. Do not unregister for notifications from accessory connections/disconnections otherwise the library will not be able to connect to an accessory again. + */ +- (void)sdl_closeSessions { + self.retryCounter = 0; + self.sessionSetupInProgress = NO; + [self.controlSession stopSession]; + [self.dataSession stopSession]; +} + +/** + * Tells the lifecycle manager that the data session has been closed. The lifecycle manager will destroy it's `SDLIAPTransport` object and then create a new one to listen for a new connection to the accessory. */ - (void)sdl_destroyTransport { self.retryCounter = 0; @@ -246,7 +252,7 @@ - (void)sdl_applicationDidEnterBackground:(NSNotification *)notification { #pragma mark - Stream Lifecycle -#pragma mark SDLTransportType Protocol +#pragma mark SDLTransportTypeProtocol /** * Sends data to Core @@ -291,7 +297,7 @@ - (void)disconnect { * @param accessory The accessory to attempt connection with or nil to scan for accessories. */ - (void)sdl_connect:(nullable EAAccessory *)accessory { - if ((self.dataSession == nil || !self.dataSession.isSessionConnected) && !self.sessionSetupInProgress) { + if ((self.dataSession == nil || !self.dataSession.isSessionInProgress) && !self.sessionSetupInProgress) { // No data session has been established are not attempting to set one up, attempt to connect SDLLogV(@"No data session in progress. Starting setup."); self.sessionSetupInProgress = YES; @@ -413,8 +419,62 @@ - (void)sdl_retryEstablishSession { [self sdl_connect:nil]; } + +#pragma mark - Session Delegates + +#pragma mark Control Session + +/** + * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. + * + * @param controlSession The control session + * @param protocolString The protocol string to be used to open the data session + * @param accessory The accessory with which to create a data session + */ +- (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolString:(nonnull NSString *)protocolString forConnectedAccessory:(nonnull EAAccessory *)accessory { + self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:protocolString]; + [self.dataSession startSession]; +} + +/** + * Called when the control session should be retried. + */ +- (void)retryControlSession { + [self sdl_retryEstablishSession]; +} + +#pragma mark Data Session + +/** + * Called when the data session receives data from Core + * + * @param dataIn The received data + */ +- (void)dataReceived:(nonnull NSData *)dataIn { + [self.delegate onDataReceived:dataIn]; + [self sdl_backgroundTaskStart]; +} + +/** + * Called when the data session should be retried. + */ +- (void)retryDataSession { + [self sdl_retryEstablishSession]; +} + +/** + * Called when the data session has been established. Notify the delegate that the transport has been connected. + */ +- (void)transportConnected { + self.sessionSetupInProgress = NO; + [self.delegate onTransportConnected]; +} + + #pragma mark - Helpers +#pragma mark Protocol Strings + /** * Checks if the app's info.plist contains all the required protocol strings. * @@ -456,6 +516,8 @@ + (nullable NSString *)sdl_supportsRequiredProtocolStrings { return nil; } +#pragma mark Retry Delay + /** * Generates a random number of seconds between 1.5 and 9.5 used to delay the retry control and data session attempts. * @@ -499,6 +561,7 @@ - (double)sdl_retryDelay { return appDelaySeconds; } + #pragma mark - Lifecycle Destruction - (void)dealloc { @@ -512,45 +575,6 @@ - (void)dealloc { self.accessoryConnectDuringActiveSession = NO; } -#pragma mark - iAP Session Delegates - -#pragma mark Control Session - -/** - * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. - * - * @param controlSession The control session - * @param protocolString The protocol string to be used to open the data session - * @param accessory The accessory with which to create a data session - */ -- (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolString:(nonnull NSString *)protocolString forConnectedAccessory:(nonnull EAAccessory *)accessory { - self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:protocolString]; - [self.dataSession startSession]; -} - -/** - * Called when the control session should be retried. - */ -- (void)retryControlSession { - [self sdl_retryEstablishSession]; -} - -#pragma mark Data Session - -- (void)dataReceived:(nonnull NSData *)dataIn { - [self.delegate onDataReceived:dataIn]; - [self sdl_backgroundTaskStart]; -} - -- (void)retryDataSession { - [self sdl_retryEstablishSession]; -} - -- (void)transportConnected { - self.sessionSetupInProgress = NO; - [self.delegate onTransportConnected]; -} - @end NS_ASSUME_NONNULL_END From 8079fd82852d6dd652c5d7424b81eb9dda6163d6 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 15 May 2019 09:10:36 -0400 Subject: [PATCH 060/179] Undoing changes to example apps to fix reconnects --- Example Apps/Example ObjC/ProxyManager.m | 5 +++++ Example Apps/Example Swift/ProxyManager.swift | 5 +++++ Example Apps/Shared/AppConstants.h | 1 + Example Apps/Shared/AppConstants.m | 1 + 4 files changed, 12 insertions(+) diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m index 7a80de34b..a510c79ee 100644 --- a/Example Apps/Example ObjC/ProxyManager.m +++ b/Example Apps/Example ObjC/ProxyManager.m @@ -227,6 +227,11 @@ - (BOOL)sdlex_imageFieldSupported:(SDLImageFieldName)imageFieldName { - (void)managerDidDisconnect { [self sdlex_updateProxyState:ProxyStateStopped]; self.firstHMILevel = SDLHMILevelNone; + + // If desired, automatically start searching for a new connection to Core + if (ExampleAppShouldRestartSDLManagerOnDisconnect) { + [self startManager]; + } } - (void)hmiLevel:(SDLHMILevel)oldLevel didChangeToLevel:(SDLHMILevel)newLevel { diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift index 485b90138..5cc15217e 100644 --- a/Example Apps/Example Swift/ProxyManager.swift +++ b/Example Apps/Example Swift/ProxyManager.swift @@ -142,6 +142,11 @@ extension ProxyManager: SDLManagerDelegate { func managerDidDisconnect() { delegate?.didChangeProxyState(ProxyState.stopped) firstHMILevelState = .none + + // If desired, automatically start searching for a new connection to Core + if ExampleAppShouldRestartSDLManagerOnDisconnect.boolValue { + startManager() + } } /// Called when the state of the SDL app has changed. The state limits the type of RPC that can be sent. Refer to the class documentation for each RPC to determine what state(s) the RPC can be sent. diff --git a/Example Apps/Shared/AppConstants.h b/Example Apps/Shared/AppConstants.h index e8b1aaaf1..1c557c969 100644 --- a/Example Apps/Shared/AppConstants.h +++ b/Example Apps/Shared/AppConstants.h @@ -15,6 +15,7 @@ extern NSString * const ExampleAppName; extern NSString * const ExampleAppNameShort; extern NSString * const ExampleAppNameTTS; extern NSString * const ExampleFullAppId; +extern BOOL const ExampleAppShouldRestartSDLManagerOnDisconnect; #pragma mark - SDL Textfields extern NSString * const SmartDeviceLinkText; diff --git a/Example Apps/Shared/AppConstants.m b/Example Apps/Shared/AppConstants.m index 7e81eba13..c96464d63 100644 --- a/Example Apps/Shared/AppConstants.m +++ b/Example Apps/Shared/AppConstants.m @@ -13,6 +13,7 @@ NSString * const ExampleAppNameShort = @"SDL"; NSString * const ExampleAppNameTTS = @"S D L Example App"; NSString * const ExampleFullAppId = @"123e4567-e89b-12d3-a456-426655440000"; // Dummy App Id +BOOL const ExampleAppShouldRestartSDLManagerOnDisconnect = NO; #pragma mark - SDL Textfields NSString * const SmartDeviceLinkText = @"SmartDeviceLink (SDL)"; From 4f0719dbaa495efffabeb6e62939e8901db6f2e6 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 15 May 2019 09:12:11 -0400 Subject: [PATCH 061/179] More fixes for the reconnects in example apps --- Example Apps/Example Swift/ProxyManager.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift index 5cc15217e..3b0ca25a4 100644 --- a/Example Apps/Example Swift/ProxyManager.swift +++ b/Example Apps/Example Swift/ProxyManager.swift @@ -119,6 +119,7 @@ private extension ProxyManager { sdlManager.start(readyHandler: { [unowned self] (success, error) in guard success else { SDLLog.e("There was an error while starting up: \(String(describing: error))") + self.resetConnection() return } From 3ec70f0537ba61c3d6114443667f494163bc7990 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 15 May 2019 11:15:32 -0400 Subject: [PATCH 062/179] moved some logic around to make testing quicker, added two test classes and started to make tests --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 8 +++ SmartDeviceLink/SDLMenuUpdateAlgorithm.m | 31 ++++++--- SmartDeviceLinkTests/SDLMenuRunScoreSpec.m | 27 ++++++++ .../SDLMenuUpdateAlgorithmSpec.m | 68 +++++++++++++++++++ 4 files changed, 125 insertions(+), 9 deletions(-) create mode 100644 SmartDeviceLinkTests/SDLMenuRunScoreSpec.m create mode 100644 SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 2b88bfa9a..16528a43c 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1222,6 +1222,8 @@ 5DFFB9151BD7C89700DB3F04 /* SDLConnectionManagerType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */; }; 752ECDB6228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */; }; 752ECDB7228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */; }; + 752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */; }; + 752ECDBB228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */; }; 756C62762289F11F008B57A2 /* SDLMenuRunScore.h in Headers */ = {isa = PBXBuildFile; fileRef = 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */; }; 756C62772289F11F008B57A2 /* SDLMenuRunScore.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */; }; 880245A420F79C3400ED195B /* SDLFileManagerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -2855,6 +2857,8 @@ 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLConnectionManagerType.h; sourceTree = ""; }; 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuUpdateAlgorithm.h; sourceTree = ""; }; 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuUpdateAlgorithm.m; sourceTree = ""; }; + 752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuRunScoreSpec.m; sourceTree = ""; }; + 752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuUpdateAlgorithmSpec.m; sourceTree = ""; }; 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuRunScore.h; sourceTree = ""; }; 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuRunScore.m; sourceTree = ""; }; 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFileManagerConfiguration.h; sourceTree = ""; }; @@ -5736,6 +5740,8 @@ 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */, 5DAB5F502098994C00A020C8 /* SDLMenuCellSpec.m */, 5DAB5F5220989A8300A020C8 /* SDLVoiceCommandSpec.m */, + 752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */, + 752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */, ); name = Menu; sourceTree = ""; @@ -7328,6 +7334,7 @@ 162E83801A9BDE8B00906325 /* SDLHMIPermissionsSpec.m in Sources */, 1EAA476C2036A52F000FE74B /* SDLLightCapabilitiesSpec.m in Sources */, 5D1654561D3E754F00554D93 /* SDLLifecycleManagerSpec.m in Sources */, + 752ECDBB228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m in Sources */, 1EE8C43A1F347D4D00FDC2CF /* SDLRadioStateSpec.m in Sources */, 162E83021A9BDE8B00906325 /* SDLTouchTypeSpec.m in Sources */, 1EAA47722036AEF5000FE74B /* SDLLightNameSpec.m in Sources */, @@ -7533,6 +7540,7 @@ 5DA23FF61F2FAA31009C0313 /* SDLControlFramePayloadRPCStartServiceSpec.m in Sources */, 162E83201A9BDE8B00906325 /* SDLOnVehicleDataSpec.m in Sources */, 1EAA47762036B847000FE74B /* SDLEqualizerSettingsSpec.m in Sources */, + 752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */, 162E83141A9BDE8B00906325 /* SDLOnDriverDistractionSpec.m in Sources */, 162E83371A9BDE8B00906325 /* SDLResetGlobalPropertiesSpec.m in Sources */, 162E82DF1A9BDE8B00906325 /* SDLGlobalProperySpec.m in Sources */, diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m index 315e86fdb..a25df440e 100644 --- a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m +++ b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m @@ -22,7 +22,7 @@ @implementation SDLMenuUpdateAlgorithm #pragma mark - Update Menu Cells + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ - //Compare old and new menus //Mae sure we only have 100 or less cells + //Compare old and new menus, maybe make sure we have less then 100 Cells if(oldMenuCells.count && !updatedMenuCells.count) { return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells] score:0]; } @@ -34,7 +34,25 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM return nil; } + for(SDLMenuCell *cell in oldMenuCells) { + NSLog(@"OldCellOrder = %@", cell.title); + } + for(SDLMenuCell *cell in updatedMenuCells) { + NSLog(@"NewCellOrder = %@", cell.title); + } + + // SDLMenuRunScore *bestScoreMenu = nil; + + return [SDLMenuUpdateAlgorithm startCompareAtRun:0 oldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; +} + ++ (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)run oldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells { SDLMenuRunScore *bestScoreMenu = nil; + + if(run >= oldMenuCells.count) { + return bestScoreMenu; + } + for (NSUInteger run = 0; run < oldMenuCells.count; run++) { //For each run // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds NSMutableArray *oldMenuStatus = [SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells]; @@ -53,10 +71,8 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM } } NSUInteger numberOfAdds = 0; - for(NSUInteger status = 0; status < newMenuStatus.count; status++){ - // 0 = Delete, - //1 = Add, - //2 = Keep + for(NSUInteger status = 0; status < newMenuStatus.count; status++) { + // 0 = Delete 1 = Add 2 = Keep if(newMenuStatus[status].integerValue == 1) { numberOfAdds++; } @@ -64,9 +80,6 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM NSLog(@"Run: %lu, RunScore: %lu", (unsigned long)run, (unsigned long)numberOfAdds); if(bestScoreMenu == nil || numberOfAdds < bestScoreMenu.score) { - if(bestScoreMenu != nil){ - NSLog(@"Previosu Score: %lu", (unsigned long)bestScoreMenu.score); - } bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; } } @@ -74,7 +87,7 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM NSLog(@"BestScore: %lu", (unsigned long)bestScoreMenu.score); NSLog(@"OldMenuStatus: %@",bestScoreMenu.oldStatus); NSLog(@"NewMenuStatus: %@",bestScoreMenu.updatedStatus); - + return bestScoreMenu; } diff --git a/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m b/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m new file mode 100644 index 000000000..a760dd264 --- /dev/null +++ b/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m @@ -0,0 +1,27 @@ +#import +#import +#import + +#import "SDLMenuRunScore.h" + +QuickSpecBegin(SDLMenuRunScoreSpec) + +describe(@"menuRunScore", ^{ + __block SDLMenuRunScore *runScore = nil; + + beforeEach(^{ + NSArray *oldMenuStatus = @[@1, @2, @3]; + NSArray *updatedMenuStatus = @[@3, @2, @1]; + NSUInteger numberOfAdds = 5; + + runScore = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:updatedMenuStatus score:numberOfAdds]; + }); + + it(@"should instantiate correctly", ^{ + expect(runScore.oldStatus).to(equal(@[@1, @2, @3])); + expect(runScore.updatedStatus).to(equal(@[@3, @2, @1])); + expect(runScore.score).to(equal(5)); + }); +}); + +QuickSpecEnd diff --git a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m new file mode 100644 index 000000000..6e4a25f4e --- /dev/null +++ b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m @@ -0,0 +1,68 @@ +// +// SDLMenuUpdateAlgorithmSpec.m +// SmartDeviceLinkTests +// +// Created by Justin Gluck on 5/15/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import +#import +#import + +#import "SDLMenuCell.h" +#import "SDLMenuRunScore.h" +#import "SDLMenuUpdateAlgorithm.h" + +QuickSpecBegin(SDLMenuUpdateAlgorithmSpec) + +typedef NS_ENUM(NSUInteger, MenuCellState) { + MenuCellStateDelete, + MenuCellStateAdd, + MenuCellStateKeep +}; + +describe(@"menuUpdateAlgorithm", ^{ + __block SDLMenuRunScore *runScore = nil; + //__block SDLMenuUpdateAlgorithm *updatelgorithm = nil; + + __block SDLMenuCell *oldCell1 = nil; + __block SDLMenuCell *oldCell2 = nil; + __block SDLMenuCell *oldCell3 = nil; + __block SDLMenuCell *oldCell4 = nil; + + __block SDLMenuCell *newCell1 = nil; + __block SDLMenuCell *newCell2 = nil; + __block SDLMenuCell *newCell3 = nil; + __block SDLMenuCell *newCell4 = nil; + __block SDLMenuCell *newCell5 = nil; + + // 0 = Delete 1 = Add 2 = Keep + describe(@"compare old and new menu cells", ^{ + + it(@"new menu status should best run of 22221", ^{ + oldCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + oldCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + oldCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + oldCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + + newCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + newCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + newCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + newCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + newCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + + NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; + NSArray *newMenuCells = @[newCell1, newCell2, newCell3, newCell4, newCell5]; + + runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:newMenuCells]; + expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[4].integerValue).to(equal(@(MenuCellStateAdd))); + }); + }); +}); + +QuickSpecEnd From c6f7ac3dbc1fdb7f3d6412a5555c6c7f6a28ad6a Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 15 May 2019 12:51:28 -0400 Subject: [PATCH 063/179] added more unit tests to test more cases --- SmartDeviceLink/SDLMenuUpdateAlgorithm.m | 10 ++- .../SDLMenuUpdateAlgorithmSpec.m | 87 ++++++++++++++++++- 2 files changed, 90 insertions(+), 7 deletions(-) diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m index a25df440e..76ff29ed4 100644 --- a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m +++ b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m @@ -46,14 +46,14 @@ + (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldM return [SDLMenuUpdateAlgorithm startCompareAtRun:0 oldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; } -+ (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)run oldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells { ++ (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)startRun oldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells { SDLMenuRunScore *bestScoreMenu = nil; - if(run >= oldMenuCells.count) { + if(startRun >= oldMenuCells.count) { return bestScoreMenu; } - for (NSUInteger run = 0; run < oldMenuCells.count; run++) { //For each run + for (NSUInteger run = startRun; run < oldMenuCells.count; run++) { //For each run // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds NSMutableArray *oldMenuStatus = [SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells]; NSMutableArray *newMenuStatus = [SDLMenuUpdateAlgorithm buildAddStatus:updatedMenuCells]; @@ -78,6 +78,10 @@ + (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)run oldMenuCells:(NS } } + if(numberOfAdds == 0) { + return [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; + } + NSLog(@"Run: %lu, RunScore: %lu", (unsigned long)run, (unsigned long)numberOfAdds); if(bestScoreMenu == nil || numberOfAdds < bestScoreMenu.score) { bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; diff --git a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m index 6e4a25f4e..bd33e8105 100644 --- a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m +++ b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m @@ -30,37 +30,116 @@ typedef NS_ENUM(NSUInteger, MenuCellState) { __block SDLMenuCell *oldCell2 = nil; __block SDLMenuCell *oldCell3 = nil; __block SDLMenuCell *oldCell4 = nil; + __block SDLMenuCell *oldCell5 = nil; + __block SDLMenuCell *oldCell6 = nil; __block SDLMenuCell *newCell1 = nil; __block SDLMenuCell *newCell2 = nil; __block SDLMenuCell *newCell3 = nil; __block SDLMenuCell *newCell4 = nil; __block SDLMenuCell *newCell5 = nil; + __block SDLMenuCell *newCell6 = nil; // 0 = Delete 1 = Add 2 = Keep describe(@"compare old and new menu cells", ^{ - - it(@"new menu status should best run of 22221", ^{ + beforeEach(^{ oldCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; oldCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; oldCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; oldCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + oldCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + oldCell6 = [[SDLMenuCell alloc] initWithTitle:@"Cell 6" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; newCell1 = [[SDLMenuCell alloc] initWithTitle:@"Cell 1" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; newCell2 = [[SDLMenuCell alloc] initWithTitle:@"Cell 2" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; newCell3 = [[SDLMenuCell alloc] initWithTitle:@"Cell 3" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; newCell4 = [[SDLMenuCell alloc] initWithTitle:@"Cell 4" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; newCell5 = [[SDLMenuCell alloc] initWithTitle:@"Cell 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + newCell6 = [[SDLMenuCell alloc] initWithTitle:@"Cell 6" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + }); + + it(@"should have a new menu status of 22221 and an old menu status of 2222 on best run", ^{ NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; - NSArray *newMenuCells = @[newCell1, newCell2, newCell3, newCell4, newCell5]; + NSArray *updatedMenuCells = @[newCell1, newCell2, newCell3, newCell4, newCell5]; + + runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore.updatedStatus.count).to(equal(5)); + expect(runScore.oldStatus.count).to(equal(4)); + expect(runScore.score).to(equal(1)); - runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:newMenuCells]; expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); expect(runScore.updatedStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); expect(runScore.updatedStatus[4].integerValue).to(equal(@(MenuCellStateAdd))); + + expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); + }); + + it(@"should have a new menu status of 222 and an old menu status of 2220 on best run", ^{ + + NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; + NSArray *updatedMenuCells = @[newCell1, newCell2, newCell3]; + + runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore.updatedStatus.count).to(equal(3)); + expect(runScore.oldStatus.count).to(equal(4)); + expect(runScore.score).to(equal(0)); + + expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); + + expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[3].integerValue).to(equal(@(MenuCellStateDelete))); + }); + + it(@"should have a new menu status of 111 and an old menu status of 000 on best run", ^{ + NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3]; + NSArray *updatedMenuCells = @[newCell4, newCell5, newCell6]; + + runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore.updatedStatus.count).to(equal(3)); + expect(runScore.oldStatus.count).to(equal(3)); + expect(runScore.score).to(equal(3)); + + expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateAdd))); + expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateAdd))); + expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateAdd))); + + expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateDelete))); + expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateDelete))); + expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateDelete))); + }); + + it(@"should have a new menu status of 1212 and an old menu status of 2020 on best run", ^{ + NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; + NSArray *updatedMenuCells = @[oldCell2, oldCell1, oldCell4, oldCell3 ]; + + runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore.updatedStatus.count).to(equal(4)); + expect(runScore.oldStatus.count).to(equal(4)); + expect(runScore.score).to(equal(2)); + + expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateAdd))); + expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateAdd))); + expect(runScore.updatedStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); + + expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateDelete))); + expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[3].integerValue).to(equal(@(MenuCellStateDelete))); }); }); }); From e3d95d2064e8fc0f0b47381d0c228b39c525b3a2 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 15 May 2019 13:32:06 -0400 Subject: [PATCH 064/179] Cleaned up SDLIAPSession and added documentation * reduced IOStreamThreadWaitSecs --- SmartDeviceLink/SDLIAPDataSession.m | 4 ++-- SmartDeviceLink/SDLIAPSession.m | 20 ++++++++++++++------ SmartDeviceLink/SDLIAPTransport.m | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 456cf59fd..8a53a18fd 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -72,8 +72,8 @@ - (void)stopSession { } SDLLogD(@"Stopping the data session"); - [self.session stop]; // Calling stop but easession may not yet be set to `nil` - self.session.streamDelegate = nil; // + [self.session stop]; + self.session.streamDelegate = nil; self.session = nil; } diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index ade553968..b397780fb 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN NSString *const IOStreamThreadName = @"com.smartdevicelink.iostream"; -NSTimeInterval const StreamThreadWaitSecs = 10.0; +NSTimeInterval const IOStreamThreadWaitSecs = 1.0; @interface SDLIAPSession () @@ -49,7 +49,7 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString #pragma mark - Public Stream Lifecycle - (BOOL)start { - SDLLogD(@"Opening EASession withAccessory:%@ forProtocol:%@", _accessory.name, _protocol); + SDLLogD(@"Opening EASession with accessory: %@", self.accessory.name); self.easession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocol]; return [self sdl_startWithSession:self.easession]; } @@ -94,12 +94,19 @@ - (void)sdl_stop { NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); if (self.isDataSession) { + if (self.ioStreamThread == nil) { + SDLLogV(@"Stopping data session but no thread established."); + self.isDataSession = NO; + self.easession = nil; + return; + } + [self.ioStreamThread cancel]; - // Waiting on the I/O threads of the data session to close + // Waiting for the I/O streams of the data session to close [self sdl_isIOThreadCanceled:self.canceledSemaphore completionHandler:^(BOOL success) { if (success == NO) { - SDLLogE(@"About to destroy a thread that has not yet closed."); + SDLLogE(@"Destroying thread (IOStreamThread) for data session when I/O streams have not yet closed."); } self.ioStreamThread = nil; self.isDataSession = NO; @@ -119,7 +126,7 @@ - (void)sdl_stop { * @param completionHandler Returns whether or not the data session's I/O streams were closed successfully. */ - (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completionHandler:(void (^)(BOOL success))completionHandler { - long lWait = dispatch_semaphore_wait(canceledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(StreamThreadWaitSecs * NSEC_PER_SEC))); + long lWait = dispatch_semaphore_wait(canceledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(IOStreamThreadWaitSecs * NSEC_PER_SEC))); if (lWait == 0) { SDLLogD(@"Stream thread canceled successfully"); return completionHandler(YES); @@ -202,7 +209,7 @@ - (void)sdl_accessoryEventLoop { SDLLogD(@"Starting the accessory event loop on thread: %@", NSThread.currentThread.name); - while (!NSThread.currentThread.cancelled) { + while (!self.ioStreamThread.cancelled) { // Enqueued data will be written to and read from the streams in the runloop [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25f]]; } @@ -211,6 +218,7 @@ - (void)sdl_accessoryEventLoop { // Close I/O streams of the data session. When the streams are closed. Notify the thread that it can close [self sdl_closeSession]; + dispatch_semaphore_signal(self.canceledSemaphore); } } diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 5921adf74..243dffe0d 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -396,7 +396,7 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { [self.dataSession startSession]; } else { // No compatible accessory - SDLLogV(@"No accessory supporting SDL was found, dismissing setup"); + SDLLogV(@"No accessory supporting SDL was found, dismissing setup. Available accessories: %@", EAAccessoryManager.sharedAccessoryManager.connectedAccessories); self.sessionSetupInProgress = NO; } } else { From 3eb9881ab01ea72fe320fc1466840cabfe56f5a5 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 15 May 2019 15:43:04 -0400 Subject: [PATCH 065/179] Renamed stopSession to destroySession --- SmartDeviceLink/SDLIAPControlSession.h | 2 +- SmartDeviceLink/SDLIAPControlSession.m | 14 +++++++------- SmartDeviceLink/SDLIAPDataSession.h | 2 +- SmartDeviceLink/SDLIAPDataSession.m | 12 ++++++------ SmartDeviceLink/SDLIAPTransport.m | 16 +++++++++------- .../iAP/SDLIAPControlSessionSpec.m | 4 ++-- .../TransportSpecs/iAP/SDLIAPDataSessionSpec.m | 4 ++-- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index ee94fbf20..1c836d0ce 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -56,7 +56,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Stops the current control session if it is open. */ -- (void)stopSession; +- (void)destroySession; @end diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index d87369bec..3ff3802a9 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -65,7 +65,7 @@ - (void)startSession { if (![self.session start]) { SDLLogW(@"Control session failed to setup with accessory: %@. Attempting to create a new control session", accessory); - [self stopSession]; + [self destroySession]; if (self.delegate == nil) { return; } [self.delegate retryControlSession]; } else { @@ -75,13 +75,13 @@ - (void)startSession { } } -- (void)stopSession { +- (void)destroySession { if (_session == nil) { SDLLogV(@"Attempting to stop the control session but the session is nil"); return; } - SDLLogD(@"Stopping the control session"); + SDLLogD(@"Destroying the control session"); [self.session stop]; self.session.streamDelegate = nil; self.session = nil; @@ -112,7 +112,7 @@ - (SDLStreamEndHandler)sdl_controlStreamEnded { // End events come in pairs, only perform this once per set. if (strongSelf.session != nil) { [strongSelf.protocolIndexTimer cancel]; - [strongSelf stopSession]; + [strongSelf destroySession]; if (strongSelf.delegate == nil) { return; } [strongSelf.delegate retryControlSession]; @@ -147,7 +147,7 @@ - (SDLStreamHasBytesHandler)sdl_controlStreamHasBytesHandlerForAccessory:(EAAcce // Destroy the control session as it is no longer needed, and then create the data session. dispatch_sync(dispatch_get_main_queue(), ^{ - [strongSelf stopSession]; + [strongSelf destroySession]; }); if (accessory.isConnected) { @@ -174,7 +174,7 @@ - (SDLStreamErrorHandler)sdl_controlStreamErrored { SDLLogE(@"Control stream error"); [strongSelf.protocolIndexTimer cancel]; - [strongSelf stopSession]; + [strongSelf destroySession]; if (self.delegate == nil) { return; } [self.delegate retryControlSession]; @@ -253,7 +253,7 @@ - (BOOL)isSessionInProgress { - (void)dealloc { SDLLogV(@"SDLIAPControlSession dealloc"); - _session = nil; + [self destroySession]; _protocolIndexTimer = nil; } diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index 9eff35888..2de3f4341 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -57,7 +57,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Stops a current session. */ -- (void)stopSession; +- (void)destroySession; @end diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 8a53a18fd..e9e0ddfc4 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -58,20 +58,20 @@ - (void)startSession { if (![self.session start]) { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.session.accessory); - [self stopSession]; + [self destroySession]; if (self.delegate == nil) { return; } [self.delegate retryDataSession]; } } } -- (void)stopSession { +- (void)destroySession { if (_session == nil) { SDLLogV(@"Attempting to stop the data session but the session is nil"); return; } - SDLLogD(@"Stopping the data session"); + SDLLogD(@"Destroying the data session"); [self.session stop]; self.session.streamDelegate = nil; self.session = nil; @@ -98,7 +98,7 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { // The handler will be called on the IO thread, but the session stop method must be called on the main thread dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf stopSession]; + [strongSelf destroySession]; if (self.delegate == nil) { return; } [self.delegate retryDataSession]; @@ -155,7 +155,7 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { SDLLogE(@"Data stream error"); dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf stopSession]; + [strongSelf destroySession]; if (![strongSelf.session.protocol isEqualToString:LegacyProtocolString]) { if (self.delegate == nil) { return; } [self.delegate retryDataSession]; @@ -211,7 +211,7 @@ - (BOOL)isSessionConnected { - (void)dealloc { SDLLogV(@"SDLIAPDataSession dealloc"); - _session = nil; + [self destroySession]; } @end diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 243dffe0d..5bab27bbb 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -211,8 +211,8 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { - (void)sdl_closeSessions { self.retryCounter = 0; self.sessionSetupInProgress = NO; - [self.controlSession stopSession]; - [self.dataSession stopSession]; + [self.controlSession destroySession]; + [self.dataSession destroySession]; } /** @@ -284,8 +284,8 @@ - (void)disconnect { // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications [self sdl_stopEventListening]; - [self.controlSession stopSession]; - [self.dataSession stopSession]; + [self.controlSession destroySession]; + [self.dataSession destroySession]; } @@ -412,8 +412,8 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { - (void)sdl_retryEstablishSession { // Current strategy disallows automatic retries. self.sessionSetupInProgress = NO; - [self.controlSession stopSession]; - [self.dataSession stopSession]; + [self.controlSession destroySession]; + [self.dataSession destroySession]; // Search connected accessories [self sdl_connect:nil]; @@ -440,6 +440,7 @@ - (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolStr * Called when the control session should be retried. */ - (void)retryControlSession { + SDLLogV(@"Retrying the control session"); [self sdl_retryEstablishSession]; } @@ -459,6 +460,7 @@ - (void)dataReceived:(nonnull NSData *)dataIn { * Called when the data session should be retried. */ - (void)retryDataSession { + SDLLogV(@"Retrying the data session"); [self sdl_retryEstablishSession]; } @@ -565,7 +567,7 @@ - (double)sdl_retryDelay { #pragma mark - Lifecycle Destruction - (void)dealloc { - SDLLogV(@"SDLIAPTransport"); + SDLLogV(@"SDLIAPTransport dealloc"); [self disconnect]; [self sdl_backgroundTaskEnd]; self.controlSession = nil; diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 3590f3572..5a389b16c 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -159,7 +159,7 @@ @interface SDLIAPControlSession() beforeEach(^{ mockSession = nil; controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [controlSession stopSession]; + [controlSession destroySession]; }); it(@"Should not try to stop the session", ^{ @@ -171,7 +171,7 @@ @interface SDLIAPControlSession() context(@"That is started", ^{ beforeEach(^{ controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [controlSession stopSession]; + [controlSession destroySession]; }); it(@"Should try to stop the session", ^{ diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m index 9dd4551b4..534457160 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -141,7 +141,7 @@ @interface SDLIAPDataSession() context(@"That is nil", ^{ beforeEach(^{ dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; - [dataSession stopSession]; + [dataSession destroySession]; }); it(@"Should not try to stop the session", ^{ @@ -152,7 +152,7 @@ @interface SDLIAPDataSession() context(@"That is started", ^{ beforeEach(^{ dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [dataSession stopSession]; + [dataSession destroySession]; }); it(@"Should try to stop and detroy the session", ^{ From 6d32ae6e3904aaa7f7757d8fb86a2a2635efa14f Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 15 May 2019 17:15:04 -0400 Subject: [PATCH 066/179] making functions so they dont delete all cells but only a sub set and update add commands to only add cells at index --- SmartDeviceLink/SDLMenuManager.m | 70 +++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index cd2a46d62..fe6be1963 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -57,7 +57,7 @@ @interface SDLMenuManager() @property (assign, nonatomic) UInt32 lastMenuId; @property (copy, nonatomic) NSArray *oldMenuCells; - +// @property (copy, nonatomic) NSArray *deleteCells; @end UInt32 const ParentIdNotFound = UINT32_MAX; @@ -146,8 +146,21 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; - //Compare menus and buiild a RunScore object that contains delete commands and add commands. + SDLMenuRunScore *runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; + + // At this point runScore should have the best possibe Delete/Add combinations as 2 arrays oldStatus, and newStatus + NSArray *oldStatusList = runScore.oldStatus; + NSArray *updatedStatusList = runScore.updatedStatus; + + // NSArray *oldKeeps = [self buildKeepMenuItems:oldStatusList]; //we will use this to test the subcells later + //NSArray *newKeeps = nil; + + // Build a list of DELETES and send all Delete commands + //[self buildDeleteMenuItems: oldStatusList]; // move this to completionHandler Delete Stuf First + + //for all items in the stsus if the status is ADD comppare it to the menuList and add it at that index + // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; if (artworksToBeUploaded.count > 0) { @@ -157,16 +170,52 @@ - (void)setMenuCells:(NSArray *)menuCells { } SDLLogD(@"Menu artworks uploaded"); - [self sdl_updateWithCompletionHandler:nil]; + [self sdl_updateCellsToDelete:[self buildDeleteMenuItems: oldStatusList] cellsToAdd:[self buildAddMenuItems:updatedStatusList] withCompletionHandler:nil]; + //[self sdl_updateWithCompletionHandler:nil]; }]; } - [self sdl_updateWithCompletionHandler:nil]; + [self sdl_updateCellsToDelete:[self buildDeleteMenuItems: oldStatusList] cellsToAdd:[self buildAddMenuItems:updatedStatusList] withCompletionHandler:nil]; +} + +#pragma mark - Build Deletes, Keeps, Adds +- (NSArray *)buildDeleteMenuItems:(NSArray *)oldStatusList { + NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; + + [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { + if(status.integerValue == 0) { // 0 means the cell was marked for Deletion + [deleteCells addObject:self.oldMenuCells[index]]; + } + }]; + return [deleteCells copy]; +} + +- (NSArray *)buildAddMenuItems:(NSArray *)newStatusList { + NSMutableArray *addCells = [[NSMutableArray alloc] init]; + + [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { + if(status.integerValue == 1) { // 1 means the cell was marked for add + [addCells addObject:self.menuCells[index]]; + } + }]; + return [addCells copy]; +} + +- (NSArray *)buildKeepMenuItems:(NSArray *)oldStatusList { + NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; + + [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { + if(status.integerValue == 2) { // 2 means the cell was marked for Keep + [keepMenuCells addObject:self.oldMenuCells[index]]; + } + }]; + + return [keepMenuCells copy]; } #pragma mark - Updating System -- (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { +- (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells withCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone] || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) { @@ -182,7 +231,7 @@ - (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler } __weak typeof(self) weakself = self; - [self sdl_sendDeleteCurrentMenu:^(NSError * _Nullable error) { + [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { [weakself sdl_sendCurrentMenu:^(NSError * _Nullable error) { weakself.inProgressUpdate = nil; @@ -191,7 +240,7 @@ - (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler } if (weakself.hasQueuedUpdate) { - [weakself sdl_updateWithCompletionHandler:nil]; + [weakself sdl_updateCellsToDelete:deleteCells cellsToAdd:addCells withCompletionHandler:nil]; weakself.hasQueuedUpdate = NO; } }]; @@ -200,14 +249,13 @@ - (void)sdl_updateWithCompletionHandler:(nullable SDLMenuUpdateCompletionHandler #pragma mark Delete Old Menu Items -- (void)sdl_sendDeleteCurrentMenu:(SDLMenuUpdateCompletionHandler)completionHandler { - if (self.oldMenuCells.count == 0) { +- (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuCells withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { //update Function to only delete the cells be need to delete , pass in the List + if (self.oldMenuCells.count == 0 || deleteMenuCells == nil) { completionHandler(nil); return; } - NSArray *deleteMenuCommands = [self sdl_deleteCommandsForCells:self.oldMenuCells]; - self.oldMenuCells = @[]; + NSArray *deleteMenuCommands = [self sdl_deleteCommandsForCells: deleteMenuCells]; [self.connectionManager sendRequests:deleteMenuCommands progressHandler:nil completionHandler:^(BOOL success) { if (!success) { SDLLogW(@"Unable to delete all old menu commands"); From 53bde973c442e802dd9cb189769d34ac2030d9ba Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 16 May 2019 09:03:20 -0400 Subject: [PATCH 067/179] Added documenatation to SDLIAPDataSession class --- SmartDeviceLink/SDLIAPDataSession.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index e9e0ddfc4..791884800 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -96,7 +96,7 @@ - (SDLStreamEndHandler)sdl_dataStreamEndedHandler { return; } - // The handler will be called on the IO thread, but the session stop method must be called on the main thread + // The handler will be called on the I/O thread, but the session stop method must be called on the main thread dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf destroySession]; @@ -122,7 +122,6 @@ - (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; while (istream.streamStatus == NSStreamStatusOpen && istream.hasBytesAvailable) { // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport. - NSInteger bytesRead = [istream read:buf maxLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; if (bytesRead < 0) { SDLLogE(@"Failed to read from data stream"); @@ -154,6 +153,8 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { __strong typeof(weakSelf) strongSelf = weakSelf; SDLLogE(@"Data stream error"); + + // To prevent deadlocks the handler must return to the runloop and not block the thread dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf destroySession]; if (![strongSelf.session.protocol isEqualToString:LegacyProtocolString]) { @@ -162,7 +163,6 @@ - (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { } }); - // To prevent deadlocks the handler must return to the runloop and not block the thread }; } From 58987c35a8151e577a3cd0fac9193c3ffdab9d83 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 17 May 2019 10:00:12 -0400 Subject: [PATCH 068/179] Fix review issues --- SmartDeviceLink/SDLRPCMessage.h | 2 +- .../RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLRPCMessage.h b/SmartDeviceLink/SDLRPCMessage.h index 1f2ad0e04..436ebcdfa 100644 --- a/SmartDeviceLink/SDLRPCMessage.h +++ b/SmartDeviceLink/SDLRPCMessage.h @@ -58,7 +58,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic, readonly) NSString *name; /** - The JSONRPC parameters + The JSON-RPC parameters */ @property (strong, nonatomic, readonly) NSMutableDictionary *parameters; diff --git a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m index 415c43bcc..c6ebbe9dc 100644 --- a/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m +++ b/SmartDeviceLinkTests/RPCSpecs/SuperclassSpecs/SDLRPCMessageSpec.m @@ -44,8 +44,9 @@ SDLRPCMessage* testMessage = [[SDLRPCMessage alloc] initWithName:@""]; [testMessage setParameters:@"ADogAPanicInAPagoda" value:@"adogaPAnIcinaPAgoDA"]; + expect([testMessage getParameters:@"ADogAPanicInAPagoda"]).to(equal(@"adogaPAnIcinaPAgoDA")); #pragma clang diagnostic pop - + expect(testMessage.parameters[@"ADogAPanicInAPagoda"]).to(equal(@"adogaPAnIcinaPAgoDA")); }); From c79402553372fbc7e5786a8a279225c301832fa8 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 17 May 2019 13:44:36 -0400 Subject: [PATCH 069/179] Restructure IAP Session / Transport relationships * Remove various delegates * Structure the sessions as a superclass/subclass relationship * Tests are currently broken --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 12 - SmartDeviceLink/SDLIAPControlSession.h | 14 +- SmartDeviceLink/SDLIAPControlSession.m | 249 ++++++------ .../SDLIAPControlSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPDataSession.h | 15 +- SmartDeviceLink/SDLIAPDataSession.m | 373 +++++++++++++----- SmartDeviceLink/SDLIAPSession.h | 20 +- SmartDeviceLink/SDLIAPSession.m | 259 +----------- SmartDeviceLink/SDLIAPSessionDelegate.h | 29 -- SmartDeviceLink/SDLIAPTransport.m | 29 +- SmartDeviceLink/SDLStreamDelegate.h | 26 -- SmartDeviceLink/SDLStreamDelegate.m | 96 ----- .../TransportSpecs/iAP/SDLIAPSessionSpec.m | 3 +- 13 files changed, 431 insertions(+), 696 deletions(-) delete mode 100644 SmartDeviceLink/SDLIAPSessionDelegate.h delete mode 100644 SmartDeviceLink/SDLStreamDelegate.h delete mode 100644 SmartDeviceLink/SDLStreamDelegate.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 3e3058146..f5a383255 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1487,9 +1487,6 @@ E4139D1E1F6017770005B6EA /* SDLLifecycleConfigurationUpdate.m in Sources */ = {isa = PBXBuildFile; fileRef = E4139D1C1F6017770005B6EA /* SDLLifecycleConfigurationUpdate.m */; }; E9C32B911AB20BA200F283AF /* SDLIAPSession.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C32B891AB20BA200F283AF /* SDLIAPSession.h */; }; E9C32B921AB20BA200F283AF /* SDLIAPSession.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C32B8A1AB20BA200F283AF /* SDLIAPSession.m */; }; - E9C32B931AB20BA200F283AF /* SDLIAPSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C32B8B1AB20BA200F283AF /* SDLIAPSessionDelegate.h */; }; - E9C32B941AB20BA200F283AF /* SDLStreamDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C32B8C1AB20BA200F283AF /* SDLStreamDelegate.h */; }; - E9C32B951AB20BA200F283AF /* SDLStreamDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C32B8D1AB20BA200F283AF /* SDLStreamDelegate.m */; }; E9C32B961AB20BA200F283AF /* SDLTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C32B8E1AB20BA200F283AF /* SDLTimer.h */; }; E9C32B971AB20BA200F283AF /* SDLTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C32B8F1AB20BA200F283AF /* SDLTimer.m */; }; E9C32B9C1AB20C5900F283AF /* EAAccessory+SDLProtocols.h in Headers */ = {isa = PBXBuildFile; fileRef = E9C32B981AB20C5900F283AF /* EAAccessory+SDLProtocols.h */; }; @@ -3124,9 +3121,6 @@ E4139D1C1F6017770005B6EA /* SDLLifecycleConfigurationUpdate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLifecycleConfigurationUpdate.m; sourceTree = ""; }; E9C32B891AB20BA200F283AF /* SDLIAPSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLIAPSession.h; sourceTree = ""; }; E9C32B8A1AB20BA200F283AF /* SDLIAPSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLIAPSession.m; sourceTree = ""; }; - E9C32B8B1AB20BA200F283AF /* SDLIAPSessionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLIAPSessionDelegate.h; sourceTree = ""; }; - E9C32B8C1AB20BA200F283AF /* SDLStreamDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLStreamDelegate.h; sourceTree = ""; }; - E9C32B8D1AB20BA200F283AF /* SDLStreamDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLStreamDelegate.m; sourceTree = ""; }; E9C32B8E1AB20BA200F283AF /* SDLTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLTimer.h; sourceTree = ""; }; E9C32B8F1AB20BA200F283AF /* SDLTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLTimer.m; sourceTree = ""; }; E9C32B981AB20C5900F283AF /* EAAccessory+SDLProtocols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "EAAccessory+SDLProtocols.h"; sourceTree = ""; }; @@ -5366,11 +5360,8 @@ 884DFBCA2289F6EA00EA8846 /* Control Session */, E9C32B891AB20BA200F283AF /* SDLIAPSession.h */, E9C32B8A1AB20BA200F283AF /* SDLIAPSession.m */, - E9C32B8B1AB20BA200F283AF /* SDLIAPSessionDelegate.h */, 5D61FADA1A84238A00846EE7 /* SDLIAPTransport.h */, 5D61FADB1A84238A00846EE7 /* SDLIAPTransport.m */, - E9C32B8C1AB20BA200F283AF /* SDLStreamDelegate.h */, - E9C32B8D1AB20BA200F283AF /* SDLStreamDelegate.m */, 880FE6252267AE5300723732 /* SDLIAPConstants.h */, 880FE6262267AE5300723732 /* SDLIAPConstants.m */, ); @@ -6130,7 +6121,6 @@ 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 */, @@ -6168,7 +6158,6 @@ 5D61FCC91A84238C00846EE7 /* SDLIgnitionStableStatus.h in Headers */, 884E701F21FB983F008D53BA /* SDLAppServiceManifest.h in Headers */, DA9F7E6B1DCBFB0700ACAE48 /* SDLDeliveryMode.h in Headers */, - E9C32B941AB20BA200F283AF /* SDLStreamDelegate.h in Headers */, DA9F7E871DCC049900ACAE48 /* SDLSubscribeWayPoints.h in Headers */, 88D99DB52289C82F0039E047 /* SDLIAPControlSessionDelegate.h in Headers */, 5D61FDBB1A84238C00846EE7 /* SDLSystemAction.h in Headers */, @@ -7240,7 +7229,6 @@ 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 */, diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index 1c836d0ce..aa0a73eb1 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -8,7 +8,8 @@ #import -@class SDLIAPSession; +#import "SDLIAPSession.h" + @class EAAccessory; @protocol SDLIAPControlSessionDelegate; @@ -20,12 +21,7 @@ NS_ASSUME_NONNULL_BEGIN * * When the protocol string is received from Core, the control session is closed as a new session with Core must be established with the received protocol string. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and new attempt is made to establish a control session with Core. */ -@interface SDLIAPControlSession : NSObject - -/** - * Session for getting the protocol string from Core. The protocol string is the protocol used for communication with the accessory. - */ -@property (nullable, strong, nonatomic, readonly) SDLIAPSession *session; +@interface SDLIAPControlSession : SDLIAPSession /** * The unique ID assigned to the session between the app and accessory. If no session exists the `connectionID` will be 0. @@ -42,11 +38,11 @@ NS_ASSUME_NONNULL_BEGIN /** * Creates a new control session. * - * @param session The new control session. If a `nil` session is passed, the delegate will be notified that it should attempt to establish a new control session. + * @param accessory The accessory to connect to. * @param delegate The control session delegate * @return A SDLIAPControlSession object */ -- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate; +- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate; /** * Starts a control session. diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 3ff3802a9..4829db8a2 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -13,9 +13,7 @@ #import "SDLIAPConstants.h" #import "SDLIAPControlSessionDelegate.h" #import "SDLIAPSession.h" -#import "SDLIAPSessionDelegate.h" #import "SDLLogMacros.h" -#import "SDLStreamDelegate.h" #import "SDLTimer.h" @@ -23,9 +21,8 @@ int const ProtocolIndexTimeoutSeconds = 10; -@interface SDLIAPControlSession () +@interface SDLIAPControlSession () -@property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; @property (nullable, strong, nonatomic) SDLTimer *protocolIndexTimer; @property (weak, nonatomic) id delegate; @@ -33,15 +30,14 @@ @interface SDLIAPControlSession () @implementation SDLIAPControlSession -- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate { +- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate { SDLLogV(@"SDLIAPControlSession init"); - self = [super init]; + self = [super initWithAccessory:accessory forProtocol:ControlProtocolString]; if (!self) { return nil; } - _session = session; _protocolIndexTimer = nil; _delegate = delegate; @@ -49,22 +45,15 @@ - (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id - (void)retryControlSession; -- (void)controlSession:(SDLIAPSession *)controlSession didGetProtocolString:(NSString *)protocolString forConnectedAccessory:(EAAccessory *)accessory; +- (void)controlSession:(SDLIAPControlSession *)controlSession didReceiveProtocolString:(NSString *)protocolString; @end diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index 2de3f4341..cff986288 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -8,19 +8,14 @@ #import -@class SDLIAPSession; +#import "SDLIAPSession.h" @protocol SDLIAPDataSessionDelegate; NS_ASSUME_NONNULL_BEGIN -@interface SDLIAPDataSession : NSObject - -/** - * The communications channel between the app and the SDL enabled accessory. - */ -@property (nullable, strong, nonatomic, readonly) SDLIAPSession *session; +@interface SDLIAPDataSession : SDLIAPSession /** * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. @@ -43,11 +38,11 @@ NS_ASSUME_NONNULL_BEGIN /** * Creates a new data session. * - * @param session The new data session. If a `nil` session is passed, the delegate will be notified that it should attempt to establish a new data session. + * @param accessory The new connected accessory. * @param delegate The data session delegate * @return A SDLIAPSession object */ -- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate; +- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; /** * Starts a data session. @@ -59,6 +54,8 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)destroySession; +- (void)sendData:(NSData *)data; + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 791884800..4121d2493 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -12,199 +12,354 @@ #import "SDLIAPConstants.h" #import "SDLIAPDataSessionDelegate.h" #import "SDLIAPSession.h" -#import "SDLIAPSessionDelegate.h" #import "SDLLogMacros.h" -#import "SDLStreamDelegate.h" +#import "SDLMutableDataQueue.h" +NSString *const IOStreamThreadName = @"com.smartdevicelink.iostream"; +NSTimeInterval const IOStreamThreadWaitSecs = 1.0; NS_ASSUME_NONNULL_BEGIN -@interface SDLIAPDataSession () +@interface SDLIAPDataSession () -@property (nullable, strong, nonatomic, readwrite) SDLIAPSession *session; +@property (nullable, nonatomic, strong) NSThread *ioStreamThread; +@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue; @property (weak, nonatomic) id delegate; +@property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore; @end @implementation SDLIAPDataSession -- (instancetype)initWithSession:(nullable SDLIAPSession *)session delegate:(id)delegate { +- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; { SDLLogV(@"SDLIAPDataSession init"); - self = [super init]; + self = [super initWithAccessory:accessory forProtocol:protocol]; if (!self) { return nil; } - _session = session; _delegate = delegate; + _sendDataQueue = [[SDLMutableDataQueue alloc] init]; + _canceledSemaphore = dispatch_semaphore_create(0); return self; } - (void)startSession { - if (_session == nil) { + if (self.accessory == nil) { SDLLogW(@"Failed to setup data session"); if (self.delegate == nil) { return; } [self.delegate retryDataSession]; } else { - SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.session.accessory.name, self.session.protocol); - self.session.delegate = self; - SDLStreamDelegate *ioStreamDelegate = [[SDLStreamDelegate alloc] init]; - self.session.streamDelegate = ioStreamDelegate; - ioStreamDelegate.streamHasBytesHandler = [self sdl_dataStreamHasBytesHandler]; - ioStreamDelegate.streamEndHandler = [self sdl_dataStreamEndedHandler]; - ioStreamDelegate.streamErrorHandler = [self sdl_dataStreamErroredHandler]; - - if (![self.session start]) { - SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.session.accessory); + SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.accessory.name, self.protocolString); + + if (![self start]) { + SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.accessory); [self destroySession]; if (self.delegate == nil) { return; } [self.delegate retryDataSession]; } + + self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil]; + [self.ioStreamThread setName:IOStreamThreadName]; + [self.ioStreamThread start]; + } +} + +- (void)stop { + if ([NSThread isMainThread]) { + [self sdl_stop]; + } else { + dispatch_sync(dispatch_get_main_queue(), ^{ + [self sdl_stop]; + }); } } +- (void)sdl_stop { + NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); + + if (self.ioStreamThread == nil) { + SDLLogV(@"Stopping data session but no thread established."); + self.eaSession = nil; + return; + } + + [self.ioStreamThread cancel]; + + // Waiting for the I/O streams of the data session to close + [self sdl_isIOThreadCanceled:self.canceledSemaphore completionHandler:^(BOOL success) { + if (success == NO) { + SDLLogE(@"Destroying thread (IOStreamThread) for data session when I/O streams have not yet closed."); + } + self.ioStreamThread = nil; + self.eaSession = nil; + }]; +} + - (void)destroySession { - if (_session == nil) { + if (self.accessory == nil) { SDLLogV(@"Attempting to stop the data session but the session is nil"); return; } SDLLogD(@"Destroying the data session"); - [self.session stop]; - self.session.streamDelegate = nil; - self.session = nil; + [self stop]; +} + +/** + * Wait for the data session to detroy its input and output streams. The data EASession can not be destroyed until both streams have closed. + * + * @param canceledSemaphore When the canceled semaphore is released, the data session's input and output streams have been destroyed. + * @param completionHandler Returns whether or not the data session's I/O streams were closed successfully. + */ +- (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completionHandler:(void (^)(BOOL success))completionHandler { + long lWait = dispatch_semaphore_wait(canceledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(IOStreamThreadWaitSecs * NSEC_PER_SEC))); + if (lWait == 0) { + SDLLogD(@"Stream thread canceled successfully"); + return completionHandler(YES); + } else { + SDLLogE(@"Failed to cancel stream thread"); + return completionHandler(NO); + } +} + +#pragma mark - data send methods + +- (void)sendData:(NSData *)data { + // Enqueue the data for transmission on the IO thread + [self.sendDataQueue enqueueBuffer:data.mutableCopy]; + + [self performSelector:@selector(sdl_dequeueAndWriteToOutputStream) onThread:self.ioStreamThread withObject:nil waitUntilDone:NO]; +} + +- (void)sdl_dequeueAndWriteToOutputStream { + if ([self.ioStreamThread isCancelled]) { + SDLLogV(@"Attempted to send data on I/O thread but the thread is cancelled."); + return; + } + + NSOutputStream *ostream = self.eaSession.outputStream; + if (!ostream.hasSpaceAvailable) { + SDLLogV(@"Attempted to send data with output stream but there is no space available."); + return; + } + + NSMutableData *remainder = [self.sendDataQueue frontBuffer]; + + if (remainder != nil && ostream.streamStatus == NSStreamStatusOpen) { + NSUInteger bytesRemaining = remainder.length; + NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; + if (bytesWritten < 0) { + if (ostream.streamError != nil) { + [self sdl_handleOutputStreamWriteError:ostream.streamError]; + } else { + // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory. + SDLLogE(@"Output stream write operation failed"); + } + } else if (bytesWritten == bytesRemaining) { + // Remove the data from the queue + [self.sendDataQueue popBuffer]; + } else { + // Cleave the sent bytes from the data, the remainder will sit at the head of the queue + [remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0]; + } + } +} + +- (void)sdl_handleOutputStreamWriteError:(NSError *)error { + SDLLogE(@"Output stream error: %@", error); + // TODO: We should look at the domain and the code as a tuple and decide how to handle the error based on both values. For now, if the stream is closed, we will flush the send queue and leave it as-is otherwise so that temporary error conditions can be dealt with by retrying + if (self.eaSession == nil || + self.eaSession.outputStream == nil || + self.eaSession.outputStream.streamStatus != NSStreamStatusOpen) { + [self.sendDataQueue removeAllObjects]; + } } #pragma mark - Data Stream Handlers +- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { + switch (eventCode) { + case NSStreamEventOpenCompleted: { + [self streamDidOpen:stream]; + break; + } + case NSStreamEventHasBytesAvailable: { + [self streamHasBytesAvailable:(NSInputStream *)stream]; + break; + } + case NSStreamEventHasSpaceAvailable: { + [self streamHasSpaceToWrite:(NSOutputStream *)stream]; + break; + } + case NSStreamEventErrorOccurred: { + [self streamDidError:stream]; + break; + } + case NSStreamEventEndEncountered: { + [self streamDidEnd:stream]; + break; + } + case NSStreamEventNone: + default: { + break; + } + } +} + +- (void)streamDidOpen:(NSStream *)stream { + if (stream == [self.eaSession outputStream]) { + SDLLogD(@"Output Stream Opened"); + self.isOutputStreamOpen = YES; + } else if (stream == [self.eaSession inputStream]) { + SDLLogD(@"Input Stream Opened"); + self.isInputStreamOpen = YES; + } + + // When both streams are open, session initialization is complete. Let the delegate know. + if (self.isInputStreamOpen && self.isOutputStreamOpen) { + SDLLogV(@"Data session I/O streams opened for protocol: %@", self.protocolString); + if (self.delegate == nil) { return; } + [self.delegate transportConnected]; + } +} + /** * Handler called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. - * - * @return A SDLStreamEndHandler handler */ -- (SDLStreamEndHandler)sdl_dataStreamEndedHandler { - __weak typeof(self) weakSelf = self; - return ^(NSStream *stream) { - NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - __strong typeof(weakSelf) strongSelf = weakSelf; - - SDLLogD(@"Data stream ended"); - if (strongSelf.session == nil) { - SDLLogD(@"Data session is nil"); - return; - } +- (void)streamDidEnd:(NSStream *)stream { + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - // The handler will be called on the I/O thread, but the session stop method must be called on the main thread - dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf destroySession]; + SDLLogD(@"Data stream ended"); + if (self.accessory == nil) { + SDLLogD(@"Data session is nil"); + return; + } - if (self.delegate == nil) { return; } - [self.delegate retryDataSession]; - }); + // The handler will be called on the I/O thread, but the session stop method must be called on the main thread + dispatch_async(dispatch_get_main_queue(), ^{ + [self destroySession]; + + if (self.delegate == nil) { return; } + [self.delegate retryDataSession]; + }); - // To prevent deadlocks the handler must return to the runloop and not block the thread - }; + // To prevent deadlocks the handler must return to the runloop and not block the thread } /** * Handler called when the session gets a `NSStreamEventHasBytesAvailable` event code. The data is passed to the listener. - * - * @return A SDLStreamHasBytesHandler handler */ -- (SDLStreamHasBytesHandler)sdl_dataStreamHasBytesHandler { - __weak typeof(self) weakSelf = self; - return ^(NSInputStream *istream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - - NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; - while (istream.streamStatus == NSStreamStatusOpen && istream.hasBytesAvailable) { - // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport. - NSInteger bytesRead = [istream read:buf maxLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; - if (bytesRead < 0) { - SDLLogE(@"Failed to read from data stream"); - break; - } +- (void)streamHasBytesAvailable:(NSInputStream *)inputStream { + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); + uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; + while (inputStream.streamStatus == NSStreamStatusOpen && inputStream.hasBytesAvailable) { + // It is necessary to check the stream status and whether there are bytes available because the dataStreamHasBytesHandler is executed on the IO thread and the accessory disconnect notification arrives on the main thread, causing data to be passed to the delegate while the main thread is tearing down the transport. + NSInteger bytesRead = [inputStream read:buf maxLength:[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; + if (bytesRead < 0) { + SDLLogE(@"Failed to read from data stream"); + break; + } - NSData *dataIn = [NSData dataWithBytes:buf length:(NSUInteger)bytesRead]; - SDLLogBytes(dataIn, SDLLogBytesDirectionReceive); + NSData *dataIn = [NSData dataWithBytes:buf length:(NSUInteger)bytesRead]; + SDLLogBytes(dataIn, SDLLogBytesDirectionReceive); - if (bytesRead > 0) { - if (strongSelf.delegate == nil) { return; } - [strongSelf.delegate dataReceived:dataIn]; - } else { - break; - } + if (bytesRead > 0) { + if (self.delegate == nil) { return; } + [self.delegate dataReceived:dataIn]; + } else { + break; } - }; + } +} + +- (void)streamHasSpaceToWrite:(NSOutputStream *)outputStream { + [self sdl_dequeueAndWriteToOutputStream]; } /** * Handler called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. - * - * @return A SDLStreamErrorHandler handler */ -- (SDLStreamErrorHandler)sdl_dataStreamErroredHandler { - __weak typeof(self) weakSelf = self; - return ^(NSStream *stream) { - NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - __strong typeof(weakSelf) strongSelf = weakSelf; - - SDLLogE(@"Data stream error"); - - // To prevent deadlocks the handler must return to the runloop and not block the thread - dispatch_async(dispatch_get_main_queue(), ^{ - [strongSelf destroySession]; - if (![strongSelf.session.protocol isEqualToString:LegacyProtocolString]) { - if (self.delegate == nil) { return; } - [self.delegate retryDataSession]; - } - }); +- (void)streamDidError:(NSStream *)stream { + NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); + + SDLLogE(@"Data session I/O streams errored for protocol: %@", self.protocolString); - }; + // To prevent deadlocks the handler must return to the runloop and not block the thread + dispatch_async(dispatch_get_main_queue(), ^{ + [self destroySession]; + if (![self.protocolString isEqualToString:LegacyProtocolString]) { + if (self.delegate == nil) { return; } + [self.delegate retryDataSession]; + } + }); } -#pragma mark - SDLIAPSessionDelegate +#pragma mark - background I/O for data session -/** - * Called after both the input and output streams of the session have opened. - * - * @param session The current session - */ -- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session { - if ([session.protocol isEqualToString:ControlProtocolString]) { - // Control session +// Data session I/O thread +- (void)sdl_accessoryEventLoop { + @autoreleasepool { + NSAssert(self.eaSession != nil, @"Session must be assigned before calling"); + if (!self.eaSession) { + return; + } + + [self startStream:self.eaSession.inputStream]; + [self startStream:self.eaSession.outputStream]; + + SDLLogD(@"Starting the accessory event loop on thread: %@", NSThread.currentThread.name); + + while (!self.ioStreamThread.cancelled) { + // Enqueued data will be written to and read from the streams in the runloop + [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25f]]; + } + + SDLLogD(@"Closing the accessory event loop on thread: %@", NSThread.currentThread.name); + + // Close I/O streams of the data session. When the streams are closed. Notify the thread that it can close + [self sdl_closeSession]; + + dispatch_semaphore_signal(self.canceledSemaphore); + } +} + +// Must be called on accessoryEventLoop. +- (void)sdl_closeSession { + if (!self.eaSession) { return; } - SDLLogV(@"Data session I/O streams opened for protocol: %@", session.protocol); - if (self.delegate == nil) { return; } - [self.delegate transportConnected]; + SDLLogD(@"Closing EASession for accessory connection id: %tu, name: %@", self.eaSession.accessory.connectionID, self.eaSession.accessory.name); + + [self stopStream:[self.eaSession inputStream]]; + [self stopStream:[self.eaSession outputStream]]; } -/** - * Called when either the input and output streams of the session have errored. If the data session errored, do nothing. - * - * @param session The current session - */ -- (void)onSessionStreamsEnded:(SDLIAPSession *)session { - SDLLogV(@"Data session I/O streams errored for protocol: %@", session.protocol); +- (void)startStream:(NSStream *)stream { + NSAssert([[NSThread currentThread] isEqual:self.ioStreamThread] || [NSThread isMainThread], @"stopStream is being called on the wrong thread!!!"); + [super startStream:stream]; +} + +- (void)stopStream:(NSStream *)stream { + NSAssert([[NSThread currentThread] isEqual:self.ioStreamThread] || [NSThread isMainThread], @"stopStream is being called on the wrong thread!!!"); + [super stopStream:stream]; } #pragma mark - Getters - (NSUInteger)connectionID { - return self.session.accessory.connectionID; + return self.accessory.connectionID; } - (BOOL)isSessionInProgress { - return (self.session != nil && !self.session.isStopped); + return !self.isStopped; } - (BOOL)isSessionConnected { - return (self.session != nil && self.sessionInProgress); + return self.sessionInProgress; } #pragma mark - Lifecycle Destruction diff --git a/SmartDeviceLink/SDLIAPSession.h b/SmartDeviceLink/SDLIAPSession.h index 542d93786..9c1966c31 100644 --- a/SmartDeviceLink/SDLIAPSession.h +++ b/SmartDeviceLink/SDLIAPSession.h @@ -2,31 +2,31 @@ // SDLIAPSession.h // -#import "SDLIAPSessionDelegate.h" #import #import -@class SDLStreamDelegate; NS_ASSUME_NONNULL_BEGIN typedef void (^SessionCompletionHandler)(BOOL success); -@interface SDLIAPSession : NSObject +@interface SDLIAPSession : NSObject +@property (nonatomic, assign) BOOL isInputStreamOpen; +@property (nonatomic, assign) BOOL isOutputStreamOpen; @property (nullable, strong, nonatomic) EAAccessory *accessory; -@property (nullable, strong, nonatomic) NSString *protocol; -@property (nullable, strong, nonatomic) EASession *easession; -@property (nullable, weak, nonatomic) id delegate; -@property (nullable, strong, nonatomic) SDLStreamDelegate *streamDelegate; +@property (nullable, strong, nonatomic) NSString *protocolString; +@property (nullable, strong, nonatomic) EASession *eaSession; @property (assign, readonly, getter=isStopped) BOOL stopped; -- (instancetype)initWithAccessory:(EAAccessory *)accessory - forProtocol:(NSString *)protocol; +- (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol; - (BOOL)start; - (void)stop; -- (void)sendData:(NSData *)data; + +- (void)startStream:(NSStream *)stream; +- (void)stopStream:(NSStream *)stream; + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index b397780fb..9f41f04ab 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -5,25 +5,10 @@ #import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLMutableDataQueue.h" -#import "SDLStreamDelegate.h" #import "SDLTimer.h" NS_ASSUME_NONNULL_BEGIN -NSString *const IOStreamThreadName = @"com.smartdevicelink.iostream"; -NSTimeInterval const IOStreamThreadWaitSecs = 1.0; - -@interface SDLIAPSession () - -@property (nonatomic, assign) BOOL isInputStreamOpen; -@property (nonatomic, assign) BOOL isOutputStreamOpen; -@property (nonatomic, assign) BOOL isDataSession; -@property (nullable, nonatomic, strong) NSThread *ioStreamThread; -@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue; -@property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore; - -@end - @implementation SDLIAPSession @@ -34,11 +19,8 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString self = [super init]; if (self) { - _isDataSession = [protocol isEqualToString:@"com.smartdevicelink.prot0"] ? NO : YES; _accessory = accessory; - _protocol = protocol; - _canceledSemaphore = dispatch_semaphore_create(0); - _sendDataQueue = [[SDLMutableDataQueue alloc] init]; + _protocolString = protocol; _isInputStreamOpen = NO; _isOutputStreamOpen = NO; } @@ -50,197 +32,22 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString - (BOOL)start { SDLLogD(@"Opening EASession with accessory: %@", self.accessory.name); - self.easession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocol]; - return [self sdl_startWithSession:self.easession]; -} + self.eaSession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocolString]; -- (BOOL)sdl_startWithSession:(EASession *)session { - __weak typeof(self) weakSelf = self; - if (session == nil) { - SDLLogE(@"Error creating the session object"); - return NO; - } else { - __strong typeof(self) strongSelf = weakSelf; - strongSelf.streamDelegate.streamErrorHandler = [self streamErroredHandler]; - strongSelf.streamDelegate.streamOpenHandler = [self streamOpenedHandler]; - if (self.isDataSession) { - SDLLogD(@"Created the data session successfully"); - self.streamDelegate.streamHasSpaceHandler = [self sdl_streamHasSpaceHandler]; - // Start I/O event loop processing events in iAP channel - self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil]; - [self.ioStreamThread setName:IOStreamThreadName]; - [self.ioStreamThread start]; - } else { - // No need for its own thread as only a small amount of data will be transmitted before control session is destroyed - SDLLogD(@"Created the control session successfully"); - [self startStream:self.easession.outputStream]; - [self startStream:self.easession.inputStream]; - } - return YES; - } + return (self.eaSession != nil); } -- (void)stop { - if ([NSThread isMainThread]) { - [self sdl_stop]; - } else { - dispatch_sync(dispatch_get_main_queue(), ^{ - [self sdl_stop]; - }); - } -} - -- (void)sdl_stop { - NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); - - if (self.isDataSession) { - if (self.ioStreamThread == nil) { - SDLLogV(@"Stopping data session but no thread established."); - self.isDataSession = NO; - self.easession = nil; - return; - } - - [self.ioStreamThread cancel]; - - // Waiting for the I/O streams of the data session to close - [self sdl_isIOThreadCanceled:self.canceledSemaphore completionHandler:^(BOOL success) { - if (success == NO) { - SDLLogE(@"Destroying thread (IOStreamThread) for data session when I/O streams have not yet closed."); - } - self.ioStreamThread = nil; - self.isDataSession = NO; - self.easession = nil; - }]; - } else { - [self stopStream:self.easession.outputStream]; - [self stopStream:self.easession.inputStream]; - self.easession = nil; - } -} - -/** - * Wait for the data session to detroy its input and output streams. The data EASession can not be destroyed until both streams have closed. - * - * @param canceledSemaphore When the canceled semaphore is released, the data session's input and output streams have been destroyed. - * @param completionHandler Returns whether or not the data session's I/O streams were closed successfully. - */ -- (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completionHandler:(void (^)(BOOL success))completionHandler { - long lWait = dispatch_semaphore_wait(canceledSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(IOStreamThreadWaitSecs * NSEC_PER_SEC))); - if (lWait == 0) { - SDLLogD(@"Stream thread canceled successfully"); - return completionHandler(YES); - } else { - SDLLogE(@"Failed to cancel stream thread"); - return completionHandler(NO); - } -} +- (void)stop {} - (BOOL)isStopped { return !self.isOutputStreamOpen && !self.isInputStreamOpen; } -#pragma mark - data send methods - -- (void)sendData:(NSData *)data { - // Enqueue the data for transmission on the IO thread - [self.sendDataQueue enqueueBuffer:data.mutableCopy]; - - [self performSelector:@selector(sdl_dequeueAndWriteToOutputStream) onThread:self.ioStreamThread withObject:nil waitUntilDone:NO]; -} - -- (void)sdl_dequeueAndWriteToOutputStream { - if ([self.ioStreamThread isCancelled]) { - SDLLogV(@"Attempted to send data on I/O thread but the thread is cancelled."); - return; - } - - NSOutputStream *ostream = self.easession.outputStream; - if (!ostream.hasSpaceAvailable) { - SDLLogV(@"Attempted to send data with output stream but there is no space available."); - return; - } - - NSMutableData *remainder = [self.sendDataQueue frontBuffer]; - - if (remainder != nil && ostream.streamStatus == NSStreamStatusOpen) { - NSUInteger bytesRemaining = remainder.length; - NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; - if (bytesWritten < 0) { - if (ostream.streamError != nil) { - [self sdl_handleOutputStreamWriteError:ostream.streamError]; - } else { - // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory. - SDLLogE(@"Output stream write operation failed"); - } - } else if (bytesWritten == bytesRemaining) { - // Remove the data from the queue - [self.sendDataQueue popBuffer]; - } else { - // Cleave the sent bytes from the data, the remainder will sit at the head of the queue - [remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0]; - } - } -} - -- (void)sdl_handleOutputStreamWriteError:(NSError *)error { - SDLLogE(@"Output stream error: %@", error); - // TODO: We should look at the domain and the code as a tuple and decide how to handle the error based on both values. For now, if the stream is closed, we will flush the send queue and leave it as-is otherwise so that temporary error conditions can be dealt with by retrying - if (self.easession == nil || - self.easession.outputStream == nil || - self.easession.outputStream.streamStatus != NSStreamStatusOpen) { - [self.sendDataQueue removeAllObjects]; - } -} - -#pragma mark - background I/O for data session - -// Data session I/O thread -- (void)sdl_accessoryEventLoop { - @autoreleasepool { - NSAssert(self.easession, @"Session must be assigned before calling"); - - if (!self.easession) { - return; - } - - [self startStream:self.easession.inputStream]; - [self startStream:self.easession.outputStream]; - - SDLLogD(@"Starting the accessory event loop on thread: %@", NSThread.currentThread.name); - - while (!self.ioStreamThread.cancelled) { - // Enqueued data will be written to and read from the streams in the runloop - [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.25f]]; - } - - SDLLogD(@"Closing the accessory event loop on thread: %@", NSThread.currentThread.name); - - // Close I/O streams of the data session. When the streams are closed. Notify the thread that it can close - [self sdl_closeSession]; - - dispatch_semaphore_signal(self.canceledSemaphore); - } -} - -// Must be called on accessoryEventLoop. -- (void)sdl_closeSession { - if (!self.easession) { - return; - } - - SDLLogD(@"Closing EASession for accessory connection id: %tu, name: %@", self.easession.accessory.connectionID, self.easession.accessory.name); - - [self stopStream:[self.easession inputStream]]; - [self stopStream:[self.easession outputStream]]; -} - #pragma mark - Private Stream Lifecycle Helpers - (void)startStream:(NSStream *)stream { - stream.delegate = self.streamDelegate; - NSAssert((self.isDataSession && [[NSThread currentThread] isEqual:self.ioStreamThread]) || [NSThread isMainThread], @"startStream is being called on the wrong thread!!!"); + stream.delegate = self; [stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [stream open]; } @@ -251,9 +58,6 @@ - (void)stopStream:(NSStream *)stream { // When you disconect the cable you get a stream end event and come here but stream is already in closed state. // Still need to remove from run loop. - - NSAssert((self.isDataSession && [[NSThread currentThread] isEqual:self.ioStreamThread]) || [NSThread isMainThread], @"stopStream is being called on the wrong thread!!!"); - NSUInteger status1 = stream.streamStatus; if (status1 != NSStreamStatusNotOpen && status1 != NSStreamStatusClosed) { @@ -265,65 +69,16 @@ - (void)stopStream:(NSStream *)stream { NSUInteger status2 = stream.streamStatus; if (status2 == NSStreamStatusClosed) { - if (stream == [self.easession inputStream]) { + if (stream == [self.eaSession inputStream]) { SDLLogD(@"Input stream closed"); self.isInputStreamOpen = NO; - } else if (stream == [self.easession outputStream]) { + } else if (stream == [self.eaSession outputStream]) { SDLLogD(@"Output stream closed"); self.isOutputStreamOpen = NO; } } } - -#pragma mark - Stream Handlers - -- (SDLStreamOpenHandler)streamOpenedHandler { - __weak typeof(self) weakSelf = self; - - return ^(NSStream *stream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - - if (stream == [strongSelf.easession outputStream]) { - SDLLogD(@"Output Stream Opened"); - strongSelf.isOutputStreamOpen = YES; - } else if (stream == [strongSelf.easession inputStream]) { - SDLLogD(@"Input Stream Opened"); - strongSelf.isInputStreamOpen = YES; - } - - // When both streams are open, session initialization is complete. Let the delegate know. - if (strongSelf.isInputStreamOpen && strongSelf.isOutputStreamOpen) { - [strongSelf.delegate onSessionInitializationCompleteForSession:weakSelf]; - } - }; -} - -- (SDLStreamErrorHandler)streamErroredHandler { - __weak typeof(self) weakSelf = self; - - return ^(NSStream *stream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - - SDLLogW(@"Stream Error: %@", stream); - [strongSelf.delegate onSessionStreamsEnded:strongSelf]; - }; -} - -- (SDLStreamHasSpaceHandler)sdl_streamHasSpaceHandler { - __weak typeof(self) weakSelf = self; - - return ^(NSStream *stream) { - __strong typeof(weakSelf) strongSelf = weakSelf; - - if (!strongSelf.isDataSession) { - return; - } - - [strongSelf sdl_dequeueAndWriteToOutputStream]; - }; -} - @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPSessionDelegate.h b/SmartDeviceLink/SDLIAPSessionDelegate.h deleted file mode 100644 index 66d182aaa..000000000 --- a/SmartDeviceLink/SDLIAPSessionDelegate.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// SDLIAPSessionDelegate.h -// - -#import -@class SDLIAPSession; - -NS_ASSUME_NONNULL_BEGIN - -@protocol SDLIAPSessionDelegate - -/** - * Session initialized - * - * @param session A SDLIAPSession object - */ -- (void)onSessionInitializationCompleteForSession:(SDLIAPSession *)session; - - -/** - * Session ended - * - * @param session A SDLIAPSession object - */ -- (void)onSessionStreamsEnded:(SDLIAPSession *)session; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 5bab27bbb..53bec16a0 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -16,7 +16,6 @@ #import "SDLIAPDataSessionDelegate.h" #import "SDLIAPSession.h" #import "SDLLogMacros.h" -#import "SDLStreamDelegate.h" #import "SDLTimer.h" #import @@ -261,7 +260,7 @@ - (void)sdl_applicationDidEnterBackground:(NSNotification *)notification { */ - (void)sendData:(NSData *)data { if (!self.dataSession.sessionInProgress) { return; } - [self.dataSession.session sendData:data]; + [self.dataSession sendData:data]; } /** @@ -316,8 +315,7 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { * @return A SDLIAPControlSession object */ - (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)accessory { - SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:ControlProtocolString]; - return [[SDLIAPControlSession alloc] initWithSession:session delegate:self]; + return [[SDLIAPControlSession alloc] initWithAccessory:accessory delegate:self]; } /** @@ -328,8 +326,7 @@ - (SDLIAPControlSession *)sdl_createControlSessionWithAccessory:(EAAccessory *)a * @return A SDLIAPDataSession object */ - (SDLIAPDataSession *)sdl_createDataSessionWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol { - SDLIAPSession *session = [[SDLIAPSession alloc] initWithAccessory:accessory forProtocol:protocol]; - return [[SDLIAPDataSession alloc] initWithSession:session delegate:self]; + return [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocol]; } /** @@ -424,25 +421,25 @@ - (void)sdl_retryEstablishSession { #pragma mark Control Session +/** + * Called when the control session should be retried. + */ +- (void)retryControlSession { + SDLLogV(@"Retrying the control session"); + [self sdl_retryEstablishSession]; +} + /** * Called when the control session got the protocol string successfully and the data session can be opened with the protocol string. * * @param controlSession The control session * @param protocolString The protocol string to be used to open the data session - * @param accessory The accessory with which to create a data session */ -- (void)controlSession:(nonnull SDLIAPSession *)controlSession didGetProtocolString:(nonnull NSString *)protocolString forConnectedAccessory:(nonnull EAAccessory *)accessory { - self.dataSession = [self sdl_createDataSessionWithAccessory:accessory forProtocol:protocolString]; +- (void)controlSession:(nonnull SDLIAPControlSession *)controlSession didReceiveProtocolString:(nonnull NSString *)protocolString { + self.dataSession = [self sdl_createDataSessionWithAccessory:controlSession.accessory forProtocol:protocolString]; [self.dataSession startSession]; } -/** - * Called when the control session should be retried. - */ -- (void)retryControlSession { - SDLLogV(@"Retrying the control session"); - [self sdl_retryEstablishSession]; -} #pragma mark Data Session diff --git a/SmartDeviceLink/SDLStreamDelegate.h b/SmartDeviceLink/SDLStreamDelegate.h deleted file mode 100644 index f6b0115ad..000000000 --- a/SmartDeviceLink/SDLStreamDelegate.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// SDLStreamDelegate.h - -#import - -NS_ASSUME_NONNULL_BEGIN - -// Convenience typedefs -typedef void (^SDLStreamOpenHandler)(NSStream *stream); -typedef void (^SDLStreamHasBytesHandler)(NSInputStream *istream); -typedef void (^SDLStreamHasSpaceHandler)(NSOutputStream *ostream); -typedef void (^SDLStreamErrorHandler)(NSStream *stream); -typedef void (^SDLStreamEndHandler)(NSStream *stream); - - -@interface SDLStreamDelegate : NSObject - -@property (nullable, nonatomic, copy) SDLStreamOpenHandler streamOpenHandler; -@property (nullable, nonatomic, copy) SDLStreamHasBytesHandler streamHasBytesHandler; -@property (nullable, nonatomic, copy) SDLStreamHasSpaceHandler streamHasSpaceHandler; -@property (nullable, nonatomic, copy) SDLStreamErrorHandler streamErrorHandler; -@property (nullable, nonatomic, copy) SDLStreamEndHandler streamEndHandler; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLStreamDelegate.m b/SmartDeviceLink/SDLStreamDelegate.m deleted file mode 100644 index 11bba6e5e..000000000 --- a/SmartDeviceLink/SDLStreamDelegate.m +++ /dev/null @@ -1,96 +0,0 @@ -// -// SDLtreamDelegate.m -// - -#import "SDLStreamDelegate.h" -#import "SDLLogMacros.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface SDLStreamDelegate () { - dispatch_queue_t _input_stream_queue; -} - -@end - - -@implementation SDLStreamDelegate - -- (instancetype)init { - self = [super init]; - if (self) { - _streamOpenHandler = defaultStreamOpenHandler; - _streamHasBytesHandler = defaultStreamHasBytesHandler; - _streamHasSpaceHandler = defaultStreamHasSpaceHandler; - _streamErrorHandler = defaultStreamErrorHandler; - _streamEndHandler = defaultStreamErrorHandler; - - _input_stream_queue = dispatch_queue_create("com.sdl.streamdelegate.input", DISPATCH_QUEUE_SERIAL); - } - return self; -} - -- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { - switch (eventCode) { - case NSStreamEventOpenCompleted: { - if (_streamOpenHandler) { - self.streamOpenHandler(stream); - } - break; - } - case NSStreamEventHasBytesAvailable: { - if (_streamHasBytesHandler) { - dispatch_async(_input_stream_queue, ^{ - self.streamHasBytesHandler((NSInputStream *)stream); - }); - } - break; - } - case NSStreamEventHasSpaceAvailable: { - if (_streamHasSpaceHandler) { - self.streamHasSpaceHandler((NSOutputStream *)stream); - } - break; - } - case NSStreamEventErrorOccurred: { - if (_streamErrorHandler) { - self.streamErrorHandler(stream); - } - break; - } - case NSStreamEventEndEncountered: { - if (_streamEndHandler) { - self.streamEndHandler(stream); - } - break; - } - case NSStreamEventNone: - default: { - break; - } - } -} - -SDLStreamOpenHandler defaultStreamOpenHandler = ^(NSStream *stream) { - SDLLogV(@"Transport stream event open"); -}; - -SDLStreamHasBytesHandler defaultStreamHasBytesHandler = ^(NSInputStream *istream) { - SDLLogV(@"Transport stream event has bytes"); -}; - -SDLStreamHasSpaceHandler defaultStreamHasSpaceHandler = ^(NSOutputStream *ostream) { - SDLLogV(@"Transport stream event has space"); -}; - -SDLStreamErrorHandler defaultStreamErrorHandler = ^(NSStream *stream) { - SDLLogV(@"Transport stream event error"); -}; - -SDLStreamEndHandler defaultStreamEndHandler = ^(NSStream *stream) { - SDLLogV(@"Transport stream event end"); -}; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m index 672aa76b1..1e0992379 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m @@ -18,7 +18,6 @@ @interface SDLIAPSession () @property (nonatomic, assign) BOOL isInputStreamOpen; @property (nonatomic, assign) BOOL isOutputStreamOpen; -@property (nonatomic, assign) BOOL isDataSession; @property (nullable, nonatomic, strong) NSThread *ioStreamThread; @property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue; @property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore; @@ -67,7 +66,7 @@ - (BOOL)sdl_startWithSession:(EASession *)session; afterEach(^{ expect(iapSession).toNot(beNil()); - expect(iapSession.protocol).to(match(protocol)); + expect(iapSession.protocolString).to(match(protocol)); expect(iapSession.accessory).to(equal(mockAccessory)); expect(iapSession.canceledSemaphore).toNot(beNil()); expect(iapSession.sendDataQueue).toNot(beNil()); From 1b38bd23b4f7b1c35dfb0aa8946fd953b669c81a Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 17 May 2019 15:13:28 -0400 Subject: [PATCH 070/179] Fix documentation issues --- SmartDeviceLink/SDLSoftButtonManager.h | 3 +++ SmartDeviceLink/SDLSoftButtonReplaceOperation.h | 16 ++++++++++++++++ .../SDLSoftButtonTransitionOperation.h | 15 +++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/SmartDeviceLink/SDLSoftButtonManager.h b/SmartDeviceLink/SDLSoftButtonManager.h index 8a20b50f6..dfd3d7104 100644 --- a/SmartDeviceLink/SDLSoftButtonManager.h +++ b/SmartDeviceLink/SDLSoftButtonManager.h @@ -35,6 +35,9 @@ typedef void(^SDLSoftButtonUpdateCompletionHandler)(NSError *__nullable error); */ @property (copy, nonatomic) NSArray *softButtonObjects; +/** + All transitions made in-between beginUpdates and this method will occur as one RPC update. + */ @property (assign, nonatomic, getter=isBatchingUpdates) BOOL batchUpdates; - (instancetype)init NS_UNAVAILABLE; diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.h b/SmartDeviceLink/SDLSoftButtonReplaceOperation.h index 42bae5792..9adb5afb4 100644 --- a/SmartDeviceLink/SDLSoftButtonReplaceOperation.h +++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.h @@ -18,10 +18,26 @@ NS_ASSUME_NONNULL_BEGIN +/** + This class is an operation that takes a set of soft buttons and replaces the old set of soft buttons with the new set based on the capabilities available on the system. This operation will handle sending placeholder soft buttons with only text (if possible), uploading the initial state images, sending the initial state soft buttons with those images, and then uploading the other state images. + */ @interface SDLSoftButtonReplaceOperation : SDLAsynchronousOperation +/** + The primary text field on the system template. This is necessary to HAX a workaround for Sync 3. + */ @property (strong, nonatomic) NSString *mainField1; +/** + Initialize the replace operation + + @param connectionManager The manager that will send the resultant RPCs + @param fileManager The file manager that will handle uploading any images + @param capabilities The capabilites of the soft buttons on the current template + @param softButtonObjects The soft buttons that should be sent + @param mainField1 The primary text field of the system template + @return The operation + */ - (instancetype)initWithConnectionManager:(id)connectionManager fileManager:(SDLFileManager *)fileManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtonObjects:(NSArray *)softButtonObjects mainField1:(NSString *)mainField1; @end diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h index ca5a84bee..86650dc3c 100644 --- a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h @@ -17,10 +17,25 @@ NS_ASSUME_NONNULL_BEGIN +/** + This operation handles changing a set of soft button objects when some of those objects have changed state. + */ @interface SDLSoftButtonTransitionOperation : SDLAsynchronousOperation +/** + The primary text field on the system template. This is necessary to HAX a workaround for Sync 3. + */ @property (strong, nonatomic) NSString *mainField1; +/** + Initialize the transition operation + + @param connectionManager The manager that will send the resultant RPCs + @param capabilities The capabilites of the soft buttons on the current template + @param softButtonObjects The soft buttons that should be sent + @param mainField1 The primary text field of the system template + @return The transition operation + */ - (instancetype)initWithConnectionManager:(id)connectionManager capabilities:(SDLSoftButtonCapabilities *)capabilities softButtons:(NSArray *)softButtons mainField1:(NSString *)mainField1; @end From da195f18e68ace86629ae0d91db2589eb674f61f Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Mon, 20 May 2019 13:03:49 -0400 Subject: [PATCH 071/179] Add RPC subscription helper methods --- .../Example ObjC/VehicleDataManager.m | 8 ++-- .../Example Swift/VehicleDataManager.swift | 2 +- SmartDeviceLink/SDLManager.h | 40 +++++++++++++++++++ SmartDeviceLink/SDLManager.m | 21 ++++++++++ 4 files changed, 66 insertions(+), 5 deletions(-) diff --git a/Example Apps/Example ObjC/VehicleDataManager.m b/Example Apps/Example ObjC/VehicleDataManager.m index 999a22616..afb6ab267 100644 --- a/Example Apps/Example ObjC/VehicleDataManager.m +++ b/Example Apps/Example ObjC/VehicleDataManager.m @@ -37,7 +37,7 @@ - (instancetype)initWithManager:(SDLManager *)manager refreshUIHandler:(RefreshU _refreshUIHandler = refreshUIHandler; _vehicleOdometerData = @""; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(vehicleDataNotification:) name:SDLDidReceiveVehicleDataNotification object:nil]; + [_sdlManager subscribeToRPC:SDLDidReceiveVehicleDataNotification withObserver:self selector:@selector(vehicleDataNotification:)]; [self sdlex_resetOdometer]; return self; @@ -106,12 +106,12 @@ - (void)unsubscribeToVehicleOdometer { * * @param notification A SDLOnVehicleData notification */ -- (void)vehicleDataNotification:(SDLRPCNotificationNotification *)notification { - if (![notification.notification isKindOfClass:SDLOnVehicleData.class]) { +- (void)vehicleDataNotification:(SDLRPCMessage *)notification { + if (![notification isKindOfClass:SDLOnVehicleData.class]) { return; } - SDLOnVehicleData *onVehicleData = (SDLOnVehicleData *)notification.notification; + SDLOnVehicleData *onVehicleData = (SDLOnVehicleData *)notification; self.vehicleOdometerData = [NSString stringWithFormat:@"%@: %@ kph", VehicleDataOdometerName, onVehicleData.odometer]; if (!self.refreshUIHandler) { return; } diff --git a/Example Apps/Example Swift/VehicleDataManager.swift b/Example Apps/Example Swift/VehicleDataManager.swift index c5e2b187e..1d78edd42 100644 --- a/Example Apps/Example Swift/VehicleDataManager.swift +++ b/Example Apps/Example Swift/VehicleDataManager.swift @@ -23,7 +23,7 @@ class VehicleDataManager: NSObject { super.init() resetOdometer() - NotificationCenter.default.addObserver(self, selector: #selector(vehicleDataNotification(_:)), name: .SDLDidReceiveVehicleData, object: nil) + self.sdlManager.subscribe(to: .SDLDidReceiveVehicleData, observer: self, selector: #selector(vehicleDataNotification(_:))) } } diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h index 91aece5e5..58a234923 100644 --- a/SmartDeviceLink/SDLManager.h +++ b/SmartDeviceLink/SDLManager.h @@ -178,6 +178,46 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); */ - (void)sendSequentialRequests:(NSArray *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler NS_SWIFT_NAME(sendSequential(requests:progressHandler:completionHandler:)); + +#pragma mark - RPC Subscriptions + +typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *); + +/** + * Subscribe to callbacks about a particular RPC request, notification, or response with a block callback. + * + * @param rpcName The name of the RPC request, response, or notification to subscribe to. + * @param block The block that will be called every time an RPC of the name and type specified is received. + * @return An object that can be passed to `unsubscribeFromRPC:ofType:withObserver:` to unsubscribe the block. + */ +- (id)subscribeToRPC:(SDLNotificationName)rpcName withBlock:(SDLRPCUpdatedBlock)block NS_SWIFT_NAME(subscribe(to:block:)); + +/** + * Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback. + * + * The selector supports the following parameters: + * + * 1. One parameter e.g. `- (void)registerAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response;` + * 2. Two parameters e.g. `- (void)registerAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response error:(nullable NSError *)error;` + * + * Note that using this method to get a response instead of the `sendRequest:withResponseHandler:` method of getting a response, you will not be notifed of any `SDLGenericResponse` errors where the head unit doesn't understand the request. + * + * The error will be called if `response.success` is `NO` and will be filled with the info field. + * + * @param rpcName The name of the RPC request, response, or notification to subscribe to. + * @param observer The object that will have its selector called every time an RPC of the name and type specified is received. + * @param selector The selector on `observer` that will be called every time an RPC of the name and type specified is received. + */ +- (void)subscribeToRPC:(SDLNotificationName)rpcName withObserver:(id)observer selector:(SEL)selector NS_SWIFT_NAME(subscribe(to:observer:selector:)); + +/** + * Unsubscribe to callbacks about a particular RPC request, notification, or response. + * + * @param rpcName The name of the RPC request, response, or notification to unsubscribe from. + * @param observer The object representing a block callback or selector callback to be unsubscribed + */ +- (void)unsubscribeFromRPC:(SDLNotificationName)rpcName withObserver:(id)observer NS_SWIFT_NAME(unsubscribe(from:observer:)); + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m index 0cf027401..b198f7e52 100644 --- a/SmartDeviceLink/SDLManager.m +++ b/SmartDeviceLink/SDLManager.m @@ -17,6 +17,9 @@ #import "SDLManagerDelegate.h" #import "SDLNotificationDispatcher.h" #import "SDLResponseDispatcher.h" +#import "SDLRPCRequestNotification.h" +#import "SDLRPCResponseNotification.h" +#import "SDLRPCNotificationNotification.h" #import "SDLSoftButtonManager.h" #import "SDLStateMachine.h" #import "SDLTextAndGraphicManager.h" @@ -143,6 +146,24 @@ - (void)sendSequentialRequests:(NSArray *)requests progressHand [self.lifecycleManager sendSequentialRequests:requests progressHandler:progressHandler completionHandler:completionHandler]; } + +#pragma mark - RPC Subscriptions + +- (id)subscribeToRPC:(SDLNotificationName)rpcName withBlock:(SDLRPCUpdatedBlock)block { + return [[NSNotificationCenter defaultCenter] addObserverForName:rpcName object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) { + SDLRPCMessage *message = note.userInfo[SDLNotificationUserInfoObject]; + block(message); + }]; +} + +- (void)subscribeToRPC:(SDLNotificationName)rpcName withObserver:(id)observer selector:(SEL)selector { + [[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:rpcName object:nil]; +} + +- (void)unsubscribeFromRPC:(SDLNotificationName)rpcName withObserver:(id)observer { + [[NSNotificationCenter defaultCenter] removeObserver:observer name:rpcName object:nil]; +} + @end NS_ASSUME_NONNULL_END From 44fe2ec9ca5a8e5f2e29ebd12012404c169618aa Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Mon, 20 May 2019 15:19:49 -0400 Subject: [PATCH 072/179] Fix batching soft button manager updates --- SmartDeviceLink/SDLSoftButtonManager.m | 31 ++++++++++-- .../SDLSoftButtonTransitionOperation.h | 2 +- .../DevAPISpecs/SDLSoftButtonManagerSpec.m | 48 +++++++++++++++++-- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m index 3b00ba985..56deb83b0 100644 --- a/SmartDeviceLink/SDLSoftButtonManager.m +++ b/SmartDeviceLink/SDLSoftButtonManager.m @@ -46,6 +46,8 @@ @interface SDLSoftButtonManager() @property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities; @property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities; +@property (strong, nonatomic) NSMutableArray *batchQueue; + @end @implementation SDLSoftButtonManager @@ -60,6 +62,7 @@ - (instancetype)initWithConnectionManager:(id)connecti _currentLevel = nil; _transactionQueue = [self sdl_newTransactionQueue]; + _batchQueue = [NSMutableArray array]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_displayLayoutResponse:) name:SDLDidReceiveSetDisplayLayoutResponse object:nil]; @@ -118,13 +121,30 @@ - (void)setSoftButtonObjects:(NSArray *)softButtonObjects _softButtonObjects = softButtonObjects; SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:_softButtonObjects mainField1:self.currentMainField1]; - [self.transactionQueue cancelAllOperations]; - [self.transactionQueue addOperation:op]; + + if (self.isBatchingUpdates) { + [self.batchQueue removeAllObjects]; + [self.batchQueue addObject:op]; + } else { + [self.transactionQueue cancelAllOperations]; + [self.transactionQueue addOperation:op]; + } } - (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton { SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.softButtonCapabilities softButtons:self.softButtonObjects mainField1:self.currentMainField1]; - [self.transactionQueue addOperation:op]; + + if (self.isBatchingUpdates) { + for (SDLAsynchronousOperation *sbOperation in self.batchQueue) { + if ([sbOperation isMemberOfClass:[SDLSoftButtonTransitionOperation class]]) { + [self.batchQueue removeObject:sbOperation]; + } + } + + [self.batchQueue addObject:op]; + } else { + [self.transactionQueue addOperation:op]; + } } @@ -146,7 +166,10 @@ - (nullable SDLSoftButtonObject *)softButtonObjectNamed:(NSString *)name { - (void)setBatchUpdates:(BOOL)batchUpdates { _batchUpdates = batchUpdates; - _transactionQueue.suspended = batchUpdates; + if (!_batchUpdates) { + [self.transactionQueue addOperations:[self.batchQueue copy] waitUntilFinished:NO]; + [self.batchQueue removeAllObjects]; + } } - (void)setCurrentMainField1:(nullable NSString *)currentMainField1 { diff --git a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h index 86650dc3c..2679c9895 100644 --- a/SmartDeviceLink/SDLSoftButtonTransitionOperation.h +++ b/SmartDeviceLink/SDLSoftButtonTransitionOperation.h @@ -32,7 +32,7 @@ NS_ASSUME_NONNULL_BEGIN @param connectionManager The manager that will send the resultant RPCs @param capabilities The capabilites of the soft buttons on the current template - @param softButtonObjects The soft buttons that should be sent + @param softButtons The soft buttons that should be sent @param mainField1 The primary text field of the system template @return The transition operation */ diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m index 772c8cbcd..3a7ac4a65 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m @@ -12,7 +12,9 @@ #import "SDLSoftButtonCapabilities.h" #import "SDLSoftButtonManager.h" #import "SDLSoftButtonObject.h" +#import "SDLSoftButtonReplaceOperation.h" #import "SDLSoftButtonState.h" +#import "SDLSoftButtonTransitionOperation.h" #import "TestConnectionManager.h" @interface SDLSoftButtonObject() @@ -35,6 +37,8 @@ @interface SDLSoftButtonManager() @property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities; @property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities; +@property (strong, nonatomic) NSMutableArray *batchQueue; + @end QuickSpecBegin(SDLSoftButtonManagerSpec) @@ -137,6 +141,21 @@ @interface SDLSoftButtonManager() testManager.softButtonObjects = @[testObject1, testObject2]; }); + describe(@"while batching", ^{ + beforeEach(^{ + testManager.batchUpdates = YES; + + [testObject1 transitionToNextState]; + [testObject2 transitionToNextState]; + testManager.softButtonObjects = @[testObject2, testObject1]; + }); + + it(@"should properly queue the batching updates", ^{ + expect(testManager.transactionQueue.operationCount).to(equal(1)); + expect(testManager.batchQueue).to(haveCount(1)); + }); + }); + it(@"should set soft buttons correctly", ^{ expect(testManager.softButtonObjects).toNot(beNil()); expect(testObject1.buttonId).to(equal(0)); @@ -182,10 +201,33 @@ @interface SDLSoftButtonManager() testManager.softButtonObjects = @[testObject1, testObject2]; }); - it(@"should queue an update", ^{ - [testObject1 transitionToStateNamed:object1State2Name]; + context(@"when batching", ^{ + beforeEach(^{ + testManager.batchUpdates = YES; + + SDLSoftButtonReplaceOperation *replaceOp = [[SDLSoftButtonReplaceOperation alloc] init]; + SDLSoftButtonTransitionOperation *transitionOp = [[SDLSoftButtonTransitionOperation alloc] init]; + testManager.batchQueue = [NSMutableArray arrayWithArray:@[replaceOp, transitionOp]]; + + [testObject1 transitionToStateNamed:object1State2Name]; + }); + + it(@"should batch queue the update and remove the old transition operation", ^{ + expect(testManager.transactionQueue.operationCount).to(equal(1)); + expect(testManager.batchQueue.count).to(equal(2)); + }); + }); + + context(@"when not batching", ^{ + beforeEach(^{ + testManager.batchUpdates = NO; + }); + + it(@"should queue an update", ^{ + [testObject1 transitionToStateNamed:object1State2Name]; - expect(testManager.transactionQueue.operationCount).to(equal(2)); // Replace and transition + expect(testManager.transactionQueue.operationCount).to(equal(2)); // Replace and transition + }); }); }); From 56db755d7fb0b47ff30f907c48695e091e70f674 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Mon, 20 May 2019 15:44:22 -0400 Subject: [PATCH 073/179] Review fixes --- SmartDeviceLink/SDLIAPControlSession.m | 20 ++++++++------------ SmartDeviceLink/SDLIAPDataSession.m | 2 +- SmartDeviceLink/SDLIAPTransport.m | 4 ++-- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 4829db8a2..773860d81 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -52,7 +52,7 @@ - (void)startSession { } else { SDLLogD(@"Starting a control session with accessory (%@)", self.accessory.name); - if (![self start]) { + if (![self sdl_start]) { SDLLogW(@"Control session failed to setup with accessory: %@. Attempting to create a new control session", self.accessory); [self destroySession]; if (self.delegate == nil) { return; } @@ -64,8 +64,8 @@ - (void)startSession { } } -- (BOOL)start { - if (![self start]) { return NO; } +- (BOOL)sdl_start { + if (![super start]) { return NO; } // No need for its own thread as only a small amount of data will be transmitted before control session is destroyed SDLLogD(@"Created the control session successfully"); [self startStream:self.eaSession.outputStream]; @@ -187,17 +187,13 @@ - (void)streamHasBytesAvailable:(NSInputStream *)inputStream { SDLLogD(@"Control Stream will switch to protocol %@", indexedProtocolString); // Destroy the control session as it is no longer needed, and then create the data session. - dispatch_sync(dispatch_get_main_queue(), ^{ - [self destroySession]; - }); + [self destroySession]; if (self.accessory.isConnected) { - dispatch_async(dispatch_get_main_queue(), ^{ - if (self.delegate != nil) { - [self.delegate controlSession:self didReceiveProtocolString:indexedProtocolString]; - } - [self.protocolIndexTimer cancel]; - }); + if (self.delegate != nil) { + [self.delegate controlSession:self didReceiveProtocolString:indexedProtocolString]; + } + [self.protocolIndexTimer cancel]; } } diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 4121d2493..ada525dd4 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -54,7 +54,7 @@ - (void)startSession { } else { SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.accessory.name, self.protocolString); - if (![self start]) { + if (![super start]) { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.accessory); [self destroySession]; if (self.delegate == nil) { return; } diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 53bec16a0..d4ddee6b6 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -190,11 +190,11 @@ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { if (!self.controlSession.isSessionInProgress && !self.dataSession.isSessionInProgress) { SDLLogV(@"Accessory (%@, %@), disconnected, but no session is in progress.", accessory.name, accessory.serialNumber); [self sdl_closeSessions]; - } else if (accessory.connectionID == self.dataSession.connectionID) { + } else if (self.dataSession.isSessionInProgress) { // The data session has been established. Tell the delegate that the transport has disconnected. The lifecycle manager will destroy and create a new transport object. SDLLogV(@"Accessory (%@, %@) disconnected during a data session", accessory.name, accessory.serialNumber); [self sdl_destroyTransport]; - } else if (accessory.connectionID == self.controlSession.connectionID) { + } else if (self.controlSession.isSessionInProgress) { // The data session has yet to be established so the transport has not yet connected. DO NOT unregister for notifications from the accessory. SDLLogV(@"Accessory (%@, %@) disconnected during a control session", accessory.name, accessory.serialNumber); [self sdl_closeSessions]; From bd210be2388673499e0d90a1eb8caf29b5d2df54 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 20 May 2019 16:41:03 -0400 Subject: [PATCH 074/179] fixed issue where handler was not being saved after the list is updated but we keep some cells --- SmartDeviceLink/SDLMenuCell.m | 4 +- SmartDeviceLink/SDLMenuManager.m | 88 ++++++++++++++++++++------------ 2 files changed, 58 insertions(+), 34 deletions(-) diff --git a/SmartDeviceLink/SDLMenuCell.m b/SmartDeviceLink/SDLMenuCell.m index 08a60d8d8..e0b626286 100644 --- a/SmartDeviceLink/SDLMenuCell.m +++ b/SmartDeviceLink/SDLMenuCell.m @@ -69,7 +69,8 @@ NSUInteger NSUIntRotateCell(NSUInteger val, NSUInteger howMuch) { - (NSUInteger)hash { return NSUIntRotateCell(self.title.hash, NSUIntBitCell / 2) ^ NSUIntRotateCell(self.icon.name.hash, NSUIntBitCell / 3) - ^ NSUIntRotateCell(self.voiceCommands.hash, NSUIntBitCell / 4); + ^ NSUIntRotateCell(self.voiceCommands.hash, NSUIntBitCell / 4) + ^ NSUIntRotateCell(self.subCells.count !=0, NSUIntBitCell / 5 ); } - (BOOL)isEqual:(id)object { @@ -82,7 +83,6 @@ - (BOOL)isEqual:(id)object { - (BOOL)isEqualToChoice:(SDLMenuCell *)choice { if (choice == nil) { return NO; } - // toDo Check for subCell stuff return (self.hash == choice.hash); } diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index fe6be1963..0d98d799b 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -57,7 +57,7 @@ @interface SDLMenuManager() @property (assign, nonatomic) UInt32 lastMenuId; @property (copy, nonatomic) NSArray *oldMenuCells; -// @property (copy, nonatomic) NSArray *deleteCells; +@property (copy, nonatomic, nullable) SDLMenuRunScore *runScore; @end UInt32 const ParentIdNotFound = UINT32_MAX; @@ -103,6 +103,7 @@ - (void)stop { _hasQueuedUpdate = NO; _waitingOnHMIUpdate = NO; _waitingUpdateMenuCells = @[]; + _runScore = nil; } #pragma mark - Setters @@ -140,26 +141,22 @@ - (void)setMenuCells:(NSArray *)menuCells { return; } - // Set the ids - self.lastMenuId = MenuCellIdMin; - [self sdl_updateIdsOnMenuCells:menuCells parentId:ParentIdNotFound]; - _oldMenuCells = _menuCells; _menuCells = menuCells; - SDLMenuRunScore *runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; + _runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; // At this point runScore should have the best possibe Delete/Add combinations as 2 arrays oldStatus, and newStatus - NSArray *oldStatusList = runScore.oldStatus; - NSArray *updatedStatusList = runScore.updatedStatus; - - // NSArray *oldKeeps = [self buildKeepMenuItems:oldStatusList]; //we will use this to test the subcells later - //NSArray *newKeeps = nil; + // These 2 array are for the MAIN menu + NSArray *deleteMenuStatus = self.runScore.oldStatus; + NSArray *addMenuStaus = self.runScore.updatedStatus; - // Build a list of DELETES and send all Delete commands - //[self buildDeleteMenuItems: oldStatusList]; // move this to completionHandler Delete Stuf First + NSArray *cellToDelete = [self buildDeleteMenuItems: deleteMenuStatus]; + NSArray *cellToAdd = [self buildAddMenuItems:addMenuStaus]; + NSArray *keeps = [self buildKeepMenuItems:deleteMenuStatus]; - //for all items in the stsus if the status is ADD comppare it to the menuList and add it at that index + [self sdl_updateIdsOnMenuCells:cellToAdd parentId:ParentIdNotFound]; //Update new Cells with a new CellID + [self transferCellIDFromOldCells:self.oldMenuCells toKeptCells:keeps]; // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; @@ -168,14 +165,12 @@ - (void)setMenuCells:(NSArray *)menuCells { if (error != nil) { SDLLogE(@"Error uploading menu artworks: %@", error); } - SDLLogD(@"Menu artworks uploaded"); - [self sdl_updateCellsToDelete:[self buildDeleteMenuItems: oldStatusList] cellsToAdd:[self buildAddMenuItems:updatedStatusList] withCompletionHandler:nil]; - //[self sdl_updateWithCompletionHandler:nil]; + [self sdl_updateCellsToDelete:cellToDelete cellsToAdd:cellToAdd withCompletionHandler:nil]; }]; } - [self sdl_updateCellsToDelete:[self buildDeleteMenuItems: oldStatusList] cellsToAdd:[self buildAddMenuItems:updatedStatusList] withCompletionHandler:nil]; + [self sdl_updateCellsToDelete:cellToDelete cellsToAdd:cellToAdd withCompletionHandler:nil]; } #pragma mark - Build Deletes, Keeps, Adds @@ -213,6 +208,20 @@ - (void)setMenuCells:(NSArray *)menuCells { return [keepMenuCells copy]; } + +- (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCells:(NSArray *)newCells { + if(oldCells.count > 0) { + for(NSUInteger newCellsIndex = 0; newCellsIndex < newCells.count; newCellsIndex++) { + for(NSUInteger oldCellsIndex = 0; oldCellsIndex < oldCells.count; oldCellsIndex++) { + if([oldCells[oldCellsIndex] isEqual:newCells[newCellsIndex]]) { + self.menuCells[newCellsIndex].cellId = oldCells[oldCellsIndex].cellId; + } + } + } + } +} + + #pragma mark - Updating System - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells withCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { @@ -232,7 +241,7 @@ - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { - [weakself sdl_sendCurrentMenu:^(NSError * _Nullable error) { + [weakself sdl_sendUpdatedMenu:addCells withCompletionHandler:^(NSError * _Nullable error) { weakself.inProgressUpdate = nil; if (completionHandler != nil) { @@ -269,28 +278,30 @@ - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuC #pragma mark Send New Menu Items -- (void)sdl_sendCurrentMenu:(SDLMenuUpdateCompletionHandler)completionHandler { +- (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { if (self.menuCells.count == 0) { SDLLogD(@"No main menu to send"); completionHandler(nil); - return; } NSArray *mainMenuCommands = nil; NSArray *subMenuCommands = nil; + if ([self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells].count > 0 || ![self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameCommandIcon]) { // Send artwork-less menu - mainMenuCommands = [self sdl_mainMenuCommandsForCells:self.menuCells withArtwork:NO]; - subMenuCommands = [self sdl_subMenuCommandsForCells:self.menuCells withArtwork:NO]; + mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO]; + subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:NO]; } else { // Send full artwork menu - mainMenuCommands = [self sdl_mainMenuCommandsForCells:self.menuCells withArtwork:YES]; - subMenuCommands = [self sdl_subMenuCommandsForCells:self.menuCells withArtwork:YES]; + mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:YES]; + subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:YES]; } self.inProgressUpdate = [mainMenuCommands arrayByAddingObjectsFromArray:subMenuCommands]; + + //SEND the oldSSubcells and the newSuBCells for that cell to the algo and bulild a list of Deletes and Adds __block NSMutableDictionary *errors = [NSMutableDictionary dictionary]; __weak typeof(self) weakSelf = self; [self.connectionManager sendRequests:mainMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) { @@ -304,7 +315,7 @@ - (void)sdl_sendCurrentMenu:(SDLMenuUpdateCompletionHandler)completionHandler { return; } - weakSelf.oldMenuCells = weakSelf.menuCells; + // weakSelf.oldMenuCells = weakSelf.menuCells; // ASK about this what does oldMenuCells become now? Dont do this yet we need to delete // add subcells first [weakSelf.connectionManager sendRequests:subMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) { if (error != nil) { errors[request] = error; @@ -361,6 +372,14 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U } } +- (UInt32)sdl_getNextCorrelationId { + if (self.lastMenuId == INT32_MAX) { + self.lastMenuId = MenuCellIdMin; + } + + return self.lastMenuId++; +} + #pragma mark Deletes - (NSArray *)sdl_deleteCommandsForCells:(NSArray *)cells { @@ -382,12 +401,16 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U - (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork { NSMutableArray *mutableCommands = [NSMutableArray array]; - [cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull cell, NSUInteger index, BOOL * _Nonnull stop) { - if (cell.subCells.count > 0) { - [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]]; - } else { - [mutableCommands addObject:[self sdl_commandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]]; - } + [self.menuCells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull menuCell, NSUInteger mainIndex, BOOL * _Nonnull stop) { + [cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull updatedCell, NSUInteger updatedIndex, BOOL * _Nonnull stop) { + if([menuCell isEqual:updatedCell]) { + if (updatedCell.subCells.count > 0) { + [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:updatedCell withArtwork:shouldHaveArtwork position:(UInt16)mainIndex]]; + } else { + [mutableCommands addObject:[self sdl_commandForMenuCell:updatedCell withArtwork:shouldHaveArtwork position:(UInt16)mainIndex]]; + } + } + }]; }]; return [mutableCommands copy]; @@ -418,6 +441,7 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U return [mutableCommands copy]; } +//Loop thought keep compare to oldMenu and transfer cell Ids to new cells - (SDLAddCommand *)sdl_commandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position { SDLAddCommand *command = [[SDLAddCommand alloc] init]; From e8f84aba02246dbdebfc9eb69cb71398afe889ec Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 21 May 2019 11:32:52 -0400 Subject: [PATCH 075/179] Support and disambiguate outside GetSystemCapabilityResponses from internal ones --- SmartDeviceLink/SDLSystemCapabilityManager.m | 51 ++++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m index 0a48ce71f..bbe839bcf 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.m +++ b/SmartDeviceLink/SDLSystemCapabilityManager.m @@ -17,10 +17,13 @@ #import "SDLGetSystemCapabilityResponse.h" #import "SDLGlobals.h" #import "SDLLogMacros.h" +#import "SDLNavigationCapability.h" #import "SDLNotificationConstants.h" #import "SDLOnHMIStatus.h" #import "SDLOnSystemCapabilityUpdated.h" +#import "SDLPhoneCapability.h" #import "SDLRegisterAppInterfaceResponse.h" +#import "SDLRemoteControlCapabilities.h" #import "SDLRPCNotificationNotification.h" #import "SDLRPCResponseNotification.h" #import "SDLSetDisplayLayoutResponse.h" @@ -55,6 +58,8 @@ @interface SDLSystemCapabilityManager () @property (nullable, strong, nonatomic) NSMutableDictionary *appServicesCapabilitiesDictionary; +@property (nullable, strong, nonatomic) SDLSystemCapability *lastReceivedCapability; + @property (assign, nonatomic) BOOL isFirstHMILevelFull; @end @@ -120,6 +125,7 @@ -(void)sdl_registerForNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_displayLayoutResponse:) name:SDLDidReceiveSetDisplayLayoutResponse object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_systemCapabilityUpdatedNotification:) name:SDLDidReceiveSystemCapabilityUpdatedNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_systemCapabilityResponseNotification:) name:SDLDidReceiveGetSystemCapabilitiesResponse object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil]; } @@ -170,6 +176,16 @@ - (void)sdl_systemCapabilityUpdatedNotification:(SDLRPCNotificationNotification [self sdl_saveSystemCapability:systemCapabilityUpdatedNotification.systemCapability completionHandler:nil]; } +/** + Called with a `GetSystemCapabilityResponse` notification is received from core. The updated system capability is saved. + + @param notification The `GetSystemCapabilityResponse` notification received from Core + */ +- (void)sdl_systemCapabilityResponseNotification:(SDLRPCResponseNotification *)notification { + SDLGetSystemCapabilityResponse *systemCapabilityResponse = (SDLGetSystemCapabilityResponse *)notification.response; + [self sdl_saveSystemCapability:systemCapabilityResponse.systemCapability completionHandler:nil]; +} + /** * Called when an `OnHMIStatus` notification is received from Core. The first time the `hmiLevel` is `FULL` attempt to subscribe to system capabilty updates. * @@ -231,47 +247,64 @@ - (void)sdl_subscribeToSystemCapabilityUpdates { * @param getSystemCapability The `GetSystemCapability` request to send */ - (void)sdl_sendGetSystemCapability:(SDLGetSystemCapability *)getSystemCapability completionHandler:(nullable SDLUpdateCapabilityHandler)handler { + __weak typeof(self) weakSelf = self; [self.connectionManager sendConnectionRequest:getSystemCapability withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) { if (error != nil) { // An error is returned if the request was unsuccessful or if a Generic Response was returned if (handler == nil) { return; } - handler(error, self); + handler(error, weakSelf); return; } SDLGetSystemCapabilityResponse *getSystemCapabilityResponse = (SDLGetSystemCapabilityResponse *)response; - if (!getSystemCapabilityResponse.success.boolValue) { return; } - [self sdl_saveSystemCapability:getSystemCapabilityResponse.systemCapability completionHandler:handler]; + [weakSelf sdl_saveSystemCapability:getSystemCapabilityResponse.systemCapability completionHandler:handler]; }]; } /** - * Saves a system capability. All system capabilities will update with the full object except for app services. For app services only the updated app service capabilities will be included in the `SystemCapability` sent from Core. The cached `appServicesCapabilities` will be updated with the new `appService` data. - * - * @param systemCapability The system capability + Saves a system capability. All system capabilities will update with the full object except for app services. For app services only the updated app service capabilities will be included in the `SystemCapability` sent from Core. The cached `appServicesCapabilities` will be updated with the new `appService` data. + + @param systemCapability The system capability to be saved + @param handler The handler to be called when the save completes + @return Whether or not the save occurred. This can be `NO` if the new system capability is equivalent to the old capability. */ -- (void)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability completionHandler:(nullable SDLUpdateCapabilityHandler)handler { +- (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability completionHandler:(nullable SDLUpdateCapabilityHandler)handler { + if ([self.lastReceivedCapability isEqual:systemCapability]) { + return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; + } + self.lastReceivedCapability = systemCapability; + SDLSystemCapabilityType systemCapabilityType = systemCapability.systemCapabilityType; if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypePhoneCall]) { + if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } self.phoneCapability = systemCapability.phoneCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeNavigation]) { + if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } self.navigationCapability = systemCapability.navigationCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeRemoteControl]) { + if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } self.remoteControlCapability = systemCapability.remoteControlCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming]) { + if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } self.videoStreamingCapability = systemCapability.videoStreamingCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeAppServices]) { + if ([self.appServicesCapabilities isEqual:systemCapability.appServicesCapabilities]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } [self sdl_saveAppServicesCapabilitiesUpdate:systemCapability.appServicesCapabilities]; } else { SDLLogW(@"Received response for unknown System Capability Type: %@", systemCapabilityType); - return; + return NO; } SDLLogD(@"Updated system capability manager with new data: %@", systemCapability); - if (handler == nil) { return; } + return [self sdl_callSaveHandlerAndReturnWithValue:YES handler:handler]; +} + +- (BOOL)sdl_callSaveHandlerAndReturnWithValue:(BOOL)value handler:(nullable SDLUpdateCapabilityHandler)handler { + if (handler == nil) { return value; } handler(nil, self); + return value; } - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newCapabilities { From 5255715c23f45e3321f0b95f99b82d59c77e8762 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 21 May 2019 14:16:16 -0400 Subject: [PATCH 076/179] Fixing extra commented line --- SmartDeviceLink/SmartDeviceLink.h | 1 - 1 file changed, 1 deletion(-) diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h index 8a776230d..4ae1a7d37 100644 --- a/SmartDeviceLink/SmartDeviceLink.h +++ b/SmartDeviceLink/SmartDeviceLink.h @@ -1,6 +1,5 @@ // SmartDeviceLink.h // -// #import From 0dd2255e40c9dd079db09f3a94d1c74df924cbe9 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 21 May 2019 15:53:07 -0400 Subject: [PATCH 077/179] Fixed example app crashing when lifecycle manager errors --- Example Apps/Example ObjC/ProxyManager.m | 5 ++++- Example Apps/Example Swift/ProxyManager.swift | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m index 525f31766..a7732892a 100644 --- a/Example Apps/Example ObjC/ProxyManager.m +++ b/Example Apps/Example ObjC/ProxyManager.m @@ -76,7 +76,10 @@ - (void)startManager { } - (void)stopConnection { - [self.sdlManager stop]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self.sdlManager stop]; + }); + [self sdlex_updateProxyState:ProxyStateStopped]; } diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift index fbedae0d5..b6287bf6e 100644 --- a/Example Apps/Example Swift/ProxyManager.swift +++ b/Example Apps/Example Swift/ProxyManager.swift @@ -55,7 +55,10 @@ extension ProxyManager { return } - sdlManager.stop() + DispatchQueue.main.async { [weak self] in + self?.sdlManager.stop() + } + delegate?.didChangeProxyState(.stopped) } } From a36bdb28af29e297281f05dbf1a3d08d8d76745b Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 21 May 2019 15:58:42 -0400 Subject: [PATCH 078/179] Added flag for transport disconnect --- SmartDeviceLink/SDLIAPTransport.m | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index d4ddee6b6..a73e65e78 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -30,6 +30,7 @@ @interface SDLIAPTransport () Date: Tue, 21 May 2019 16:31:08 -0400 Subject: [PATCH 079/179] In progress capability observations --- SmartDeviceLink/SDLSystemCapabilityManager.h | 40 ++++++- SmartDeviceLink/SDLSystemCapabilityManager.m | 104 +++++++++++++++++-- 2 files changed, 135 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h index 11e31a1c2..da6d21ee4 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.h +++ b/SmartDeviceLink/SDLSystemCapabilityManager.h @@ -24,6 +24,7 @@ @class SDLPresetBankCapabilities; @class SDLRemoteControlCapabilities; @class SDLSoftButtonCapabilities; +@class SDLSystemCapability; @class SDLSystemCapabilityManager; @class SDLVideoStreamingCapability; @@ -31,7 +32,6 @@ NS_ASSUME_NONNULL_BEGIN - /** * A completion handler called after a request for the capability type is returned from the remote system. * @@ -40,6 +40,13 @@ NS_ASSUME_NONNULL_BEGIN */ typedef void (^SDLUpdateCapabilityHandler)(NSError * _Nullable error, SDLSystemCapabilityManager *systemCapabilityManager); +/** + An observer block whenever a subscription is called. + + @param systemCapabilityManager This manager. The user of the handler can then use the manager to pull the newest data. + */ +typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapabilityManager *systemCapabilityManager); + @interface SDLSystemCapabilityManager : NSObject @@ -198,6 +205,37 @@ typedef void (^SDLUpdateCapabilityHandler)(NSError * _Nullable error, SDLSystemC */ - (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SDLUpdateCapabilityHandler)handler; +/** + Subscribe to a particular capability type using a block callback + + @param type The type of capability to subscribe to + @param block The block to be called when the capability is updated + @return An object that can be used to unsubscribe the block using unsubscribeFromCapabilityType:withObserver: by passing it in the observer callback + */ +- (id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block; + +/** + * Subscribe to a particular capability type with a selector callback. The selector supports the following parameters: + * + * 1. No parameters e.g. `- (void)phoneCapabilityUpdated;` + * 2. One `SDLSystemCapability *` parameter e.g. `- (void)phoneCapabilityUpdated:(SDLSystemCapability *)capability` + * + * This method will be called immediately with the current value and called every time the value is updated on RPC v5.1.0+ systems (`supportsSubscriptions == YES`). If this method is called on a sub-v5.1.0 system (`supportsSubscriptions == NO`), the method will return `NO` and the selector will never be called. + * + * @param type The type of the system capability to subscribe to + * @param observer The object that will have `selector` called whenever the capability is updated + * @param selector The selector on `observer` that will be called whenever the capability is updated + * @return Whether or not the subscription succeeded. `NO` if the connected system doesn't support capability subscriptions, or if the `selector` doesn't support the correct parameters (see above) + */ +- (BOOL)subscribeToCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer selector:(SEL)selector; + +/** + * Unsubscribe from a particular capability type. If it was subscribed with a block, the return value should be passed to the `observer` to unsubscribe the block. If it was subscribed with a selector, the `observer` object should be passed to unsubscribe the object selector. + * + * @param type The type of the system capability to unsubscribe from + * @param observer The object that will be unsubscribed. If a block was subscribed, the return value should be passed. If a selector was subscribed, the observer object should be passed. + */ +- (void)unsubscribeFromCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer; @end diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m index bbe839bcf..49344e751 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.m +++ b/SmartDeviceLink/SDLSystemCapabilityManager.m @@ -34,6 +34,43 @@ NS_ASSUME_NONNULL_BEGIN +@interface SDLSystemCapabilityObserver : NSObject + +@property (strong, nonatomic) id observer; +@property (assign, nonatomic) SEL selector; +@property (copy, nonatomic) SDLCapabilityUpdateHandler block; + +- (instancetype)initWithObserver:(id)observer selector:(SEL)selector; +- (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block; + +@end + +@implementation SDLSystemCapabilityObserver + +- (instancetype)initWithObserver:(id)observer selector:(SEL)selector { + self = [super init]; + if (!self) { return nil; } + + _observer = observer; + _selector = selector; + + return self; +} + +- (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block { + self = [super init]; + if (!self) { return nil; } + + _observer = observer; + _block = block; + + return self; +} + +@end + + + @interface SDLSystemCapabilityManager () typedef NSString * SDLServiceID; @@ -58,6 +95,8 @@ @interface SDLSystemCapabilityManager () @property (nullable, strong, nonatomic) NSMutableDictionary *appServicesCapabilitiesDictionary; +@property (strong, nonatomic) NSMutableDictionary *> *capabilityObservers; + @property (nullable, strong, nonatomic) SDLSystemCapability *lastReceivedCapability; @property (assign, nonatomic) BOOL isFirstHMILevelFull; @@ -78,6 +117,11 @@ - (instancetype)initWithConnectionManager:(id)manager _isFirstHMILevelFull = NO; _appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary]; + _capabilityObservers = [NSMutableDictionary dictionary]; + for (SDLSystemCapabilityType capabilityType in [self.class sdl_systemCapabilityTypes]) { + _capabilityObservers[capabilityType] = @[]; + } + [self sdl_registerForNotifications]; return self; @@ -270,26 +314,26 @@ - (void)sdl_sendGetSystemCapability:(SDLGetSystemCapability *)getSystemCapabilit */ - (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability completionHandler:(nullable SDLUpdateCapabilityHandler)handler { if ([self.lastReceivedCapability isEqual:systemCapability]) { - return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; + return [self sdl_callSaveHandlerForCapabilityType:systemCapability.systemCapabilityType andReturnWithValue:NO handler:handler]; } self.lastReceivedCapability = systemCapability; SDLSystemCapabilityType systemCapabilityType = systemCapability.systemCapabilityType; if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypePhoneCall]) { - if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } + if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } self.phoneCapability = systemCapability.phoneCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeNavigation]) { - if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } + if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } self.navigationCapability = systemCapability.navigationCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeRemoteControl]) { - if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } + if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } self.remoteControlCapability = systemCapability.remoteControlCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming]) { - if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } + if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } self.videoStreamingCapability = systemCapability.videoStreamingCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeAppServices]) { - if ([self.appServicesCapabilities isEqual:systemCapability.appServicesCapabilities]) { return [self sdl_callSaveHandlerAndReturnWithValue:NO handler:handler]; } + if ([self.appServicesCapabilities isEqual:systemCapability.appServicesCapabilities]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } [self sdl_saveAppServicesCapabilitiesUpdate:systemCapability.appServicesCapabilities]; } else { SDLLogW(@"Received response for unknown System Capability Type: %@", systemCapabilityType); @@ -298,15 +342,34 @@ - (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability complet SDLLogD(@"Updated system capability manager with new data: %@", systemCapability); - return [self sdl_callSaveHandlerAndReturnWithValue:YES handler:handler]; + return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:YES handler:handler]; } -- (BOOL)sdl_callSaveHandlerAndReturnWithValue:(BOOL)value handler:(nullable SDLUpdateCapabilityHandler)handler { +- (BOOL)sdl_callSaveHandlerForCapabilityType:(SDLSystemCapabilityType)type andReturnWithValue:(BOOL)value handler:(nullable SDLUpdateCapabilityHandler)handler { if (handler == nil) { return value; } handler(nil, self); + + for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[type]) { + if (observer.block != nil) { + observer.block(self); + } else { + if ([observer.observer respondsToSelector:observer.selector]) { + [observer.observer performSelector:observer.selector]; + } + } + } + return value; } +//- (SDLSystemCapability *)capabilityForType:(SDLSystemCapabilityType)type { +// if ([type isEqualToEnum:SDLSystemCapabilityTypePhoneCall]) { +// return [[SDLSystemCapability alloc] initWithPhoneCapability:self.phoneCapability]; +// } else if ([type isEqualToEnum:SDLSystemCapabilityTypeNavigation]) { +// return [SDLSystemcap] self.navigationCapability; +// } +//} + - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newCapabilities { for (SDLAppServiceCapability *capability in newCapabilities.appServices) { if (capability.updateReason == nil) { @@ -321,6 +384,31 @@ - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newC } } +#pragma mark - Subscriptions + +- (id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block { + SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] block:block]; + [self.capabilityObservers[type] addObject:observerObject]; + + return observerObject.observer; +} + +- (BOOL)subscribeToCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer selector:(SEL)selector { + SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:observer selector:selector]; + [self.capabilityObservers[type] addObject:observerObject]; + + return observerObject.observer; +} + +- (void)unsubscribeFromCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer { + for (SDLSystemCapabilityObserver *capabilityObserver in self.capabilityObservers[type]) { + if ([observer isEqual:capabilityObserver.observer]) { + [self.capabilityObservers[type] removeObject:capabilityObserver]; + break; + } + } +} + @end NS_ASSUME_NONNULL_END From 21e155bc78865b8d729e0f82c113061f04ea82a3 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 08:49:07 -0400 Subject: [PATCH 080/179] Added documentation to SDLIAPSession class --- SmartDeviceLink/SDLIAPSession.h | 51 ++++++++++++++++++++++++++++++++- SmartDeviceLink/SDLIAPSession.m | 7 ++--- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/SmartDeviceLink/SDLIAPSession.h b/SmartDeviceLink/SDLIAPSession.h index 9c1966c31..302665f2a 100644 --- a/SmartDeviceLink/SDLIAPSession.h +++ b/SmartDeviceLink/SDLIAPSession.h @@ -8,23 +8,72 @@ NS_ASSUME_NONNULL_BEGIN -typedef void (^SessionCompletionHandler)(BOOL success); @interface SDLIAPSession : NSObject +/** + * The input stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the input stream. The input stream is closed when the stream status is `NSStreamStatusClosed`. + */ @property (nonatomic, assign) BOOL isInputStreamOpen; + +/** + * The output stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the output stream. The output stream has been closed when the stream status is `NSStreamStatusClosed`. + */ @property (nonatomic, assign) BOOL isOutputStreamOpen; + +/** + * The accessory with which to open a session. + */ @property (nullable, strong, nonatomic) EAAccessory *accessory; + +/** + * The unique protocol string used to create the session with the accessory. + */ @property (nullable, strong, nonatomic) NSString *protocolString; + +/** + * The session created between the app and the accessory. + */ @property (nullable, strong, nonatomic) EASession *eaSession; + +/** + * Returns whether or not both the input and output streams for the session are closed. + */ @property (assign, readonly, getter=isStopped) BOOL stopped; +/** + * Convenience initializer for setting an accessory and protocol string. + * + * @param accessory The accessory with which to open a session + * @param protocol The unique protocol string used to create the session with the accessory + * @return A SDLIAPSession object + */ - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol; +/** + * Creates a session with the accessory and protocol string. + * + * @return Whether or not the session was created successfully. + */ - (BOOL)start; + +/** + * Stops a session by closing the input and output streams and destroying the session. + */ - (void)stop; +/** + * Opens a stream and schedules it in the run loop. + * + * @param stream The stream to open + */ - (void)startStream:(NSStream *)stream; + +/** + * Closes a stream and removes it from the run loop. + * + * @param stream The stream to close + */ - (void)stopStream:(NSStream *)stream; @end diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 9f41f04ab..9947a2b93 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -53,17 +53,14 @@ - (void)startStream:(NSStream *)stream { } - (void)stopStream:(NSStream *)stream { - // Verify stream is in a state that can be closed. - // (N.B. Closing a stream that has not been opened has very, very bad effects.) - - // When you disconect the cable you get a stream end event and come here but stream is already in closed state. - // Still need to remove from run loop. + // Verify stream is in a state that can be closed. Closing a stream that has not been opened has very, very bad effects. NSUInteger status1 = stream.streamStatus; if (status1 != NSStreamStatusNotOpen && status1 != NSStreamStatusClosed) { [stream close]; } + // When the USB cable is disconnected, the app will will call this method after the `NSStreamEventEndEncountered` event. The stream will already be in the closed state but it still needs to be removed from the run loop. [stream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [stream setDelegate:nil]; From 7f548d9d16a4f0e6de764d658abcd0bc0b02d2db Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 08:49:28 -0400 Subject: [PATCH 081/179] Removed unused import --- SmartDeviceLink/SDLIAPTransport.m | 1 - 1 file changed, 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index a73e65e78..67b23bd3f 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -14,7 +14,6 @@ #import "SDLIAPControlSessionDelegate.h" #import "SDLIAPDataSession.h" #import "SDLIAPDataSessionDelegate.h" -#import "SDLIAPSession.h" #import "SDLLogMacros.h" #import "SDLTimer.h" #import From b547f9985ffbf8ca5e9818f2ed932800eb07b8c8 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 22 May 2019 09:42:50 -0400 Subject: [PATCH 082/179] Updating the readme file to tell devs that SDL now supports Accio and how to install it and use it. --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 1a6c9ea38..3193abbc3 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ [![CocoaPods Downloads](https://img.shields.io/cocoapods/dt/SmartDeviceLink-iOS.svg?maxAge=172800)](https://cocoapods.org/pods/SmartDeviceLink-iOS) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Slack Status](http://sdlslack.herokuapp.com/badge.svg)](http://slack.smartdevicelink.com) +[![Accio supported](https://img.shields.io/badge/Accio-supported-0A7CF5.svg?style=flat)](https://github.com/JamitLabs/Accio) # SmartDeviceLink (SDL) @@ -35,6 +36,18 @@ See the [changelog](https://github.com/smartdevicelink/sdl_ios/blob/master/CHANG ### Installing +#### Accio + +You can install this library using [Accio/SwiftPM](https://github.com/JamitLabs/Accio) documentation page. Please follow the steps to install and initialization Accio into a current or new application. + +In your Package.swift file , you want to add `.package(url: "https://github.com/smartdevicelink/sdl_ios.git", .from: "6.2.3"),` to the dependencies array. Then add `SmartDeviceLink` to the targets dependencies array. + +Please see [Mainifest format](https://github.com/apple/swift-package-manager/blob/master/Documentation/PackageDescriptionV4.md) to specify dependencies to a specific branch / version of SDL. + +###### Swift + +If you are building a Swift app, then add this instead `SmartDeviceLinkSwift` to the targets dependencies array. + ##### Cocoapods You can install this library using [Cocoapods](https://cocoapods.org/pods/SmartDeviceLink-iOS). You can get started with Cocoapods by [following their install guide](https://guides.cocoapods.org/using/getting-started.html#getting-started), and learn how to use Cocoapods to install dependencies [by following this guide](https://guides.cocoapods.org/using/using-cocoapods.html). From 06ac820934c85a977de843efa20ab4b44066baf2 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 10:18:10 -0400 Subject: [PATCH 083/179] Cleaning up SDLIAPSession and its subclasses --- SmartDeviceLink/SDLIAPControlSession.h | 20 ---------- SmartDeviceLink/SDLIAPControlSession.m | 49 +++++++++++++++---------- SmartDeviceLink/SDLIAPDataSession.h | 26 ++----------- SmartDeviceLink/SDLIAPDataSession.m | 35 ++++++++++-------- SmartDeviceLink/SDLIAPSession.h | 49 +++++++------------------ SmartDeviceLink/SDLIAPSession.m | 51 ++++++++++++++++++++------ 6 files changed, 105 insertions(+), 125 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index aa0a73eb1..c01df91c9 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -23,16 +23,6 @@ NS_ASSUME_NONNULL_BEGIN */ @interface SDLIAPControlSession : SDLIAPSession -/** - * The unique ID assigned to the session between the app and accessory. If no session exists the `connectionID` will be 0. - */ -@property (assign, nonatomic, readonly) NSUInteger connectionID; - -/** - * Returns whether the session has open I/O streams. - */ -@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress; - - (instancetype)init NS_UNAVAILABLE; /** @@ -44,16 +34,6 @@ NS_ASSUME_NONNULL_BEGIN */ - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate; -/** - * Starts a control session. - */ -- (void)startSession; - -/** - * Stops the current control session if it is open. - */ -- (void)destroySession; - @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 773860d81..75e79693f 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -28,6 +28,20 @@ @interface SDLIAPControlSession () @end + +@interface SDLIAPSession (exposeIAPSessionPrivateMethods) + +@property (nonatomic, assign) BOOL isInputStreamOpen; +@property (nonatomic, assign) BOOL isOutputStreamOpen; +@property (nullable, strong, nonatomic) EASession *eaSession; + +- (BOOL)start; +- (void)startStream:(NSStream *)stream; +- (void)stopStream:(NSStream *)stream; + +@end + + @implementation SDLIAPControlSession - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate { @@ -45,6 +59,8 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; /** - * Starts a data session. - */ -- (void)startSession; - -/** - * Stops a current session. + * Sends data to Core via the data session. + * + * @param data The data to send to Core */ -- (void)destroySession; - - (void)sendData:(NSData *)data; @end diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index ada525dd4..5d9f68133 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -29,6 +29,19 @@ @interface SDLIAPDataSession () @end + +@interface SDLIAPSession (exposeIAPSessionPrivateMethods) + +@property (nonatomic, assign) BOOL isInputStreamOpen; +@property (nonatomic, assign) BOOL isOutputStreamOpen; +@property (nullable, strong, nonatomic) EASession *eaSession; + +- (BOOL)start; +- (void)startStream:(NSStream *)stream; +- (void)stopStream:(NSStream *)stream; + +@end + @implementation SDLIAPDataSession - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; { @@ -47,6 +60,8 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id /** - * The input stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the input stream. The input stream is closed when the stream status is `NSStreamStatusClosed`. - */ -@property (nonatomic, assign) BOOL isInputStreamOpen; - -/** - * The output stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the output stream. The output stream has been closed when the stream status is `NSStreamStatusClosed`. + * The accessory with which to open a session. */ -@property (nonatomic, assign) BOOL isOutputStreamOpen; +@property (nullable, strong, nonatomic, readonly) EAAccessory *accessory; /** - * The accessory with which to open a session. + * The unique protocol string used to create the session with the accessory. */ -@property (nullable, strong, nonatomic) EAAccessory *accessory; +@property (nullable, strong, nonatomic, readonly) NSString *protocolString; /** - * The unique protocol string used to create the session with the accessory. + * Returns whether or not both the input and output streams for the session are closed. */ -@property (nullable, strong, nonatomic) NSString *protocolString; +@property (assign, readonly, getter=isStopped) BOOL stopped; /** - * The session created between the app and the accessory. + * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. */ -@property (nullable, strong, nonatomic) EASession *eaSession; +@property (assign, nonatomic, readonly) NSUInteger connectionID; /** - * Returns whether or not both the input and output streams for the session are closed. + * Returns whether the session has open I/O streams. */ -@property (assign, readonly, getter=isStopped) BOOL stopped; +@property (assign, nonatomic, readonly, getter=isSessionInProgress) BOOL sessionInProgress; /** * Convenience initializer for setting an accessory and protocol string. @@ -51,30 +46,14 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol; /** - * Creates a session with the accessory and protocol string. - * - * @return Whether or not the session was created successfully. - */ -- (BOOL)start; - -/** - * Stops a session by closing the input and output streams and destroying the session. + * Starts a control session. */ -- (void)stop; +- (void)startSession; /** - * Opens a stream and schedules it in the run loop. - * - * @param stream The stream to open - */ -- (void)startStream:(NSStream *)stream; - -/** - * Closes a stream and removes it from the run loop. - * - * @param stream The stream to close + * Stops the current control session if it is open. */ -- (void)stopStream:(NSStream *)stream; +- (void)destroySession; @end diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 9947a2b93..b9ad55896 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -9,6 +9,26 @@ NS_ASSUME_NONNULL_BEGIN +@interface SDLIAPSession () +/** + * The input stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the input stream. The input stream is closed when the stream status is `NSStreamStatusClosed`. + */ +@property (nonatomic, assign) BOOL isInputStreamOpen; + +/** + * The output stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the output stream. The output stream has been closed when the stream status is `NSStreamStatusClosed`. + */ +@property (nonatomic, assign) BOOL isOutputStreamOpen; + +/** + * The session created between the app and the accessory. + */ +@property (nullable, strong, nonatomic) EASession *eaSession; + +@property (nullable, strong, nonatomic, readwrite) EAAccessory *accessory; +@property (nullable, strong, nonatomic, readwrite) NSString *protocolString; + +@end @implementation SDLIAPSession @@ -27,25 +47,20 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString return self; } +#pragma mark - Abstract Methods + +- (void)startSession {} -#pragma mark - Public Stream Lifecycle +- (void)destroySession {} + +#pragma mark - Private Stream Lifecycle Helpers - (BOOL)start { SDLLogD(@"Opening EASession with accessory: %@", self.accessory.name); self.eaSession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocolString]; - return (self.eaSession != nil); } -- (void)stop {} - -- (BOOL)isStopped { - return !self.isOutputStreamOpen && !self.isInputStreamOpen; -} - - -#pragma mark - Private Stream Lifecycle Helpers - - (void)startStream:(NSStream *)stream { stream.delegate = self; [stream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; @@ -76,6 +91,20 @@ - (void)stopStream:(NSStream *)stream { } } +#pragma mark - Getters + +- (BOOL)isStopped { + return !self.isOutputStreamOpen && !self.isInputStreamOpen; +} + +- (NSUInteger)connectionID { + return self.eaSession.accessory.connectionID; +} + +- (BOOL)isSessionInProgress { + return !self.isStopped; +} + @end NS_ASSUME_NONNULL_END From e46468c8698f660150ad9f9db2296c1ec36c5527 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 14:38:28 -0400 Subject: [PATCH 084/179] Fixed log to use local var --- SmartDeviceLink/SDLIAPDataSession.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 5d9f68133..0d61f7e13 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -349,7 +349,7 @@ - (void)sdl_closeSession { return; } - SDLLogD(@"Closing EASession for accessory connection id: %tu, name: %@", self.eaSession.accessory.connectionID, self.eaSession.accessory.name); + SDLLogD(@"Closing EASession for accessory connection id: %tu, name: %@", self.connectionID, self.eaSession.accessory.name); [self stopStream:[self.eaSession inputStream]]; [self stopStream:[self.eaSession outputStream]]; From 762e2a3e0409c3a6e4b1da682c75b67499123833 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 16:48:32 -0400 Subject: [PATCH 085/179] Fixed broken iAP classes test cases --- .../iAP/SDLIAPControlSessionSpec.m | 144 ++--------------- .../iAP/SDLIAPDataSessionSpec.m | 139 +++------------- .../TransportSpecs/iAP/SDLIAPSessionSpec.m | 142 ++--------------- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 149 +++++++----------- 4 files changed, 110 insertions(+), 464 deletions(-) diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 5a389b16c..113c06f5f 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -29,155 +29,35 @@ @interface SDLIAPControlSession() describe(@"SDLIAPControlSession", ^{ __block SDLIAPControlSession *controlSession = nil; __block EAAccessory *mockAccessory = nil; - __block SDLIAPSession *mockSession = nil; __block id mockDelegate = nil; beforeEach(^{ mockDelegate = OCMProtocolMock(@protocol(SDLIAPControlSessionDelegate)); mockAccessory = [EAAccessory.class sdlCoreMock]; - mockSession = OCMClassMock([SDLIAPSession class]); - OCMStub([mockSession accessory]).andReturn(mockAccessory); }); describe(@"init", ^{ - context(@"with a valid session", ^{ - beforeEach(^{ - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; - }); - - it(@"Should get/set correctly", ^{ - expect(controlSession.session).toNot(beNil()); - expect(controlSession.connectionID).to(equal(5)); - expect(controlSession.delegate).to(equal(mockDelegate)); - }); - - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is stopped", ^{ - OCMStub([mockSession isStopped]).andReturn(NO); - expect(controlSession.isSessionInProgress).to(beTrue()); - }); - - it(@"Should be in progress if the session is running", ^{ - OCMStub([mockSession isStopped]).andReturn(YES); - expect(controlSession.isSessionInProgress).to(beFalse()); - }); - }); + beforeEach(^{ + controlSession = [[SDLIAPControlSession alloc] initWithAccessory:mockAccessory delegate:mockDelegate]; }); - context(@"with a nil session", ^{ - beforeEach(^{ - controlSession = [[SDLIAPControlSession alloc] initWithSession:nil delegate:mockDelegate]; - }); - - it(@"Should get/set correctly", ^{ - expect(controlSession.session).to(beNil()); - expect(controlSession.connectionID).to(equal(0)); - expect(controlSession.delegate).to(equal(mockDelegate)); - }); - - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is stopped because the session is `nil`", ^{ - OCMStub([mockSession isStopped]).andReturn(NO); - expect(controlSession.isSessionInProgress).to(beFalse()); - }); - - it(@"Should be in progress if the session is running becasue the session is `nil`", ^{ - OCMStub([mockSession isStopped]).andReturn(YES); - expect(controlSession.isSessionInProgress).to(beFalse()); - }); - }); + it(@"Should get/set correctly", ^{ + expect(controlSession.accessory).to(equal(mockAccessory)); + expect(controlSession.protocolString).to(equal(ControlProtocolString)); + expect(controlSession.protocolIndexTimer).to(beNil()); + expect(controlSession.delegate).to(equal(mockDelegate)); }); }); - describe(@"Starting a session", ^{ - describe(@"When a session starts successfully", ^{ + describe(@"starting a session", ^{ + context(@"it should attempt to retry the session", ^{ beforeEach(^{ - OCMStub([mockSession start]).andReturn(YES); - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [controlSession startSession]; - }); - - it(@"Should create a timer", ^{ - expect(controlSession.protocolIndexTimer).toNot(beNil()); + controlSession = [[SDLIAPControlSession alloc] initWithAccessory:nil delegate:mockDelegate]; }); - it(@"Should not try to establish a new session", ^{ - OCMReject([mockDelegate retryControlSession]); - OCMReject([mockDelegate controlSession:[OCMArg any] didGetProtocolString:[OCMArg any] forConnectedAccessory:[OCMArg any]]); - }); - }); - - describe(@"When a session does not start successfully", ^{ - beforeEach(^{ - OCMStub([mockSession start]).andReturn(NO); - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; + it(@"Should start correctly", ^{ [controlSession startSession]; - }); - - it(@"Should not create a timer", ^{ - expect(controlSession.protocolIndexTimer).to(beNil()); - }); - - it(@"Should try to establish a new session", ^{ - OCMVerify([mockDelegate retryControlSession]); - OCMReject([mockDelegate controlSession:[OCMArg any] didGetProtocolString:[OCMArg any] forConnectedAccessory:[OCMArg any]]); - }); - - it(@"Should should stop and destroy the session", ^{ - expect(controlSession.session).to(beNil()); - expect(controlSession.connectionID).to(equal(0)); - }); - - it(@"Should should stop but not destroy the session", ^{ - OCMVerify([mockSession stop]); - }); - }); - - describe(@"When a session can not be started because the session is nil", ^{ - beforeEach(^{ - controlSession = [[SDLIAPControlSession alloc] initWithSession:nil delegate:mockDelegate]; - [controlSession startSession]; - }); - - it(@"Should not create a timer", ^{ - expect(controlSession.protocolIndexTimer).to(beNil()); - }); - - it(@"Should return a connectionID of zero", ^{ - expect(controlSession.connectionID).to(equal(0)); - }); - - it(@"Should try to establish a new session", ^{ - OCMVerify([mockDelegate retryControlSession]); - OCMReject([mockDelegate controlSession:[OCMArg any] didGetProtocolString:[OCMArg any] forConnectedAccessory:[OCMArg any]]); - }); - }); - }); - - describe(@"Stopping a session", ^{ - context(@"That is nil", ^{ - beforeEach(^{ - mockSession = nil; - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [controlSession destroySession]; - }); - - it(@"Should not try to stop the session", ^{ - expect(controlSession.session).to(beNil()); - OCMReject([mockSession stop]); - }); - }); - - context(@"That is started", ^{ - beforeEach(^{ - controlSession = [[SDLIAPControlSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [controlSession destroySession]; - }); - - it(@"Should try to stop the session", ^{ - expect(controlSession.session).to(beNil()); - expect(controlSession.session.streamDelegate).to(beNil()); - OCMVerify([mockSession stop]); + OCMExpect([mockDelegate retryControlSession]); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m index 534457160..84e741f7b 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -16,9 +16,15 @@ #import "SDLIAPConstants.h" #import "SDLIAPSession.h" #import "SDLIAPDataSessionDelegate.h" +#import "SDLMutableDataQueue.h" + @interface SDLIAPDataSession() + @property (weak, nonatomic) id delegate; +@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue; +@property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore; + @end QuickSpecBegin(SDLIAPDataSessionSpec) @@ -26,139 +32,42 @@ @interface SDLIAPDataSession() describe(@"SDLIAPDataSession", ^{ __block SDLIAPDataSession *dataSession = nil; __block EAAccessory *mockAccessory = nil; - __block SDLIAPSession *mockSession = nil; __block id mockDelegate = nil; beforeEach(^{ mockDelegate = OCMProtocolMock(@protocol(SDLIAPDataSessionDelegate)); mockAccessory = [EAAccessory.class sdlCoreMock]; - mockSession = OCMClassMock([SDLIAPSession class]); - OCMStub([mockSession accessory]).andReturn(mockAccessory); }); describe(@"init", ^{ - context(@"with a valid session", ^{ - beforeEach(^{ - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; - }); - - it(@"Should get/set correctly", ^{ - expect(dataSession.session).toNot(beNil()); - expect(dataSession.connectionID).to(equal(5)); - expect(dataSession.delegate).to(equal(mockDelegate)); - }); - - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is stopped", ^{ - OCMStub([mockSession isStopped]).andReturn(NO); - expect(dataSession.isSessionInProgress).to(beTrue()); - }); - - it(@"Should be in progress if the session is running", ^{ - OCMStub([mockSession isStopped]).andReturn(YES); - expect(dataSession.isSessionInProgress).to(beFalse()); - }); - }); + beforeEach(^{ + dataSession = [[SDLIAPDataSession alloc] initWithAccessory:mockAccessory delegate:mockDelegate forProtocol:MultiSessionProtocolString]; }); - context(@"with a nil session", ^{ - beforeEach(^{ - dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; - }); - - it(@"Should get/set correctly", ^{ - expect(dataSession.session).to(beNil()); - expect(dataSession.connectionID).to(equal(0)); - expect(dataSession.delegate).to(equal(mockDelegate)); - }); - - describe(@"When checking if the session is in progress", ^{ - it(@"Should not be in progress if the session is stopped because the session is `nil`", ^{ - OCMStub([mockSession isStopped]).andReturn(NO); - expect(dataSession.isSessionInProgress).to(beFalse()); - }); - - it(@"Should be in progress if the session is running becasue the session is `nil`", ^{ - OCMStub([mockSession isStopped]).andReturn(YES); - expect(dataSession.isSessionInProgress).to(beFalse()); - }); - }); + it(@"Should init correctly", ^{ + expect(dataSession.delegate).to(equal(mockDelegate)); + expect(dataSession.sendDataQueue).toNot(beNil()); + expect(dataSession.canceledSemaphore).toNot(beNil()); }); - }); - - describe(@"Starting a session", ^{ - xdescribe(@"When a session starts successfully", ^{ - beforeEach(^{ - OCMStub([mockSession start]).andReturn(YES); - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [dataSession startSession]; - }); - - it(@"Should not try to establish a new session", ^{ - OCMReject([mockDelegate retryDataSession]); - OCMReject([mockDelegate dataReceived:[OCMArg any]]); - }); - }); - - describe(@"When a session does not start successfully", ^{ - beforeEach(^{ - OCMStub([mockSession start]).andReturn(NO); - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [dataSession startSession]; - }); - - it(@"Should try to establish a new session", ^{ - OCMVerify([mockDelegate retryDataSession]); - OCMReject([mockDelegate dataReceived:[OCMArg any]]); - }); - - it(@"Should should stop and destroy the session", ^{ - expect(dataSession.session).to(beNil()); - expect(dataSession.connectionID).to(equal(0)); - OCMVerify([mockSession stop]); - }); - }); - - describe(@"When a session can not be started because the session is nil", ^{ - beforeEach(^{ - dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; - [dataSession startSession]; - }); - - it(@"Should return a connectionID of zero", ^{ - expect(dataSession.connectionID).to(equal(0)); - }); - - it(@"Should try to establish a new session", ^{ - OCMVerify([mockDelegate retryDataSession]); - OCMReject([mockDelegate dataReceived:[OCMArg any]]); - }); + it(@"Should get correctly", ^{ + expect(dataSession.accessory).to(equal(mockAccessory)); + expect(dataSession.protocolString).to(equal(MultiSessionProtocolString)); + expect(dataSession.isStopped).to(beTrue()); + expect(dataSession.connectionID).to(equal(0)); + expect(dataSession.sessionInProgress).to(beFalse()); }); }); - describe(@"Stopping a session", ^{ - context(@"That is nil", ^{ - beforeEach(^{ - dataSession = [[SDLIAPDataSession alloc] initWithSession:nil delegate:mockDelegate]; - [dataSession destroySession]; - }); - - it(@"Should not try to stop the session", ^{ - expect(dataSession.session).to(beNil()); - }); - }); - - context(@"That is started", ^{ + describe(@"starting a session", ^{ + context(@"it should attempt to retry the session", ^{ beforeEach(^{ - dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; - [dataSession destroySession]; + dataSession = [[SDLIAPDataSession alloc] initWithAccessory:nil delegate:mockDelegate forProtocol:MultiSessionProtocolString]; }); - it(@"Should try to stop and detroy the session", ^{ - expect(dataSession.session).to(beNil()); - expect(dataSession.session.streamDelegate).to(beNil()); - OCMVerify([mockSession stop]); + it(@"Should start correctly", ^{ + [dataSession startSession]; + OCMExpect([mockDelegate retryDataSession]); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m index 1e0992379..17984383f 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m @@ -12,150 +12,40 @@ #import "EAAccessory+OCMock.m" #import "SDLIAPSession.h" -#import "SDLMutableDataQueue.h" -#import "SDLStreamDelegate.h" +#import "SDLIAPConstants.h" @interface SDLIAPSession () + @property (nonatomic, assign) BOOL isInputStreamOpen; @property (nonatomic, assign) BOOL isOutputStreamOpen; -@property (nullable, nonatomic, strong) NSThread *ioStreamThread; -@property (nonatomic, strong) SDLMutableDataQueue *sendDataQueue; -@property (nonatomic, strong) dispatch_semaphore_t canceledSemaphore; -- (BOOL)sdl_startWithSession:(EASession *)session; + @end + QuickSpecBegin(SDLIAPSessionSpec) describe(@"SDLIAPSession", ^{ - __block SDLIAPSession *iapSession = nil; __block EAAccessory *mockAccessory = nil; - __block NSString *protocol = nil; describe(@"Initialization", ^{ + __block SDLIAPSession *testSession = nil; + beforeEach(^{ mockAccessory = [EAAccessory.class sdlCoreMock]; + testSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:ControlProtocolString]; }); - it(@"Should init correctly with a control protocol string", ^{ - protocol = @"com.smartdevicelink.prot0"; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - - expect(iapSession.isDataSession).to(beFalse()); - }); - - it(@"Should init correctly with a multisession protocol string", ^{ - protocol = @"com.smartdevicelink.multisession"; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - - expect(iapSession.isDataSession).to(beTrue()); - }); - - it(@"Should init correctly with a legacy protocol string", ^{ - protocol = @"com.ford.sync.prot0"; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - - expect(iapSession.isDataSession).to(beTrue()); - }); - - it(@"Should init correctly with a indexed protocol string", ^{ - protocol = @"com.smartdevicelink.prot1"; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - - expect(iapSession.isDataSession).to(beTrue()); - }); - - afterEach(^{ - expect(iapSession).toNot(beNil()); - expect(iapSession.protocolString).to(match(protocol)); - expect(iapSession.accessory).to(equal(mockAccessory)); - expect(iapSession.canceledSemaphore).toNot(beNil()); - expect(iapSession.sendDataQueue).toNot(beNil()); - expect(iapSession.isInputStreamOpen).to(beFalse()); - expect(iapSession.isOutputStreamOpen).to(beFalse()); + it(@"should init correctly", ^{ + expect(testSession.accessory).to(equal(mockAccessory)); + expect(testSession.protocolString).to(equal(ControlProtocolString)); + expect(testSession.isInputStreamOpen).to(beFalse()); + expect(testSession.isOutputStreamOpen).to(beFalse()); }); - }); - - describe(@"When starting a session", ^{ - __block SDLStreamDelegate *streamDelegate = nil; - __block NSInputStream *inputStream = nil; - __block NSOutputStream *outputStream = nil; - - describe(@"unsuccessfully", ^{ - beforeEach(^{ - protocol = @"com.smartdevicelink.multisession"; - mockAccessory = [EAAccessory.class sdlCoreMock]; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - streamDelegate = [[SDLStreamDelegate alloc] init]; - iapSession.streamDelegate = streamDelegate; - }); - - it(@"the start method should return false if a session cannot be created", ^{ - BOOL success = [iapSession sdl_startWithSession:nil]; - expect(success).to(beFalse()); - expect(iapSession.ioStreamThread).to(beNil()); - expect(iapSession.isInputStreamOpen).to(beFalse()); - expect(iapSession.isOutputStreamOpen).to(beFalse()); - }); - }); - - describe(@"successfully", ^{ - beforeEach(^{ - inputStream = OCMClassMock([NSInputStream class]); - outputStream = OCMClassMock([NSOutputStream class]); - }); - - context(@"if creating a control session", ^{ - beforeEach(^{ - protocol = @"com.smartdevicelink.prot0"; - mockAccessory = [EAAccessory.class sdlCoreMock]; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - streamDelegate = [[SDLStreamDelegate alloc] init]; - iapSession.streamDelegate = streamDelegate; - - expect(iapSession.isDataSession).to(beFalse()); - }); - - it(@"should establish a control session ", ^{ - EASession *mockSession = [EASession.class mockSessionWithAccessory:mockAccessory protocolString:protocol inputStream:inputStream outputStream:outputStream]; - iapSession.easession = mockSession; - - BOOL success = [iapSession sdl_startWithSession:mockSession]; - expect(success).to(beTrue()); - expect(iapSession.ioStreamThread).to(beNil()); - expect(iapSession.easession.inputStream).toNot(beNil()); - expect(iapSession.easession.outputStream).toNot(beNil()); - }); - }); - - context(@"if creating a data session", ^{ - beforeEach(^{ - protocol = @"com.smartdevicelink.multisession"; - mockAccessory = [EAAccessory.class sdlCoreMock]; - iapSession = [[SDLIAPSession alloc] initWithAccessory:mockAccessory forProtocol:protocol]; - streamDelegate = [[SDLStreamDelegate alloc] init]; - iapSession.streamDelegate = streamDelegate; - - expect(iapSession.isDataSession).to(beTrue()); - }); - - it(@"should establish a data session ", ^{ - EASession *mockSession = [EASession.class mockSessionWithAccessory:mockAccessory protocolString:protocol inputStream:inputStream outputStream:outputStream]; - iapSession.easession = mockSession; - BOOL success = [iapSession sdl_startWithSession:mockSession]; - expect(success).to(beTrue()); - expect(iapSession.ioStreamThread).toNot(beNil()); - // The streams are opened in the `sdl_streamHasSpaceHandler` method - expect(iapSession.easession.inputStream).toNot(beNil()); - expect(iapSession.easession.outputStream).toNot(beNil()); - }); - }); - }); - - afterEach(^{ - [iapSession stop]; - expect(iapSession.easession).to(beNil()); - expect(iapSession.ioStreamThread).to(beNil()); + it(@"should get correctly", ^{ + expect(testSession.isStopped).to(beTrue()); + expect(testSession.connectionID).to(equal(0)); + expect(testSession.isSessionInProgress).to(beFalse()); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index fc64cac00..e31a300e4 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -11,6 +11,7 @@ #import #import "EAAccessory+OCMock.m" +#import "SDLIAPConstants.h" #import "SDLIAPTransport.h" #import "SDLIAPSession.h" #import "SDLTimer.h" @@ -26,6 +27,7 @@ @interface SDLIAPTransport () @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; +@property (assign, nonatomic) BOOL transportDisconnected; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAccessory:(EAAccessory *)newAccessory; @@ -57,62 +59,49 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc }); }); - describe(@"When an accessory connects while a data session has been created but not open", ^{ - beforeEach(^{ - transport.dataSession = OCMClassMock([SDLIAPDataSession class]); - OCMStub([transport.dataSession isSessionInProgress]).andReturn(NO); - - expect(transport.controlSession.session).to(beNil()); - }); + describe(@"When checking if the data session is active ", ^{ + it(@"should return that the data session is not active if the data session is nil", ^{ + transport.dataSession = nil; - it(@"should return that a session is not active", ^{ BOOL sessionInProgress = [transport sdl_isDataSessionActive:transport.dataSession newAccessory:mockAccessory]; expect(sessionInProgress).to(beFalse()); }); - }); - - describe(@"When an accessory connects when a data session is already open", ^{ - beforeEach(^{ - transport.dataSession = OCMClassMock([SDLIAPDataSession class]); - OCMStub([transport.dataSession isSessionInProgress]).andReturn(YES); - expect(transport.controlSession.session).to(beNil()); - }); + it(@"should return that the data session is not active if the data session is not inprogress", ^{ + SDLIAPDataSession *mockDataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([mockDataSession isSessionInProgress]).andReturn(NO); - it(@"should return that a session is active", ^{ BOOL sessionInProgress = [transport sdl_isDataSessionActive:transport.dataSession newAccessory:mockAccessory]; - expect(sessionInProgress).to(beTrue()); + expect(sessionInProgress).to(beFalse()); }); - }); - describe(@"When an accessory connects when a data session has not been created", ^{ - beforeEach(^{ - transport.dataSession = nil; + it(@"should return that the data session is not active if the data session and the new accessory have matching connection ids", ^{ + SDLIAPDataSession *mockDataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([mockDataSession isSessionInProgress]).andReturn(YES); + OCMStub([mockDataSession connectionID]).andReturn(5); - expect(transport.controlSession.session).to(beNil()); + BOOL sessionInProgress = [transport sdl_isDataSessionActive:mockDataSession newAccessory:mockAccessory]; + expect(sessionInProgress).to(beFalse()); }); - it(@"should return that a session is active", ^{ - BOOL sessionInProgress = [transport sdl_isDataSessionActive:transport.dataSession newAccessory:mockAccessory]; - expect(sessionInProgress).to(beFalse()); + it(@"should return that the data session is active if the data session and the new accessory have different connection ids", ^{ + SDLIAPDataSession *mockDataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([mockDataSession isSessionInProgress]).andReturn(YES); + OCMStub([mockDataSession connectionID]).andReturn(96); + + BOOL sessionInProgress = [transport sdl_isDataSessionActive:mockDataSession newAccessory:mockAccessory]; + expect(sessionInProgress).to(beTrue()); }); }); describe(@"When an accessory disconnects", ^{ - __block SDLIAPSession *mockSession = nil; __block NSNotification *accessoryDisconnectedNotification = nil; - __block id mockDelegate = nil; beforeEach(^{ - transport.controlSession = nil; - mockSession = OCMClassMock([SDLIAPSession class]); - OCMStub([mockSession accessory]).andReturn(mockAccessory); - transport.dataSession = [[SDLIAPDataSession alloc] initWithSession:mockSession delegate:mockDelegate]; - accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; }); - describe(@"If an accessory connected during an active session", ^{ + context(@"If an accessory disconnects during an active session", ^{ beforeEach(^{ transport.accessoryConnectDuringActiveSession = YES; [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; @@ -123,7 +112,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc }); }); - describe(@"If no accessory connected during an active session", ^{ + context(@"If an accessory disconnects while no session is active", ^{ beforeEach(^{ transport.accessoryConnectDuringActiveSession = NO; [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; @@ -134,94 +123,72 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc }); }); - describe(@"When a data session is open", ^{ + context(@"When a neither a data or control session is open", ^{ beforeEach(^{ + transport.dataSession = nil; + transport.controlSession = nil; + [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; }); - it(@"It should close and destroy the open data session", ^{ - expect(transport.dataSession).toNot(beNil()); - expect(transport.dataSession.session).to(beNil()); - expect(transport.dataSession.session.delegate).to(beNil()); - - expect(transport.sessionSetupInProgress).to(beFalse()); + it(@"It should cleanup on disconnect", ^{ expect(transport.retryCounter).to(equal(0)); - expect(transport.controlSession).to(beNil()); - - OCMVerify([mockTransportDelegate onTransportDisconnected]); - OCMVerify([mockSession stop]); + expect(transport.sessionSetupInProgress).to(beFalse()); + expect(transport.transportDisconnected).to(beFalse()); }); }); - describe(@"When a control session is open", ^{ - __block SDLIAPSession *mockControlSession = nil; - __block NSNotification *accessoryDisconnectedNotification = nil; - __block id mockDelegate = nil; + context(@"When a data session is open", ^{ + __block SDLIAPDataSession *mockDataSession = nil; beforeEach(^{ - mockDelegate = OCMProtocolMock(@protocol(SDLIAPControlSessionDelegate)); - mockControlSession = OCMClassMock([SDLIAPSession class]); - OCMStub([mockControlSession accessory]).andReturn(mockAccessory); - transport.controlSession = [[SDLIAPControlSession alloc] initWithSession:mockControlSession delegate:mockDelegate]; - - transport.dataSession = nil; - transport.sessionSetupInProgress = YES; - transport.retryCounter = 1; - accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; - }); + mockDataSession = OCMClassMock([SDLIAPDataSession class]); + OCMStub([mockDataSession isSessionInProgress]).andReturn(YES); + transport.dataSession = mockDataSession; + transport.controlSession = nil; - it(@"Should not tell the delegate that the transport closed", ^{ - OCMReject([mockTransportDelegate onTransportDisconnected]); [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; }); - it(@"It should reset the setup helpers", ^{ - [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; - + it(@"It should cleanup on disconnect", ^{ expect(transport.retryCounter).to(equal(0)); expect(transport.sessionSetupInProgress).to(beFalse()); + expect(transport.transportDisconnected).to(beTrue()); }); - it(@"It should close and destroy the open control session", ^{ - [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; - - OCMVerify([mockControlSession stop]); + it(@"It should close and destroy data session", ^{ + OCMVerify([mockDataSession destroySession]); + }); - expect(transport.controlSession).toNot(beNil()); - expect(transport.controlSession.session).to(beNil()); - expect(transport.dataSession).to(beNil()); + it(@"It should notify the lifecycle manager that the transport disconnected ", ^{ + OCMVerify([mockTransportDelegate onTransportDisconnected]); }); }); - describe(@"When neither a control or data session has been established/opened", ^{ - __block NSNotification *accessoryDisconnectedNotification = nil; - __block SDLIAPControlSession *mockControlSession; - __block SDLIAPDataSession *mockDataSession; + describe(@"When a control session is open", ^{ + __block SDLIAPControlSession *mockControlSession = nil; beforeEach(^{ mockControlSession = OCMClassMock([SDLIAPControlSession class]); - OCMStub([mockControlSession isSessionInProgress]).andReturn(NO); + OCMStub([mockControlSession isSessionInProgress]).andReturn(YES); transport.controlSession = mockControlSession; + transport.dataSession = nil; - mockDataSession = OCMClassMock([SDLIAPDataSession class]); - OCMStub([mockDataSession isSessionInProgress]).andReturn(NO); - transport.dataSession = mockDataSession; - - transport.sessionSetupInProgress = YES; - transport.retryCounter = 1; - accessoryDisconnectedNotification = [[NSNotification alloc] initWithName:EAAccessoryDidDisconnectNotification object:nil userInfo:@{EAAccessoryKey: mockAccessory}]; - }); - - it(@"Should not tell the delegate that the transport closed", ^{ - OCMReject([mockTransportDelegate onTransportDisconnected]); [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; }); - it(@"It should reset the setup helpers", ^{ - [[NSNotificationCenter defaultCenter] postNotification:accessoryDisconnectedNotification]; - + it(@"It should cleanup on disconnect", ^{ expect(transport.retryCounter).to(equal(0)); expect(transport.sessionSetupInProgress).to(beFalse()); + expect(transport.transportDisconnected).to(beFalse()); + }); + + it(@"It should close and destroy data session", ^{ + OCMVerify([mockControlSession destroySession]); + }); + + it(@"Should not tell the delegate that the transport closed", ^{ + OCMReject([mockTransportDelegate onTransportDisconnected]); }); }); }); From 494e196d0d0d5233699b4a60faf63198bb78a159 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 16:49:35 -0400 Subject: [PATCH 086/179] Cleaned up the SDLIAPSession class --- SmartDeviceLink/SDLIAPSession.h | 6 +++--- SmartDeviceLink/SDLIAPSession.m | 17 +++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/SmartDeviceLink/SDLIAPSession.h b/SmartDeviceLink/SDLIAPSession.h index 7f3dfdad5..bd4dab8bf 100644 --- a/SmartDeviceLink/SDLIAPSession.h +++ b/SmartDeviceLink/SDLIAPSession.h @@ -43,15 +43,15 @@ NS_ASSUME_NONNULL_BEGIN * @param protocol The unique protocol string used to create the session with the accessory * @return A SDLIAPSession object */ -- (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol; +- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory forProtocol:(NSString *)protocol; /** - * Starts a control session. + * Starts a session. */ - (void)startSession; /** - * Stops the current control session if it is open. + * Stops the current session. */ - (void)destroySession; diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index b9ad55896..3e2608f1d 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -34,16 +34,17 @@ @implementation SDLIAPSession #pragma mark - Lifecycle -- (instancetype)initWithAccessory:(EAAccessory *)accessory forProtocol:(NSString *)protocol { +- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory forProtocol:(NSString *)protocol { SDLLogD(@"SDLIAPSession init with accessory:%@ for protocol:%@", accessory.name, protocol); self = [super init]; - if (self) { - _accessory = accessory; - _protocolString = protocol; - _isInputStreamOpen = NO; - _isOutputStreamOpen = NO; - } + if (!self) { return nil; } + + _accessory = accessory; + _protocolString = protocol; + _isInputStreamOpen = NO; + _isOutputStreamOpen = NO; + return self; } @@ -68,7 +69,7 @@ - (void)startStream:(NSStream *)stream { } - (void)stopStream:(NSStream *)stream { - // Verify stream is in a state that can be closed. Closing a stream that has not been opened has very, very bad effects. + // Verify stream is in a state that can be closed. Closing a stream that has not been opened has very bad effects. NSUInteger status1 = stream.streamStatus; if (status1 != NSStreamStatusNotOpen && status1 != NSStreamStatusClosed) { From ad27ed061f08bd675d605f72c848c171d94f1fa0 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 22 May 2019 16:51:06 -0400 Subject: [PATCH 087/179] Cleaned up the control and data session classes --- SmartDeviceLink/SDLIAPControlSession.h | 2 +- SmartDeviceLink/SDLIAPControlSession.m | 29 +++++++++++++------------- SmartDeviceLink/SDLIAPDataSession.h | 2 +- SmartDeviceLink/SDLIAPDataSession.m | 27 ++++++++++++------------ 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.h b/SmartDeviceLink/SDLIAPControlSession.h index c01df91c9..03940ef98 100644 --- a/SmartDeviceLink/SDLIAPControlSession.h +++ b/SmartDeviceLink/SDLIAPControlSession.h @@ -32,7 +32,7 @@ NS_ASSUME_NONNULL_BEGIN * @param delegate The control session delegate * @return A SDLIAPControlSession object */ -- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate; +- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id)delegate; @end diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 75e79693f..1309f7288 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -44,13 +44,11 @@ - (void)stopStream:(NSStream *)stream; @implementation SDLIAPControlSession -- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate { +- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id)delegate { SDLLogV(@"SDLIAPControlSession init"); self = [super initWithAccessory:accessory forProtocol:ControlProtocolString]; - if (!self) { - return nil; - } + if (!self) { return nil; } _protocolIndexTimer = nil; _delegate = delegate; @@ -59,8 +57,6 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; +- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; /** * Sends data to Core via the data session. diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 0d61f7e13..ac0225875 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -44,13 +44,11 @@ - (void)stopStream:(NSStream *)stream; @implementation SDLIAPDataSession -- (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; { +- (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; { SDLLogV(@"SDLIAPDataSession init"); self = [super initWithAccessory:accessory forProtocol:protocol]; - if (!self) { - return nil; - } + if (!self) { return nil; } _delegate = delegate; _sendDataQueue = [[SDLMutableDataQueue alloc] init]; @@ -60,8 +58,6 @@ - (instancetype)initWithAccessory:(EAAccessory *)accessory delegate:(id Date: Thu, 23 May 2019 11:51:24 -0400 Subject: [PATCH 088/179] Fix obj-c example app issues --- Example Apps/Example ObjC/VehicleDataManager.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Example Apps/Example ObjC/VehicleDataManager.m b/Example Apps/Example ObjC/VehicleDataManager.m index afb6ab267..1ec3139f9 100644 --- a/Example Apps/Example ObjC/VehicleDataManager.m +++ b/Example Apps/Example ObjC/VehicleDataManager.m @@ -106,13 +106,13 @@ - (void)unsubscribeToVehicleOdometer { * * @param notification A SDLOnVehicleData notification */ -- (void)vehicleDataNotification:(SDLRPCMessage *)notification { - if (![notification isKindOfClass:SDLOnVehicleData.class]) { +- (void)vehicleDataNotification:(SDLRPCNotificationNotification *)notification { + if (![notification.notification isKindOfClass:SDLOnVehicleData.class]) { return; } SDLOnVehicleData *onVehicleData = (SDLOnVehicleData *)notification; - self.vehicleOdometerData = [NSString stringWithFormat:@"%@: %@ kph", VehicleDataOdometerName, onVehicleData.odometer]; + self.vehicleOdometerData = [NSString stringWithFormat:@"%@: %@ km", VehicleDataOdometerName, onVehicleData.odometer]; if (!self.refreshUIHandler) { return; } self.refreshUIHandler(); From 56876299552d7de2954c5e40d23ebb340814f0f6 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 23 May 2019 12:01:25 -0400 Subject: [PATCH 089/179] Updating Logs WIP will remove during final commit creating new delete/add commands for every sub cell --- SmartDeviceLink/SDLMenuManager.m | 112 +++++++++++++++-------- SmartDeviceLink/SDLMenuUpdateAlgorithm.m | 7 +- 2 files changed, 80 insertions(+), 39 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 0d98d799b..892f662da 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -144,19 +144,25 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; + // RunScore will contain the best possible combination of ADD and Delete Commmands. There will be 2 arrays, OldCell(Deletes/Keeps) NewCells(Adds/Keeps), + // When the Adds and Deletes are removed from their respetive arrays the KEEPS should match at index in both arrays. _runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; - // At this point runScore should have the best possibe Delete/Add combinations as 2 arrays oldStatus, and newStatus - // These 2 array are for the MAIN menu + // Here we create a temproaray array to store the values from the RunScore object. NSArray *deleteMenuStatus = self.runScore.oldStatus; - NSArray *addMenuStaus = self.runScore.updatedStatus; + NSArray *addMenuStatus = self.runScore.updatedStatus; - NSArray *cellToDelete = [self buildDeleteMenuItems: deleteMenuStatus]; - NSArray *cellToAdd = [self buildAddMenuItems:addMenuStaus]; - NSArray *keeps = [self buildKeepMenuItems:deleteMenuStatus]; + // The following arrays are going to be sets of ONLY cells we want DELETE and cells we want to ADD + NSArray *cellsToDelete = [self buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; - [self sdl_updateIdsOnMenuCells:cellToAdd parentId:ParentIdNotFound]; //Update new Cells with a new CellID - [self transferCellIDFromOldCells:self.oldMenuCells toKeptCells:keeps]; + // The following arrays are going to be contain cells we wish to keep. We will use these to compare the submenus of each cell + NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus]; + NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus]; + // Since we may be addnig cells to the list we need to update those cells to have a cellID + [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; + // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. + [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; @@ -166,37 +172,71 @@ - (void)setMenuCells:(NSArray *)menuCells { SDLLogE(@"Error uploading menu artworks: %@", error); } SDLLogD(@"Menu artworks uploaded"); - [self sdl_updateCellsToDelete:cellToDelete cellsToAdd:cellToAdd withCompletionHandler:nil]; + [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:nil]; }]; } - [self sdl_updateCellsToDelete:cellToDelete cellsToAdd:cellToAdd withCompletionHandler:nil]; + __weak typeof(self) weakself = self; + [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { + [weakself sendSubMenuUpdates:oldKeeps newKeepCell:newKeeps atIndex:0]; + }]; } #pragma mark - Build Deletes, Keeps, Adds -- (NSArray *)buildDeleteMenuItems:(NSArray *)oldStatusList { - NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; +- (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { //add an atIndex to be able to recursive this but keep track of the index we were at to do next set + //for(NSUInteger index = startIndex; index < oldKeptCells.count; index++) { + if(oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) { + return; + } + if(oldKeptCells[startIndex].subCells.count > 0) { + SDLMenuRunScore *tempScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldKeptCells[startIndex].subCells updatedMenuCells:newKeptCells[startIndex].subCells]; + NSArray *deleteMenuStatus = tempScore.oldStatus; + NSArray *addMenuStatus = tempScore.updatedStatus; + + NSArray *cellsToDelete = [self buildDeleteMenuItems:deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; + NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + //Update IDs on subcellls to be under their parent ID + [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId]; + [self transferCellIDFromOldCells:oldKeptCells[startIndex].subCells toKeptCells:newKeptCells[startIndex].subCells]; + + __weak typeof(self) weakself = self; + [self sdl_sendDeleteCurrentMenu:cellsToDelete withCompletionHandler:^(NSError * _Nullable error) { + [weakself sdl_sendUpdatedMenu:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { + [weakself sendSubMenuUpdates:oldKeptCells newKeepCell:newKeptCells atIndex:(startIndex + 1)]; + }]; + }]; + } else { + [self sendSubMenuUpdates:oldKeptCells newKeepCell:newKeptCells atIndex:(startIndex + 1)]; + } +} + +// Main Menu +- (NSArray *)buildDeleteMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { + NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; + // The index of the status should corrleate 1-1 with the number of items in the menu + // [2,0,2,0] => [A,B,C,D] = [B,D] [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { if(status.integerValue == 0) { // 0 means the cell was marked for Deletion - [deleteCells addObject:self.oldMenuCells[index]]; + [deleteCells addObject:oldList[index]]; } }]; return [deleteCells copy]; } -- (NSArray *)buildAddMenuItems:(NSArray *)newStatusList { +- (NSArray *)buildAddMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)menuList { NSMutableArray *addCells = [[NSMutableArray alloc] init]; - + // The index of the status should corrleate 1-1 with the number of items in the menu + // [2,1,2,1] => [A,B,C,D] = [B,D] [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { if(status.integerValue == 1) { // 1 means the cell was marked for add - [addCells addObject:self.menuCells[index]]; + [addCells addObject:menuList[index]]; } }]; return [addCells copy]; } -- (NSArray *)buildKeepMenuItems:(NSArray *)oldStatusList { +- (NSArray *)buildOldKeepMenuItems:(NSArray *)oldStatusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { @@ -208,23 +248,29 @@ - (void)setMenuCells:(NSArray *)menuCells { return [keepMenuCells copy]; } +- (NSArray *)buildKeepNewMenuItems:(NSArray *)newStatusList { + NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; -- (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCells:(NSArray *)newCells { - if(oldCells.count > 0) { - for(NSUInteger newCellsIndex = 0; newCellsIndex < newCells.count; newCellsIndex++) { - for(NSUInteger oldCellsIndex = 0; oldCellsIndex < oldCells.count; oldCellsIndex++) { - if([oldCells[oldCellsIndex] isEqual:newCells[newCellsIndex]]) { - self.menuCells[newCellsIndex].cellId = oldCells[oldCellsIndex].cellId; - } - } + [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { + if(status.integerValue == 2) { // 2 means the cell was marked for Keep + [keepMenuCells addObject:self.menuCells[index]]; } - } + }]; + + return [keepMenuCells copy]; } +- (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCells:(NSArray *)newCells { + if (oldCells.count == 0) { return; } + for(NSUInteger i = 0; i < newCells.count; i++) { + newCells[i].cellId = oldCells[i].cellId; + } +} #pragma mark - Updating System - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells withCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { + //create funtion to do this for subcells so we can use proper call backs. if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone] || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) { @@ -258,7 +304,7 @@ - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd #pragma mark Delete Old Menu Items -- (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuCells withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { //update Function to only delete the cells be need to delete , pass in the List +- (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuCells withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { if (self.oldMenuCells.count == 0 || deleteMenuCells == nil) { completionHandler(nil); return; @@ -300,8 +346,6 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu withCompletion self.inProgressUpdate = [mainMenuCommands arrayByAddingObjectsFromArray:subMenuCommands]; - - //SEND the oldSSubcells and the newSuBCells for that cell to the algo and bulild a list of Deletes and Adds __block NSMutableDictionary *errors = [NSMutableDictionary dictionary]; __weak typeof(self) weakSelf = self; [self.connectionManager sendRequests:mainMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) { @@ -315,7 +359,7 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu withCompletion return; } - // weakSelf.oldMenuCells = weakSelf.menuCells; // ASK about this what does oldMenuCells become now? Dont do this yet we need to delete // add subcells first + weakSelf.oldMenuCells = weakSelf.menuCells; // ASK about this what does oldMenuCells become now? Dont do this yet we need to delete // add subcells first [weakSelf.connectionManager sendRequests:subMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) { if (error != nil) { errors[request] = error; @@ -372,14 +416,6 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U } } -- (UInt32)sdl_getNextCorrelationId { - if (self.lastMenuId == INT32_MAX) { - self.lastMenuId = MenuCellIdMin; - } - - return self.lastMenuId++; -} - #pragma mark Deletes - (NSArray *)sdl_deleteCommandsForCells:(NSArray *)cells { diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m index 76ff29ed4..516fdbc30 100644 --- a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m +++ b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m @@ -70,6 +70,7 @@ + (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)startRun oldMenuCell } } } + NSUInteger numberOfAdds = 0; for(NSUInteger status = 0; status < newMenuStatus.count; status++) { // 0 = Delete 1 = Add 2 = Keep @@ -79,7 +80,11 @@ + (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)startRun oldMenuCell } if(numberOfAdds == 0) { - return [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; + bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; + NSLog(@"BestScore: %lu", (unsigned long)bestScoreMenu.score); + NSLog(@"OldMenuStatus: %@",bestScoreMenu.oldStatus); + NSLog(@"NewMenuStatus: %@",bestScoreMenu.updatedStatus); + return bestScoreMenu; } NSLog(@"Run: %lu, RunScore: %lu", (unsigned long)run, (unsigned long)numberOfAdds); From a5b01f5a9229210920c69a25ac94b2337e9759f7 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 23 May 2019 13:02:46 -0400 Subject: [PATCH 090/179] fixed issue where subcells to transfer ID was crashing , added old and new keeps for subcells to keep the indexs matching --- SmartDeviceLink/SDLMenuManager.m | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 892f662da..c9e860a48 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -157,8 +157,8 @@ - (void)setMenuCells:(NSArray *)menuCells { NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; // The following arrays are going to be contain cells we wish to keep. We will use these to compare the submenus of each cell - NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus]; - NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus]; + NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; // Since we may be addnig cells to the list we need to update those cells to have a cellID [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. @@ -196,13 +196,17 @@ - (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(N NSArray *cellsToDelete = [self buildDeleteMenuItems:deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + + NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; + NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + //Update IDs on subcellls to be under their parent ID [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId]; - [self transferCellIDFromOldCells:oldKeptCells[startIndex].subCells toKeptCells:newKeptCells[startIndex].subCells]; + [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:cellsToDelete withCompletionHandler:^(NSError * _Nullable error) { - [weakself sdl_sendUpdatedMenu:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { + [weakself sdl_sendUpdatedMenu:cellsToAdd usingMenu:weakself.menuCells[startIndex].subCells withCompletionHandler:^(NSError * _Nullable error) { [weakself sendSubMenuUpdates:oldKeptCells newKeepCell:newKeptCells atIndex:(startIndex + 1)]; }]; }]; @@ -236,24 +240,24 @@ - (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(N return [addCells copy]; } -- (NSArray *)buildOldKeepMenuItems:(NSArray *)oldStatusList { +- (NSArray *)buildOldKeepMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { if(status.integerValue == 2) { // 2 means the cell was marked for Keep - [keepMenuCells addObject:self.oldMenuCells[index]]; + [keepMenuCells addObject:oldList[index]]; } }]; return [keepMenuCells copy]; } -- (NSArray *)buildKeepNewMenuItems:(NSArray *)newStatusList { +- (NSArray *)buildKeepNewMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)newList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { if(status.integerValue == 2) { // 2 means the cell was marked for Keep - [keepMenuCells addObject:self.menuCells[index]]; + [keepMenuCells addObject:newList[index]]; } }]; @@ -287,7 +291,7 @@ - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { - [weakself sdl_sendUpdatedMenu:addCells withCompletionHandler:^(NSError * _Nullable error) { + [weakself sdl_sendUpdatedMenu:addCells usingMenu: weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { weakself.inProgressUpdate = nil; if (completionHandler != nil) { @@ -324,7 +328,7 @@ - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuC #pragma mark Send New Menu Items -- (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { +- (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSArray *)menu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { if (self.menuCells.count == 0) { SDLLogD(@"No main menu to send"); completionHandler(nil); @@ -336,11 +340,11 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu withCompletion if ([self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells].count > 0 || ![self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameCommandIcon]) { // Send artwork-less menu - mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO]; + mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO usingIndexOf:menu]; subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:NO]; } else { // Send full artwork menu - mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:YES]; + mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:YES usingIndexOf:menu]; subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:YES]; } @@ -435,9 +439,9 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U #pragma mark Commands / SubMenu RPCs -- (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork { +- (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexOf:(NSArray *)menu { NSMutableArray *mutableCommands = [NSMutableArray array]; - [self.menuCells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull menuCell, NSUInteger mainIndex, BOOL * _Nonnull stop) { + [menu enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull menuCell, NSUInteger mainIndex, BOOL * _Nonnull stop) { [cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull updatedCell, NSUInteger updatedIndex, BOOL * _Nonnull stop) { if([menuCell isEqual:updatedCell]) { if (updatedCell.subCells.count > 0) { From d39ebc61997aaa732fbd542eefb5510dfad276ab Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 23 May 2019 15:49:51 -0400 Subject: [PATCH 091/179] needed to set in progress to nil after we start an update for sub menus --- SmartDeviceLink/SDLMenuManager.m | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index c9e860a48..fb73ca11c 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -148,19 +148,21 @@ - (void)setMenuCells:(NSArray *)menuCells { // When the Adds and Deletes are removed from their respetive arrays the KEEPS should match at index in both arrays. _runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; - // Here we create a temproaray array to store the values from the RunScore object. + // Here we create a temproaray array to store the values from the RunScore object. At this point the arrays with both contain Keeps. NSArray *deleteMenuStatus = self.runScore.oldStatus; NSArray *addMenuStatus = self.runScore.updatedStatus; - // The following arrays are going to be sets of ONLY cells we want DELETE and cells we want to ADD + // These arrays will now contain only Deletes or only Adds NSArray *cellsToDelete = [self buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; - // The following arrays are going to be contain cells we wish to keep. We will use these to compare the submenus of each cell + // These arrays will only contain Keeps. We wil use this araay to compare submenus after we finish building the main menu NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; - // Since we may be addnig cells to the list we need to update those cells to have a cellID + + // Since we may be adding cells to the list we need to update those cells to have a cellID [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; + // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; @@ -183,9 +185,9 @@ - (void)setMenuCells:(NSArray *)menuCells { } #pragma mark - Build Deletes, Keeps, Adds -- (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { //add an atIndex to be able to recursive this but keep track of the index we were at to do next set - //for(NSUInteger index = startIndex; index < oldKeptCells.count; index++) { +- (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { if(oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) { + self.inProgressUpdate = nil; return; } @@ -200,7 +202,6 @@ - (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(N NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:newKeptCells[startIndex].subCells]; - //Update IDs on subcellls to be under their parent ID [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId]; [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; @@ -363,7 +364,7 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSA return; } - weakSelf.oldMenuCells = weakSelf.menuCells; // ASK about this what does oldMenuCells become now? Dont do this yet we need to delete // add subcells first + //weakSelf.oldMenuCells = weakSelf.menuCells; // ASK about this what does oldMenuCells become now? Dont do this yet we need to delete // add subcells first [weakSelf.connectionManager sendRequests:subMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) { if (error != nil) { errors[request] = error; From c3c67cad6707c4958b9140869e3e5a1aa52f5439 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 23 May 2019 15:52:57 -0400 Subject: [PATCH 092/179] System Capability subscriptions * Unit test updates * Block and selector based subscriptions --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 30 ++++ SmartDeviceLink/SDLError.h | 1 + SmartDeviceLink/SDLError.m | 6 + SmartDeviceLink/SDLLifecycleManager.m | 1 + SmartDeviceLink/SDLSystemCapabilityManager.h | 67 ++++----- SmartDeviceLink/SDLSystemCapabilityManager.m | 102 ++++++-------- SmartDeviceLink/SDLSystemCapabilityObserver.h | 33 +++++ SmartDeviceLink/SDLSystemCapabilityObserver.m | 37 +++++ .../TestSystemCapabilityObserver.h | 22 +++ .../TestSystemCapabilityObserver.m | 30 ++++ .../SDLSystemCapabilityManagerSpec.m | 130 +++++++++++++++++- 11 files changed, 365 insertions(+), 94 deletions(-) create mode 100644 SmartDeviceLink/SDLSystemCapabilityObserver.h create mode 100644 SmartDeviceLink/SDLSystemCapabilityObserver.m create mode 100644 SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h create mode 100644 SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 183bfcf37..a7d0836c8 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1004,6 +1004,9 @@ 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 */; }; + 5D75960D22972F830013207C /* TestSystemCapabilityObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D75960C22972F830013207C /* TestSystemCapabilityObserver.m */; }; + 5D75961122972FCA0013207C /* SDLSystemCapabilityObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D75960F22972FCA0013207C /* SDLSystemCapabilityObserver.h */; }; + 5D75961222972FCA0013207C /* SDLSystemCapabilityObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D75961022972FCA0013207C /* SDLSystemCapabilityObserver.m */; }; 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 */; }; @@ -2632,6 +2635,10 @@ 5D6F7A331BC5B9B60070BF37 /* SDLLockScreenViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenViewController.h; sourceTree = ""; }; 5D6F7A341BC5B9B60070BF37 /* SDLLockScreenViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLLockScreenViewController.m; sourceTree = ""; }; 5D6F7A3D1BC811FC0070BF37 /* SDLAssets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = SDLAssets.xcassets; path = Assets/SDLAssets.xcassets; sourceTree = ""; }; + 5D75960B22972F830013207C /* TestSystemCapabilityObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TestSystemCapabilityObserver.h; path = DevAPISpecs/TestSystemCapabilityObserver.h; sourceTree = ""; }; + 5D75960C22972F830013207C /* TestSystemCapabilityObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = TestSystemCapabilityObserver.m; path = DevAPISpecs/TestSystemCapabilityObserver.m; sourceTree = ""; }; + 5D75960F22972FCA0013207C /* SDLSystemCapabilityObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLSystemCapabilityObserver.h; sourceTree = ""; }; + 5D75961022972FCA0013207C /* SDLSystemCapabilityObserver.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityObserver.m; sourceTree = ""; }; 5D76E31B1D3805FF00647CFA /* SDLLockScreenManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLockScreenManagerSpec.m; path = DevAPISpecs/SDLLockScreenManagerSpec.m; sourceTree = ""; }; 5D76E3201D39742300647CFA /* SDLViewControllerPresentable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLViewControllerPresentable.h; sourceTree = ""; }; 5D76E3221D39767000647CFA /* SDLLockScreenPresenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLLockScreenPresenter.h; sourceTree = ""; }; @@ -5050,6 +5057,24 @@ name = "Lock Screen UI"; sourceTree = ""; }; + 5D75960A22972F620013207C /* Utilities */ = { + isa = PBXGroup; + children = ( + 5D75960B22972F830013207C /* TestSystemCapabilityObserver.h */, + 5D75960C22972F830013207C /* TestSystemCapabilityObserver.m */, + ); + name = Utilities; + sourceTree = ""; + }; + 5D75960E22972FB90013207C /* Utilities */ = { + isa = PBXGroup; + children = ( + 5D75960F22972FCA0013207C /* SDLSystemCapabilityObserver.h */, + 5D75961022972FCA0013207C /* SDLSystemCapabilityObserver.m */, + ); + name = Utilities; + sourceTree = ""; + }; 5D76E31A1D3805E600647CFA /* LockScreen */ = { isa = PBXGroup; children = ( @@ -5740,6 +5765,7 @@ 880E35B12088F73400181259 /* System Capabilities */ = { isa = PBXGroup; children = ( + 5D75960E22972FB90013207C /* Utilities */, 880E35B32088F75A00181259 /* SDLSystemCapabilityManager.h */, 880E35B22088F75A00181259 /* SDLSystemCapabilityManager.m */, ); @@ -5749,6 +5775,7 @@ 880E35B62088F77C00181259 /* System Capabilities */ = { isa = PBXGroup; children = ( + 5D75960A22972F620013207C /* Utilities */, 880E35B72088F78E00181259 /* SDLSystemCapabilityManagerSpec.m */, ); name = "System Capabilities"; @@ -6272,6 +6299,7 @@ 5D61FDB11A84238C00846EE7 /* SDLSubscribeVehicleData.h in Headers */, 5DB996601F28C6ED002D8795 /* SDLControlFramePayloadVideoStartServiceAck.h in Headers */, 5DCF76F51ACDBAD300BB647B /* SDLSendLocation.h in Headers */, + 5D75961122972FCA0013207C /* SDLSystemCapabilityObserver.h in Headers */, 5D61FC9E1A84238C00846EE7 /* SDLEncodedSyncPData.h in Headers */, 1FF7DABA1F75B2A800B46C30 /* SDLFocusableItemLocator.h in Headers */, 5D019276214994AC003500F6 /* NSMutableArray+Safe.h in Headers */, @@ -7025,6 +7053,7 @@ 88EEC5BC220A327B005AA2F9 /* SDLPublishAppServiceResponse.m in Sources */, 5D61FC951A84238C00846EE7 /* SDLDriverDistractionState.m in Sources */, 5DB996611F28C6ED002D8795 /* SDLControlFramePayloadVideoStartServiceAck.m in Sources */, + 5D75961222972FCA0013207C /* SDLSystemCapabilityObserver.m in Sources */, 884E702021FB983F008D53BA /* SDLAppServiceManifest.m in Sources */, 5D61FD961A84238C00846EE7 /* SDLShowResponse.m in Sources */, 5D61FD981A84238C00846EE7 /* SDLSingleTireStatus.m in Sources */, @@ -7369,6 +7398,7 @@ 162E837E1A9BDE8B00906325 /* SDLGPSDataSpec.m in Sources */, 5DAE06731BDEC6C000F9B498 /* SDLFileSpec.m in Sources */, 162E82E11A9BDE8B00906325 /* SDLHMIZoneCapabilitiesSpec.m in Sources */, + 5D75960D22972F830013207C /* TestSystemCapabilityObserver.m in Sources */, 88B58DBD222042500011B063 /* SDLDirectionSpec.m in Sources */, 162E83721A9BDE8B00906325 /* SDLAudioPassThruCapabilitiesSpec.m in Sources */, 162E83681A9BDE8B00906325 /* SDLSpeakResponseSpec.m in Sources */, diff --git a/SmartDeviceLink/SDLError.h b/SmartDeviceLink/SDLError.h index 9c6209c5b..280c20309 100644 --- a/SmartDeviceLink/SDLError.h +++ b/SmartDeviceLink/SDLError.h @@ -90,6 +90,7 @@ extern SDLErrorDomain *const SDLErrorDomainRPCStore; + (NSException *)sdl_invalidSoftButtonStateException; + (NSException *)sdl_carWindowOrientationException; + (NSException *)sdl_invalidLockscreenSetupException; ++ (NSException *)sdl_invalidSelectorExceptionWithSelector:(SEL)selector; @end diff --git a/SmartDeviceLink/SDLError.m b/SmartDeviceLink/SDLError.m index 7e5a0e95b..f72608a31 100644 --- a/SmartDeviceLink/SDLError.m +++ b/SmartDeviceLink/SDLError.m @@ -328,6 +328,12 @@ + (NSException *)sdl_invalidLockscreenSetupException { userInfo:nil]; } ++ (NSException *)sdl_invalidSelectorExceptionWithSelector:(SEL)selector { + return [NSException exceptionWithName:@"com.sdl.systemCapabilityManager.selectorException" + reason:[NSString stringWithFormat:@"Capability observation selector: %@ does not match possible selectors, which must have either 0 or 1 parameters", NSStringFromSelector(selector)] + userInfo:nil]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index 0c3b257ab..7ba94a6f7 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -385,6 +385,7 @@ - (void)didEnterStateSettingUpManagers { dispatch_group_enter(managerGroup); SDLLogD(@"Setting up assistant managers"); [self.lockScreenManager start]; + [self.systemCapabilityManager start]; dispatch_group_enter(managerGroup); [self.fileManager startWithCompletionHandler:^(BOOL success, NSError *_Nullable error) { diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h index da6d21ee4..ea5e6764b 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.h +++ b/SmartDeviceLink/SDLSystemCapabilityManager.h @@ -141,59 +141,64 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapabilityManager *systemCap @property (nullable, strong, nonatomic, readonly) SDLAppServicesCapabilities *appServicesCapabilities; /** - * If returned, the platform supports navigation - * - * @see SDLNavigationCapability - * - * Optional + If returned, the platform supports navigation + + @see SDLNavigationCapability + + Optional */ @property (nullable, strong, nonatomic, readonly) SDLNavigationCapability *navigationCapability; /** - * If returned, the platform supports making phone calls - * - * @see SDLPhoneCapability - * - * Optional + If returned, the platform supports making phone calls + + @see SDLPhoneCapability + + Optional */ @property (nullable, strong, nonatomic, readonly) SDLPhoneCapability *phoneCapability; /** - * If returned, the platform supports video streaming - * - * @see SDLVideoStreamingCapability - * - * Optional + If returned, the platform supports video streaming + + @see SDLVideoStreamingCapability + + Optional */ @property (nullable, strong, nonatomic, readonly) SDLVideoStreamingCapability *videoStreamingCapability; /** - * If returned, the platform supports remote control capabilities - * - * @see SDLRemoteControlCapabilities - * - * Optional + If returned, the platform supports remote control capabilities + + @see SDLRemoteControlCapabilities + + Optional */ @property (nullable, strong, nonatomic, readonly) SDLRemoteControlCapabilities *remoteControlCapability; /** - * Init is unavailable. Dependencies must be injected using initWithConnectionManager: - * - * @return nil + Init is unavailable. Dependencies must be injected using initWithConnectionManager: + + @return nil */ - (instancetype)init NS_UNAVAILABLE; /** - * Creates a new system capability manager with a specified connection manager - * - * @param manager A connection manager to use to forward on RPCs - * - * @return An instance of SDLSystemCapabilityManager + Creates a new system capability manager with a specified connection manager + + @param manager A connection manager to use to forward on RPCs + + @return An instance of SDLSystemCapabilityManager */ - (instancetype)initWithConnectionManager:(id)manager NS_DESIGNATED_INITIALIZER; /** - * Stops the manager. This method is used internally. + Starts the manager. This method is used internally. + */ +- (void)start; + +/** + Stops the manager. This method is used internally. */ - (void)stop; @@ -210,9 +215,9 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapabilityManager *systemCap @param type The type of capability to subscribe to @param block The block to be called when the capability is updated - @return An object that can be used to unsubscribe the block using unsubscribeFromCapabilityType:withObserver: by passing it in the observer callback + @return An object that can be used to unsubscribe the block using unsubscribeFromCapabilityType:withObserver: by passing it in the observer callback, or nil if subscriptions aren't available on this head unit */ -- (id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block; +- (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block; /** * Subscribe to a particular capability type with a selector callback. The selector supports the following parameters: diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m index 49344e751..bf1f2b168 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.m +++ b/SmartDeviceLink/SDLSystemCapabilityManager.m @@ -12,6 +12,7 @@ #import "SDLAppServiceRecord.h" #import "SDLAppServicesCapabilities.h" #import "SDLConnectionManagerType.h" +#import "SDLError.h" #import "SDLGenericResponse.h" #import "SDLGetSystemCapability.h" #import "SDLGetSystemCapabilityResponse.h" @@ -28,49 +29,13 @@ #import "SDLRPCResponseNotification.h" #import "SDLSetDisplayLayoutResponse.h" #import "SDLSystemCapability.h" +#import "SDLSystemCapabilityObserver.h" #import "SDLVersion.h" #import "SDLVideoStreamingCapability.h" NS_ASSUME_NONNULL_BEGIN -@interface SDLSystemCapabilityObserver : NSObject - -@property (strong, nonatomic) id observer; -@property (assign, nonatomic) SEL selector; -@property (copy, nonatomic) SDLCapabilityUpdateHandler block; - -- (instancetype)initWithObserver:(id)observer selector:(SEL)selector; -- (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block; - -@end - -@implementation SDLSystemCapabilityObserver - -- (instancetype)initWithObserver:(id)observer selector:(SEL)selector { - self = [super init]; - if (!self) { return nil; } - - _observer = observer; - _selector = selector; - - return self; -} - -- (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block { - self = [super init]; - if (!self) { return nil; } - - _observer = observer; - _block = block; - - return self; -} - -@end - - - @interface SDLSystemCapabilityManager () typedef NSString * SDLServiceID; @@ -95,6 +60,7 @@ @interface SDLSystemCapabilityManager () @property (nullable, strong, nonatomic) NSMutableDictionary *appServicesCapabilitiesDictionary; +@property (assign, nonatomic) BOOL supportsObservers; @property (strong, nonatomic) NSMutableDictionary *> *capabilityObservers; @property (nullable, strong, nonatomic) SDLSystemCapability *lastReceivedCapability; @@ -119,7 +85,7 @@ - (instancetype)initWithConnectionManager:(id)manager _capabilityObservers = [NSMutableDictionary dictionary]; for (SDLSystemCapabilityType capabilityType in [self.class sdl_systemCapabilityTypes]) { - _capabilityObservers[capabilityType] = @[]; + _capabilityObservers[capabilityType] = [NSMutableArray array]; } [self sdl_registerForNotifications]; @@ -127,6 +93,14 @@ - (instancetype)initWithConnectionManager:(id)manager return self; } +- (void)start { + SDLVersion *onSystemCapabilityNotificationRPCVersion = [SDLVersion versionWithString:@"5.1.0"]; + SDLVersion *headUnitRPCVersion = SDLGlobals.sharedGlobals.rpcVersion; + if ([headUnitRPCVersion isGreaterThanOrEqualToVersion:onSystemCapabilityNotificationRPCVersion]) { + _supportsObservers = YES; + } +} + /** * Resets the capabilities when a transport session is closed. */ @@ -149,6 +123,11 @@ - (void)stop { _remoteControlCapability = nil; _appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary]; + _supportsObservers = NO; + for (SDLSystemCapabilityType capabilityType in [self.class sdl_systemCapabilityTypes]) { + _capabilityObservers[capabilityType] = [NSMutableArray array]; + } + _isFirstHMILevelFull = NO; } @@ -248,9 +227,7 @@ - (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification #pragma mark - System Capabilities - (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SDLUpdateCapabilityHandler)handler { - SDLVersion *onSystemCapabilityNotificationRPCVersion = [SDLVersion versionWithString:@"5.1.0"]; - SDLVersion *headUnitRPCVersion = SDLGlobals.sharedGlobals.rpcVersion; - if ([headUnitRPCVersion isGreaterThanOrEqualToVersion:onSystemCapabilityNotificationRPCVersion]) { + if (self.supportsObservers) { // Just return the cached data because we get `onSystemCapability` callbacks handler(nil, self); } else { @@ -275,9 +252,7 @@ - (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SD - (void)sdl_subscribeToSystemCapabilityUpdates { for (SDLSystemCapabilityType type in [self.class sdl_systemCapabilityTypes]) { SDLGetSystemCapability *getSystemCapability = [[SDLGetSystemCapability alloc] initWithType:type]; - SDLVersion *onSystemCapabilityNotificationRPCVersion = [SDLVersion versionWithString:@"5.1.0"]; - SDLVersion *headUnitRPCVersion = SDLGlobals.sharedGlobals.rpcVersion; - if ([headUnitRPCVersion isGreaterThanOrEqualToVersion:onSystemCapabilityNotificationRPCVersion]) { + if (self.supportsObservers) { getSystemCapability.subscribe = @YES; } @@ -346,30 +321,34 @@ - (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability complet } - (BOOL)sdl_callSaveHandlerForCapabilityType:(SDLSystemCapabilityType)type andReturnWithValue:(BOOL)value handler:(nullable SDLUpdateCapabilityHandler)handler { - if (handler == nil) { return value; } - handler(nil, self); - for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[type]) { if (observer.block != nil) { observer.block(self); } else { - if ([observer.observer respondsToSelector:observer.selector]) { - [observer.observer performSelector:observer.selector]; + NSUInteger numberOfParametersInSelector = [NSStringFromSelector(observer.selector) componentsSeparatedByString:@":"].count - 1; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + if (numberOfParametersInSelector == 0) { + if ([observer.observer respondsToSelector:observer.selector]) { + [observer.observer performSelector:observer.selector]; + } + } else if (numberOfParametersInSelector == 1) { + if ([observer.observer respondsToSelector:observer.selector]) { + [observer.observer performSelector:observer.selector withObject:self]; + } + } else { + @throw [NSException sdl_invalidSelectorExceptionWithSelector:observer.selector]; } +#pragma clang diagnostic pop } } + if (handler == nil) { return value; } + handler(nil, self); + return value; } -//- (SDLSystemCapability *)capabilityForType:(SDLSystemCapabilityType)type { -// if ([type isEqualToEnum:SDLSystemCapabilityTypePhoneCall]) { -// return [[SDLSystemCapability alloc] initWithPhoneCapability:self.phoneCapability]; -// } else if ([type isEqualToEnum:SDLSystemCapabilityTypeNavigation]) { -// return [SDLSystemcap] self.navigationCapability; -// } -//} - - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newCapabilities { for (SDLAppServiceCapability *capability in newCapabilities.appServices) { if (capability.updateReason == nil) { @@ -386,7 +365,9 @@ - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newC #pragma mark - Subscriptions -- (id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block { +- (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block { + if (!self.supportsObservers) { return nil; } + SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] block:block]; [self.capabilityObservers[type] addObject:observerObject]; @@ -394,6 +375,11 @@ - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newC } - (BOOL)subscribeToCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer selector:(SEL)selector { + if (!self.supportsObservers) { return NO; } + + NSUInteger numberOfParametersInSelector = [NSStringFromSelector(selector) componentsSeparatedByString:@":"].count - 1; + if (numberOfParametersInSelector > 1) { return NO; } + SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:observer selector:selector]; [self.capabilityObservers[type] addObject:observerObject]; diff --git a/SmartDeviceLink/SDLSystemCapabilityObserver.h b/SmartDeviceLink/SDLSystemCapabilityObserver.h new file mode 100644 index 000000000..79f8590c4 --- /dev/null +++ b/SmartDeviceLink/SDLSystemCapabilityObserver.h @@ -0,0 +1,33 @@ +// +// SDLSystemCapabilityObserver.h +// SmartDeviceLink +// +// Created by Joel Fischer on 5/23/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +@class SDLSystemCapabilityManager; + +NS_ASSUME_NONNULL_BEGIN + +/** + An observer block whenever a subscription is called. + + @param systemCapabilityManager This manager. The user of the handler can then use the manager to pull the newest data. + */ +typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapabilityManager *systemCapabilityManager); + +@interface SDLSystemCapabilityObserver : NSObject + +@property (strong, nonatomic) id observer; +@property (assign, nonatomic) SEL selector; +@property (copy, nonatomic) SDLCapabilityUpdateHandler block; + +- (instancetype)initWithObserver:(id)observer selector:(SEL)selector; +- (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLSystemCapabilityObserver.m b/SmartDeviceLink/SDLSystemCapabilityObserver.m new file mode 100644 index 000000000..64832f1a7 --- /dev/null +++ b/SmartDeviceLink/SDLSystemCapabilityObserver.m @@ -0,0 +1,37 @@ +// +// SDLSystemCapabilityObserver.m +// SmartDeviceLink +// +// Created by Joel Fischer on 5/23/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLSystemCapabilityObserver.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation SDLSystemCapabilityObserver + +- (instancetype)initWithObserver:(id)observer selector:(SEL)selector { + self = [super init]; + if (!self) { return nil; } + + _observer = observer; + _selector = selector; + + return self; +} + +- (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block { + self = [super init]; + if (!self) { return nil; } + + _observer = observer; + _block = block; + + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h b/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h new file mode 100644 index 000000000..f6350db05 --- /dev/null +++ b/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h @@ -0,0 +1,22 @@ +// +// TestSystemCapabilityObserver.h +// SmartDeviceLinkTests +// +// Created by Joel Fischer on 5/23/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface TestSystemCapabilityObserver : NSObject + +@property (assign, nonatomic) NSUInteger selectorCalledCount; + +- (void)capabilityUpdated; +- (void)capabilityUpdatedWithNotification:(SDLSystemCapabilityManager *)capabilityManager; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.m b/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.m new file mode 100644 index 000000000..5366b0884 --- /dev/null +++ b/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.m @@ -0,0 +1,30 @@ +// +// TestSystemCapabilityObserver.m +// SmartDeviceLinkTests +// +// Created by Joel Fischer on 5/23/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "TestSystemCapabilityObserver.h" + +@implementation TestSystemCapabilityObserver + +- (instancetype)init { + self = [super init]; + if (!self) { return nil; } + + _selectorCalledCount = 0; + + return self; +} + +- (void)capabilityUpdated { + self.selectorCalledCount++; +} + +- (void)capabilityUpdatedWithNotification:(SDLSystemCapabilityManager *)capabilityManager { + self.selectorCalledCount++; +} + +@end diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m index 109b8ea2d..bc411fc51 100644 --- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m +++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m @@ -31,6 +31,13 @@ #import "TestConnectionManager.h" +@interface SDLSystemCapabilityManager () + +@property (assign, nonatomic) BOOL supportsObservers; + +@end + + QuickSpecBegin(SDLSystemCapabilityManagerSpec) describe(@"System capability manager", ^{ @@ -181,7 +188,7 @@ }); }); - context(@"When notified of a Set Display Layout Response", ^ { + context(@"When notified of a SetDisplayLayout Response", ^ { __block SDLSetDisplayLayoutResponse *testSetDisplayLayoutResponse = nil; __block SDLDisplayCapabilities *testDisplayCapabilities = nil; __block NSArray *testSoftButtonCapabilities = nil; @@ -216,7 +223,7 @@ testSetDisplayLayoutResponse.presetBankCapabilities = testPresetBankCapabilities; }); - describe(@"If the Set Display Layout request fails", ^{ + describe(@"If the SetDisplayLayout request fails", ^{ beforeEach(^{ testSetDisplayLayoutResponse.success = @NO; SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveSetDisplayLayoutResponse object:self rpcResponse:testSetDisplayLayoutResponse]; @@ -231,7 +238,7 @@ }); }); - describe(@"If the Set Display Layout request succeeds", ^{ + describe(@"If the SetDisplayLayout request succeeds", ^{ beforeEach(^{ testSetDisplayLayoutResponse.success = @YES; SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveSetDisplayLayoutResponse object:self rpcResponse:testSetDisplayLayoutResponse]; @@ -263,8 +270,8 @@ }); }); - context(@"When sending a Get System Capability request", ^{ - __block SDLGetSystemCapabilityResponse *testGetSystemCapabilityResponse; + context(@"When sending a GetSystemCapability request", ^{ + __block SDLGetSystemCapabilityResponse *testGetSystemCapabilityResponse = nil; __block SDLPhoneCapability *testPhoneCapability = nil; beforeEach(^{ @@ -347,6 +354,7 @@ SDLSystemCapability *newCapability = [[SDLSystemCapability alloc] initWithPhoneCapability:phoneCapability]; SDLOnSystemCapabilityUpdated *update = [[SDLOnSystemCapabilityUpdated alloc] initWithSystemCapability:newCapability]; SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemCapabilityUpdatedNotification object:nil rpcNotification:update]; + [[NSNotificationCenter defaultCenter] postNotification:notification]; }); @@ -355,6 +363,118 @@ }); }); + describe(@"subscribing to capability types", ^{ + __block TestSystemCapabilityObserver *phoneObserver = nil; + __block TestSystemCapabilityObserver *navigationObserver = nil; + + __block NSUInteger blockObserverTriggeredCount = 0; + + beforeEach(^{ + blockObserverTriggeredCount = 0; + testSystemCapabilityManager.supportsObservers = YES; + + phoneObserver = [[TestSystemCapabilityObserver alloc] init]; + [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:phoneObserver selector:@selector(capabilityUpdatedWithNotification:)]; + navigationObserver = [[TestSystemCapabilityObserver alloc] init]; + [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeNavigation withObserver:navigationObserver selector:@selector(capabilityUpdatedWithNotification:)]; + }); + + describe(@"when observers aren't supported", ^{ + __block BOOL observationSuccess = NO; + + beforeEach(^{ + testSystemCapabilityManager.supportsObservers = NO; + + observationSuccess = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:phoneObserver selector:@selector(capabilityUpdatedWithNotification:)]; + }); + + it(@"should fail to subscribe", ^{ + expect(observationSuccess).to(beFalse()); + }); + }); + + context(@"from a GetSystemCapabilitiesResponse", ^{ + __block id blockObserver = nil; + + beforeEach(^{ + blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) { + blockObserverTriggeredCount++; + }]; + + SDLGetSystemCapabilityResponse *testResponse = [[SDLGetSystemCapabilityResponse alloc] init]; + testResponse.systemCapability = [[SDLSystemCapability alloc] initWithPhoneCapability:[[SDLPhoneCapability alloc] initWithDialNumber:YES]]; + SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveGetSystemCapabilitiesResponse object:nil rpcResponse:testResponse]; + + [[NSNotificationCenter defaultCenter] postNotification:notification]; + }); + + it(@"should notify subscribers of the new data", ^{ + expect(phoneObserver.selectorCalledCount).toEventually(equal(1)); + expect(blockObserverTriggeredCount).toEventually(equal(1)); + expect(navigationObserver.selectorCalledCount).toEventually(equal(0)); + }); + + describe(@"unsubscribing", ^{ + beforeEach(^{ + [testSystemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:phoneObserver]; + [testSystemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:blockObserver]; + + SDLGetSystemCapabilityResponse *testResponse = [[SDLGetSystemCapabilityResponse alloc] init]; + testResponse.systemCapability = [[SDLSystemCapability alloc] initWithPhoneCapability:[[SDLPhoneCapability alloc] initWithDialNumber:YES]]; + SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveGetSystemCapabilitiesResponse object:nil rpcResponse:testResponse]; + + [[NSNotificationCenter defaultCenter] postNotification:notification]; + }); + + it(@"should not notify the subscriber of the new data", ^{ + expect(phoneObserver.selectorCalledCount).toEventually(equal(1)); // No change from above + expect(blockObserverTriggeredCount).toEventually(equal(1)); + expect(navigationObserver.selectorCalledCount).toEventually(equal(0)); + }); + }); + }); + + context(@"from an OnSystemCapabilities notification", ^{ + __block id blockObserver = nil; + + beforeEach(^{ + blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) { + blockObserverTriggeredCount++; + }]; + + SDLOnSystemCapabilityUpdated *testNotification = [[SDLOnSystemCapabilityUpdated alloc] initWithSystemCapability:[[SDLSystemCapability alloc] initWithPhoneCapability:[[SDLPhoneCapability alloc] initWithDialNumber:YES]]]; + SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemCapabilityUpdatedNotification object:nil rpcNotification:testNotification]; + + [[NSNotificationCenter defaultCenter] postNotification:notification]; + }); + + it(@"should notify subscribers of the new data", ^{ + expect(phoneObserver.selectorCalledCount).toEventually(equal(1)); + expect(blockObserverTriggeredCount).toEventually(equal(1)); + expect(navigationObserver.selectorCalledCount).toEventually(equal(0)); + }); + + describe(@"unsubscribing", ^{ + beforeEach(^{ + [testSystemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:phoneObserver]; + [testSystemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:blockObserver]; + + SDLGetSystemCapabilityResponse *testResponse = [[SDLGetSystemCapabilityResponse alloc] init]; + testResponse.systemCapability = [[SDLSystemCapability alloc] initWithPhoneCapability:[[SDLPhoneCapability alloc] initWithDialNumber:YES]]; + SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveGetSystemCapabilitiesResponse object:nil rpcResponse:testResponse]; + + [[NSNotificationCenter defaultCenter] postNotification:notification]; + }); + + it(@"should not notify the subscriber of the new data", ^{ + expect(phoneObserver.selectorCalledCount).toEventually(equal(1)); // No change from above + expect(blockObserverTriggeredCount).toEventually(equal(1)); + expect(navigationObserver.selectorCalledCount).toEventually(equal(0)); + }); + }); + }); + }); + describe(@"merging app services capability changes", ^{ __block SDLAppServicesCapabilities *baseAppServices = nil; __block SDLAppServiceCapability *deleteCapability = nil; From 25f8f76a73900c1a8e8640172add522ffd73e873 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 23 May 2019 16:07:07 -0400 Subject: [PATCH 093/179] Fixed the file manager race condition Fixed the file manager adding operations to the queue after shutdown --- SmartDeviceLink/SDLFileManager.m | 23 +++++++++++--- .../DevAPISpecs/SDLFileManagerSpec.m | 31 +++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLFileManager.m b/SmartDeviceLink/SDLFileManager.m index 911ec889f..60b6192d0 100644 --- a/SmartDeviceLink/SDLFileManager.m +++ b/SmartDeviceLink/SDLFileManager.m @@ -404,8 +404,6 @@ - (void)sdl_uploadFile:(SDLFile *)file completionHandler:(nullable SDLFileManage if ([self sdl_canFileBeUploadedAgain:file maxUploadCount:maxUploadCount failedFileUploadsCount:self.failedFileUploadsCount]) { SDLLogD(@"Attempting to resend file with name %@ after a failed upload attempt", file.name); return [self sdl_uploadFile:file completionHandler:handler]; - } else { - SDLLogE(@"File named %@ failed to upload. Max number of upload attempts reached", file.name); } } @@ -526,11 +524,28 @@ - (float)sdl_uploadPercentage:(float)totalBytes uploadedBytes:(float)uploadedByt * @return True if the file still needs to be (re)sent to Core; false if not. */ - (BOOL)sdl_canFileBeUploadedAgain:(nullable SDLFile *)file maxUploadCount:(UInt8)maxUploadCount failedFileUploadsCount:(NSMutableDictionary *> *)failedFileUploadsCount { - if (!file || [self hasUploadedFile:file]) { + if (![self.currentState isEqualToString:SDLFileManagerStateReady]) { + SDLLogE(@"File named %@ failed to upload. The file manager has shutdown so the file will not be sent again.", file.name); + return NO; + } + + if (!file) { + SDLLogE(@"File named %@ can not be uploaded because it is not a valid file.", file.name); + return NO; + } + + if ([self hasUploadedFile:file]) { + SDLLogE(@"File named %@ has already been uploaded.", file.name); return NO; } + NSNumber *failedUploadCount = failedFileUploadsCount[file.name]; - return (failedUploadCount == nil) ? YES : (failedUploadCount.integerValue < maxUploadCount); + BOOL canFileBeUploadedAgain = (failedUploadCount == nil) ? YES : (failedUploadCount.integerValue < maxUploadCount); + if (!canFileBeUploadedAgain) { + SDLLogE(@"File named %@ failed to upload. Max number of upload attempts reached.", file.name); + } + + return canFileBeUploadedAgain; } /** diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m index afbd93873..c7dd86483 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m @@ -1,5 +1,6 @@ #import #import +#import #import "SDLDeleteFileResponse.h" #import "SDLError.h" @@ -14,6 +15,7 @@ #import "SDLPutFile.h" #import "SDLPutFileResponse.h" #import "SDLRPCResponse.h" +#import "SDLStateMachine.h" #import "TestConnectionManager.h" #import "TestMultipleFilesConnectionManager.h" #import "TestFileProgressResponse.h" @@ -31,6 +33,7 @@ @interface SDLFileManager () @property (strong, nonatomic) NSMutableDictionary *> *failedFileUploadsCount; @property (assign, nonatomic) UInt8 maxFileUploadAttempts; @property (assign, nonatomic) UInt8 maxArtworkUploadAttempts; +@property (strong, nonatomic) SDLStateMachine *stateMachine; - (BOOL)sdl_canFileBeUploadedAgain:(nullable SDLFile *)file maxUploadCount:(int)maxRetryCount failedFileUploadsCount:(NSMutableDictionary *> *)failedFileUploadsCount; + (NSMutableDictionary *> *)sdl_incrementFailedUploadCountForFileName:(SDLFileName *)fileName failedFileUploadsCount:(NSMutableDictionary *> *)failedFileUploadsCount; @@ -1675,12 +1678,33 @@ - (BOOL)sdl_canFileBeUploadedAgain:(nullable SDLFile *)file maxUploadCount:(int) describe(@"the file cannot be uploaded again", ^{ it(@"should not upload a file that is nil", ^{ + // Make sure we are in the ready state + testFileManager.stateMachine = OCMClassMock([SDLStateMachine class]); + OCMStub([testFileManager.stateMachine currentState]).andReturn(SDLFileManagerStateReady); + expect([testFileManager.currentState isEqualToEnum:SDLFileManagerStateReady]).to(beTrue()); + testFile = nil; BOOL canUploadAgain = [testFileManager sdl_canFileBeUploadedAgain:testFile maxUploadCount:5 failedFileUploadsCount:testFailedFileUploadsCount]; expect(canUploadAgain).to(equal(NO)); }); it(@"should not upload a file that has already been uploaded the max number of times", ^{ + // Make sure we are in the ready state + testFileManager.stateMachine = OCMClassMock([SDLStateMachine class]); + OCMStub([testFileManager.stateMachine currentState]).andReturn(SDLFileManagerStateReady); + expect([testFileManager.currentState isEqualToEnum:SDLFileManagerStateReady]).to(beTrue()); + + testFailedFileUploadsCount[testFileName] = @4; + BOOL canUploadAgain = [testFileManager sdl_canFileBeUploadedAgain:testFile maxUploadCount:4 failedFileUploadsCount:testFailedFileUploadsCount]; + expect(canUploadAgain).to(equal(NO)); + }); + + it(@"should not upload a file if the file manager is not in state ready", ^{ + // Make sure we are NOT in the ready state + testFileManager.stateMachine = OCMClassMock([SDLStateMachine class]); + OCMStub([testFileManager.stateMachine currentState]).andReturn(SDLFileManagerStateShutdown); + expect([testFileManager.currentState isEqualToEnum:SDLFileManagerStateShutdown]).to(beTrue()); + testFailedFileUploadsCount[testFileName] = @4; BOOL canUploadAgain = [testFileManager sdl_canFileBeUploadedAgain:testFile maxUploadCount:4 failedFileUploadsCount:testFailedFileUploadsCount]; expect(canUploadAgain).to(equal(NO)); @@ -1688,6 +1712,13 @@ - (BOOL)sdl_canFileBeUploadedAgain:(nullable SDLFile *)file maxUploadCount:(int) }); describe(@"the file can be uploaded again", ^{ + beforeEach(^{ + // Make sure we are in the ready state + testFileManager.stateMachine = OCMClassMock([SDLStateMachine class]); + OCMStub([testFileManager.stateMachine currentState]).andReturn(SDLFileManagerStateReady); + expect([testFileManager.currentState isEqualToEnum:SDLFileManagerStateReady]).to(beTrue()); + }); + it(@"should upload a file that has not yet failed to upload", ^{ testFailedFileUploadsCount = [NSMutableDictionary dictionary]; BOOL canUploadAgain = [testFileManager sdl_canFileBeUploadedAgain:testFile maxUploadCount:2 failedFileUploadsCount:testFailedFileUploadsCount]; From 3fce4d2ccd98ce1afc4476947aa756622f26f8dd Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 23 May 2019 16:24:08 -0400 Subject: [PATCH 094/179] Pass the capability instead of the manager into the callback * Add documentation --- SmartDeviceLink/SDLSystemCapabilityManager.h | 8 +++-- SmartDeviceLink/SDLSystemCapabilityManager.m | 23 ++++++------ SmartDeviceLink/SDLSystemCapabilityObserver.h | 36 +++++++++++++++---- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h index ea5e6764b..7d89cd677 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.h +++ b/SmartDeviceLink/SDLSystemCapabilityManager.h @@ -43,11 +43,13 @@ typedef void (^SDLUpdateCapabilityHandler)(NSError * _Nullable error, SDLSystemC /** An observer block whenever a subscription is called. - @param systemCapabilityManager This manager. The user of the handler can then use the manager to pull the newest data. + @param capability The capability that was updated. */ -typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapabilityManager *systemCapabilityManager); - +typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability); +/** + A manager that handles updating and subscribing to SDL capabilities. + */ @interface SDLSystemCapabilityManager : NSObject /** diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m index bf1f2b168..a7ffa785a 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.m +++ b/SmartDeviceLink/SDLSystemCapabilityManager.m @@ -289,27 +289,28 @@ - (void)sdl_sendGetSystemCapability:(SDLGetSystemCapability *)getSystemCapabilit */ - (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability completionHandler:(nullable SDLUpdateCapabilityHandler)handler { if ([self.lastReceivedCapability isEqual:systemCapability]) { - return [self sdl_callSaveHandlerForCapabilityType:systemCapability.systemCapabilityType andReturnWithValue:NO handler:handler]; + return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } self.lastReceivedCapability = systemCapability; SDLSystemCapabilityType systemCapabilityType = systemCapability.systemCapabilityType; if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypePhoneCall]) { - if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } + if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } self.phoneCapability = systemCapability.phoneCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeNavigation]) { - if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } + if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } self.navigationCapability = systemCapability.navigationCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeRemoteControl]) { - if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } + if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } self.remoteControlCapability = systemCapability.remoteControlCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming]) { - if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } + if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } self.videoStreamingCapability = systemCapability.videoStreamingCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeAppServices]) { - if ([self.appServicesCapabilities isEqual:systemCapability.appServicesCapabilities]) { return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:NO handler:handler]; } + if ([self.appServicesCapabilities isEqual:systemCapability.appServicesCapabilities]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } [self sdl_saveAppServicesCapabilitiesUpdate:systemCapability.appServicesCapabilities]; + systemCapability = [[SDLSystemCapability alloc] initWithAppServicesCapabilities:self.appServicesCapabilities]; } else { SDLLogW(@"Received response for unknown System Capability Type: %@", systemCapabilityType); return NO; @@ -317,13 +318,13 @@ - (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability complet SDLLogD(@"Updated system capability manager with new data: %@", systemCapability); - return [self sdl_callSaveHandlerForCapabilityType:systemCapabilityType andReturnWithValue:YES handler:handler]; + return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:YES handler:handler]; } -- (BOOL)sdl_callSaveHandlerForCapabilityType:(SDLSystemCapabilityType)type andReturnWithValue:(BOOL)value handler:(nullable SDLUpdateCapabilityHandler)handler { - for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[type]) { +- (BOOL)sdl_callSaveHandlerForCapability:(SDLSystemCapability *)capability andReturnWithValue:(BOOL)value handler:(nullable SDLUpdateCapabilityHandler)handler { + for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[capability.systemCapabilityType]) { if (observer.block != nil) { - observer.block(self); + observer.block(capability); } else { NSUInteger numberOfParametersInSelector = [NSStringFromSelector(observer.selector) componentsSeparatedByString:@":"].count - 1; #pragma clang diagnostic push @@ -334,7 +335,7 @@ - (BOOL)sdl_callSaveHandlerForCapabilityType:(SDLSystemCapabilityType)type andRe } } else if (numberOfParametersInSelector == 1) { if ([observer.observer respondsToSelector:observer.selector]) { - [observer.observer performSelector:observer.selector withObject:self]; + [observer.observer performSelector:observer.selector withObject:capability]; } } else { @throw [NSException sdl_invalidSelectorExceptionWithSelector:observer.selector]; diff --git a/SmartDeviceLink/SDLSystemCapabilityObserver.h b/SmartDeviceLink/SDLSystemCapabilityObserver.h index 79f8590c4..f5450d60e 100644 --- a/SmartDeviceLink/SDLSystemCapabilityObserver.h +++ b/SmartDeviceLink/SDLSystemCapabilityObserver.h @@ -8,24 +8,48 @@ #import -@class SDLSystemCapabilityManager; +@class SDLSystemCapability; NS_ASSUME_NONNULL_BEGIN -/** - An observer block whenever a subscription is called. +typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability); - @param systemCapabilityManager This manager. The user of the handler can then use the manager to pull the newest data. +/** + An observer object for SDLSystemCapabilityManager */ -typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapabilityManager *systemCapabilityManager); - @interface SDLSystemCapabilityObserver : NSObject +/** + The object that will be used to call the selector if available, and to unsubscribe this observer + */ @property (strong, nonatomic) id observer; + +/** + A selector called when the observer is triggered + */ @property (assign, nonatomic) SEL selector; + +/** + A block called when the observer is triggered + */ @property (copy, nonatomic) SDLCapabilityUpdateHandler block; +/** + Create an observer using an object and a selector on that object + + @param observer The object to be called when the subscription triggers + @param selector The selector to be called when the subscription triggers + @return The observer + */ - (instancetype)initWithObserver:(id)observer selector:(SEL)selector; + +/** + Create an observer using an object and a callback block + + @param observer The object that can be used to unsubscribe the block + @param block The block that will be called when the subscription triggers + @return The observer + */ - (instancetype)initWithObserver:(id)observer block:(SDLCapabilityUpdateHandler)block; @end From 7292417f285b42bcf62538f7bac4ca09e70e6ee1 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 23 May 2019 16:56:37 -0400 Subject: [PATCH 095/179] Fix an oversight --- Example Apps/Example ObjC/VehicleDataManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Example Apps/Example ObjC/VehicleDataManager.m b/Example Apps/Example ObjC/VehicleDataManager.m index 1ec3139f9..cc2ee46fa 100644 --- a/Example Apps/Example ObjC/VehicleDataManager.m +++ b/Example Apps/Example ObjC/VehicleDataManager.m @@ -111,7 +111,7 @@ - (void)vehicleDataNotification:(SDLRPCNotificationNotification *)notification { return; } - SDLOnVehicleData *onVehicleData = (SDLOnVehicleData *)notification; + SDLOnVehicleData *onVehicleData = (SDLOnVehicleData *)notification.notification; self.vehicleOdometerData = [NSString stringWithFormat:@"%@: %@ km", VehicleDataOdometerName, onVehicleData.odometer]; if (!self.refreshUIHandler) { return; } From 0002c558018390ef0ca8bbd5edc1cbab28af8306 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 24 May 2019 09:36:40 -0400 Subject: [PATCH 096/179] Update BiSON dependency to v1.2.0 --- SmartDeviceLink-iOS.podspec | 2 +- SmartDeviceLink.podspec | 2 +- bson_c_lib | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec index 96c419654..116bddd48 100644 --- a/SmartDeviceLink-iOS.podspec +++ b/SmartDeviceLink-iOS.podspec @@ -7,7 +7,7 @@ s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS" s.license = { :type => "New BSD", :file => "LICENSE" } s.author = { "SmartDeviceLink Team" => "developer@smartdevicelink.com" } s.platform = :ios, "8.0" -s.dependency 'BiSON', '~> 1.1.1' +s.dependency 'BiSON', '~> 1.2.0' s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :tag => s.version.to_s } s.requires_arc = true s.resource_bundles = { 'SmartDeviceLink' => ['SmartDeviceLink/Assets/**/*'] } diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec index ec64518c4..40acabfea 100644 --- a/SmartDeviceLink.podspec +++ b/SmartDeviceLink.podspec @@ -7,7 +7,7 @@ s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS" s.license = { :type => "New BSD", :file => "LICENSE" } s.author = { "SmartDeviceLink Team" => "developer@smartdevicelink.com" } s.platform = :ios, "8.0" -s.dependency 'BiSON', '~> 1.1.1' +s.dependency 'BiSON', '~> 1.2.0' s.source = { :git => "https://github.com/smartdevicelink/sdl_ios.git", :tag => s.version.to_s } s.requires_arc = true s.swift_version = '4.2' diff --git a/bson_c_lib b/bson_c_lib index 82f9e9dcb..5e79ef239 160000 --- a/bson_c_lib +++ b/bson_c_lib @@ -1 +1 @@ -Subproject commit 82f9e9dcb1f49811ec678a6d19d4f90da831ac0f +Subproject commit 5e79ef239b88246504ca8efa017479bf417c5164 From 12c0f925aba41db4377c383390adf390ecf2fb86 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 28 May 2019 09:42:43 -0400 Subject: [PATCH 097/179] added a flag to turn dynamic updates on or off, updated unit tests --- SmartDeviceLink/SDLMenuManager.h | 2 + SmartDeviceLink/SDLMenuManager.m | 99 +++++--- SmartDeviceLink/SDLScreenManager.h | 27 +++ SmartDeviceLink/SDLScreenManager.m | 5 +- .../DevAPISpecs/SDLMenuManagerSpec.m | 214 +++++++++++++++++- 5 files changed, 313 insertions(+), 34 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.h b/SmartDeviceLink/SDLMenuManager.h index cd3ead610..0671b8524 100644 --- a/SmartDeviceLink/SDLMenuManager.h +++ b/SmartDeviceLink/SDLMenuManager.h @@ -7,6 +7,7 @@ // #import +#import "SDLScreenManager.h" @class SDLFileManager; @class SDLMenuCell; @@ -34,6 +35,7 @@ typedef void(^SDLMenuUpdateCompletionHandler)(NSError *__nullable error); @property (copy, nonatomic) NSArray *menuCells; +@property (assign, nonatomic) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index fb73ca11c..b86df4612 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -30,6 +30,7 @@ #import "SDLRPCNotificationNotification.h" #import "SDLRPCResponseNotification.h" #import "SDLSetDisplayLayoutResponse.h" +#import "SDLScreenManager.h" #import "SDLVoiceCommand.h" NS_ASSUME_NONNULL_BEGIN @@ -72,6 +73,7 @@ - (instancetype)init { _lastMenuId = MenuCellIdMin; _menuCells = @[]; _oldMenuCells = @[]; + _dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeOnWithCompatibility; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_registerResponse:) name:SDLDidReceiveRegisterAppInterfaceResponse object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_displayLayoutResponse:) name:SDLDidReceiveSetDisplayLayoutResponse object:nil]; @@ -107,6 +109,9 @@ - (void)stop { } #pragma mark - Setters +- (void)setDynamicMenuUpdatesMode:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { + _dynamicMenuUpdatesMode = dynamicMenuUpdatesMode; +} - (void)setMenuCells:(NSArray *)menuCells { if (self.currentHMILevel == nil @@ -144,47 +149,66 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; - // RunScore will contain the best possible combination of ADD and Delete Commmands. There will be 2 arrays, OldCell(Deletes/Keeps) NewCells(Adds/Keeps), - // When the Adds and Deletes are removed from their respetive arrays the KEEPS should match at index in both arrays. - _runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; + if([self checkUpdateMode: self.dynamicMenuUpdatesMode]) { + // RunScore will contain the best possible combination of ADDS, DELETES and KEEPS. oldStatus(Deletes/Keeps) updatedStatus(Adds/Keeps), + _runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; - // Here we create a temproaray array to store the values from the RunScore object. At this point the arrays with both contain Keeps. - NSArray *deleteMenuStatus = self.runScore.oldStatus; - NSArray *addMenuStatus = self.runScore.updatedStatus; + NSArray *deleteMenuStatus = self.runScore.oldStatus; + NSArray *addMenuStatus = self.runScore.updatedStatus; - // These arrays will now contain only Deletes or only Adds - NSArray *cellsToDelete = [self buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; + NSArray *cellsToDelete = [self buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; - // These arrays will only contain Keeps. We wil use this araay to compare submenus after we finish building the main menu - NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; + // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares + NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; - // Since we may be adding cells to the list we need to update those cells to have a cellID - [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; + // Since we may be adding cells to the list we need to update those cells to have a cellID + [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; - // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. - [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; + // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. + [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; - // Upload the artworks - NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; - if (artworksToBeUploaded.count > 0) { - [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { - if (error != nil) { - SDLLogE(@"Error uploading menu artworks: %@", error); - } - SDLLogD(@"Menu artworks uploaded"); - [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:nil]; + // Upload the artworks + NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; + if (artworksToBeUploaded.count > 0) { + [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { + if (error != nil) { + SDLLogE(@"Error uploading menu artworks: %@", error); + } + SDLLogD(@"Menu artworks uploaded"); + __weak typeof(self) weakself = self; + [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { + [weakself sendSubMenuUpdates:oldKeeps newKeepCell:newKeeps atIndex:0]; + }]; + }]; + } + + __weak typeof(self) weakself = self; + [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { + [weakself sendSubMenuUpdates:oldKeeps newKeepCell:newKeeps atIndex:0]; }]; - } + } else { + self.lastMenuId = MenuCellIdMin; + [self sdl_updateIdsOnMenuCells:menuCells parentId:ParentIdNotFound]; + + NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; + if (artworksToBeUploaded.count > 0) { + [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { + if (error != nil) { + SDLLogE(@"Error uploading menu artworks: %@", error); + } - __weak typeof(self) weakself = self; - [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { - [weakself sendSubMenuUpdates:oldKeeps newKeepCell:newKeeps atIndex:0]; - }]; + SDLLogD(@"Menu artworks uploaded"); + [self sdl_updateCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells withCompletionHandler:nil]; + }]; + } + [self sdl_updateCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells withCompletionHandler:nil]; + } } #pragma mark - Build Deletes, Keeps, Adds + - (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { if(oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) { self.inProgressUpdate = nil; @@ -275,7 +299,6 @@ - (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCell #pragma mark - Updating System - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells withCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { - //create funtion to do this for subcells so we can use proper call backs. if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone] || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) { @@ -384,6 +407,20 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSA #pragma mark - Helpers +- (BOOL)checkUpdateMode:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { + switch (dynamicMenuUpdatesMode) { + case SDLDynamicMenuUpdatesModeForceOn: + return true; + break; + case SDLDynamicMenuUpdatesModeForceOff: + return false; + break; + case SDLDynamicMenuUpdatesModeOnWithCompatibility: + return [self.displayCapabilities.displayName isEqualToString:@"GEN3_8_INCH"] ? false : true; + break; + } +} + #pragma mark Artworks - (NSArray *)sdl_findAllArtworksToBeUploadedFromCells:(NSArray *)cells { diff --git a/SmartDeviceLink/SDLScreenManager.h b/SmartDeviceLink/SDLScreenManager.h index 34764b05d..8eae28f71 100644 --- a/SmartDeviceLink/SDLScreenManager.h +++ b/SmartDeviceLink/SDLScreenManager.h @@ -27,6 +27,28 @@ NS_ASSUME_NONNULL_BEGIN +typedef enum { + /** + * FORCE_ON: Forces on compatibility mode. This will force the menu manager to delete and re-add + * each menu item for every menu update. This mode is generally not advised due to performance issues. + */ + SDLDynamicMenuUpdatesModeForceOn = 0, + + /** + * FORCE_OFF: This mode forces the menu manager to always dynamically update menu items for each menu + * update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units. + */ + SDLDynamicMenuUpdatesModeForceOff = 1, + + /** + * ON_WITH_COMPAT_MODE: This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known + * menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update + * the menus. + */ + SDLDynamicMenuUpdatesModeOnWithCompatibility = 2 + +} SDLDynamicMenuUpdatesMode; + /** The handler run when the update has completed @@ -119,6 +141,11 @@ typedef void(^SDLPreloadChoiceCompletionHandler)(NSError *__nullable error); */ @property (copy, nonatomic) NSArray *menu; +/** + The current status for dynamic menu updates. + */ +@property (nonatomic, assign) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; + /** The current list of voice commands available for the user to speak and be recognized by the IVI's voice recognition engine. */ diff --git a/SmartDeviceLink/SDLScreenManager.m b/SmartDeviceLink/SDLScreenManager.m index bfd8c9b71..8fd29c05a 100644 --- a/SmartDeviceLink/SDLScreenManager.m +++ b/SmartDeviceLink/SDLScreenManager.m @@ -7,7 +7,6 @@ // #import "SDLScreenManager.h" - #import "SDLArtwork.h" #import "SDLChoiceSetManager.h" #import "SDLMenuManager.h" @@ -143,6 +142,10 @@ - (void)setKeyboardConfiguration:(nullable SDLKeyboardProperties *)keyboardConfi self.choiceSetManager.keyboardConfiguration = keyboardConfiguration; } +- (void)setDynamicMenuUpdatesMode:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { + self.menuManager.dynamicMenuUpdatesMode = dynamicMenuUpdatesMode; +} + #pragma mark - Getters - (nullable NSString *)textField1 { diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index 9eb966520..f5b3ce83a 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -5,6 +5,7 @@ #import "SDLAddCommand.h" #import "SDLAddSubMenu.h" #import "SDLDeleteCommand.h" +#import "SDLDeleteSubMenu.h" #import "SDLDisplayCapabilities.h" #import "SDLFileManager.h" #import "SDLHMILevel.h" @@ -17,6 +18,7 @@ #import "SDLOnHMIStatus.h" #import "SDLRPCNotificationNotification.h" #import "SDLSystemContext.h" +#import "SDLScreenManager.h" #import "TestConnectionManager.h" @interface SDLMenuCell() @@ -56,6 +58,7 @@ @interface SDLMenuManager() __block SDLArtwork *testArtwork2 = nil; __block SDLMenuCell *textOnlyCell = nil; + __block SDLMenuCell *textOnlyCell2 = nil; __block SDLMenuCell *textAndImageCell = nil; __block SDLMenuCell *submenuCell = nil; __block SDLMenuCell *submenuImageCell = nil; @@ -68,6 +71,8 @@ @interface SDLMenuManager() textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" icon:testArtwork voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" icon:nil subCells:@[textOnlyCell, textAndImageCell]]; submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 4" icon:testArtwork2 subCells:@[textOnlyCell]]; + textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" icon:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + mockConnectionManager = [[TestConnectionManager alloc] init]; mockFileManager = OCMClassMock([SDLFileManager class]); @@ -257,17 +262,131 @@ @interface SDLMenuManager() }); }); - describe(@"updating when a menu already exists", ^{ + describe(@"updating when a menu already exists with dynamic updates on", ^{ beforeEach(^{ + testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOn; + }); + + it(@"should send deletes first", ^{ testManager.menuCells = @[textOnlyCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Adds [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Submenu testManager.menuCells = @[textAndImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Deletes + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + expect(deletes).to(haveCount(1)); + expect(adds).to(haveCount(2)); + }); + + it(@"should send dynamic deletes first then dynamic adds case 2", ^{ + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textAndImageCell, submenuCell, submenuImageCell, textOnlyCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; + NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + + expect(deletes).to(haveCount(1)); + expect(adds).to(haveCount(6)); + expect(submenu).to(haveCount(2)); + }); + + it(@"should send dynamic deletes first then dynamic adds case 3", ^{ + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]]; + NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; + NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + + expect(deletes).to(haveCount(0)); + expect(subDeletes).to(haveCount(1)); + expect(adds).to(haveCount(5)); + expect(submenu).to(haveCount(2)); + }); + + it(@"should send dynamic deletes first then dynamic adds case 4", ^{ + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell, textOnlyCell2]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; + NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + + expect(deletes).to(haveCount(0)); + expect(adds).to(haveCount(6)); + expect(submenu).to(haveCount(2)); + }); + + it(@"should send dynamic deletes first then dynamic adds case 5", ^{ + testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + expect(deletes).to(haveCount(0)); + expect(adds).to(haveCount(3)); + }); + }); + + describe(@"updating when a menu already exists with dynamic updates off", ^{ + beforeEach(^{ + testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOff; }); it(@"should send deletes first", ^{ + testManager.menuCells = @[textOnlyCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Adds + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Submenu + + testManager.menuCells = @[textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -277,6 +396,97 @@ @interface SDLMenuManager() expect(deletes).to(haveCount(1)); expect(adds).to(haveCount(2)); }); + + it(@"should deletes first case 2", ^{ + testManager.menuCells = @[textOnlyCell, textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textAndImageCell, textOnlyCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + expect(deletes).to(haveCount(2)); + expect(adds).to(haveCount(4)); + }); + + it(@"should send deletes first case 3", ^{ + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]]; + NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; + NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + + expect(deletes).to(haveCount(2)); + expect(subDeletes).to(haveCount(2)); + expect(adds).to(haveCount(9)); + expect(submenu).to(haveCount(3)); + }); + + it(@"should send deletes first case 4", ^{ + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, textOnlyCell2]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; + NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + + NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]]; + NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate]; + + expect(deletes).to(haveCount(2)); + expect(adds).to(haveCount(9)); + expect(submenu).to(haveCount(2)); + expect(subDeletes).to(haveCount(1)); + }); + + it(@"should deletes first case 5", ^{ + testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + expect(deletes).to(haveCount(3)); + expect(adds).to(haveCount(6)); + }); }); }); From eb51c542aefdf43512cf3cecd5138e5dc20b8988 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 28 May 2019 10:24:37 -0400 Subject: [PATCH 098/179] fixed pr issue --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 590aaee44..5d8f0c602 100644 --- a/Package.swift +++ b/Package.swift @@ -2,7 +2,7 @@ import PackageDescription let package = Package( - name: "SmartDeviceLink-iOS", + name: "SmartDeviceLink", products: [ .library(name: "SmartDeviceLink", targets: ["SmartDeviceLink"]), .library(name: "SmartDeviceLinkSwift", targets: ["SmartDeviceLinkSwift"]) From 1e7b634babd4d69e4319d0098bda7a0f1bedfd5b Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 28 May 2019 14:06:05 -0400 Subject: [PATCH 099/179] Fixed SDL log statements --- SmartDeviceLink/SDLFileManager.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLFileManager.m b/SmartDeviceLink/SDLFileManager.m index 60b6192d0..eef7e92ac 100644 --- a/SmartDeviceLink/SDLFileManager.m +++ b/SmartDeviceLink/SDLFileManager.m @@ -525,17 +525,17 @@ - (float)sdl_uploadPercentage:(float)totalBytes uploadedBytes:(float)uploadedByt */ - (BOOL)sdl_canFileBeUploadedAgain:(nullable SDLFile *)file maxUploadCount:(UInt8)maxUploadCount failedFileUploadsCount:(NSMutableDictionary *> *)failedFileUploadsCount { if (![self.currentState isEqualToString:SDLFileManagerStateReady]) { - SDLLogE(@"File named %@ failed to upload. The file manager has shutdown so the file will not be sent again.", file.name); + SDLLogW(@"File named %@ failed to upload. The file manager has shutdown so the file upload will not retry.", file.name); return NO; } if (!file) { - SDLLogE(@"File named %@ can not be uploaded because it is not a valid file.", file.name); + SDLLogE(@"File can not be uploaded because it is not a valid file."); return NO; } if ([self hasUploadedFile:file]) { - SDLLogE(@"File named %@ has already been uploaded.", file.name); + SDLLogD(@"File named %@ has already been uploaded.", file.name); return NO; } From e767e9cdae509ba7143fe7bc04b2cbe820ada860 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 28 May 2019 17:30:40 -0400 Subject: [PATCH 100/179] Fix tests --- SmartDeviceLink/SDLSystemCapabilityManager.h | 7 ++++++- SmartDeviceLink/SDLSystemCapabilityManager.m | 15 +++++++-------- .../DevAPISpecs/TestSystemCapabilityObserver.h | 2 ++ .../SDLSystemCapabilityManagerSpec.m | 5 +++-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h index 7d89cd677..38030365a 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.h +++ b/SmartDeviceLink/SDLSystemCapabilityManager.h @@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN typedef void (^SDLUpdateCapabilityHandler)(NSError * _Nullable error, SDLSystemCapabilityManager *systemCapabilityManager); /** - An observer block whenever a subscription is called. + An observer block for whenever a subscription is called. @param capability The capability that was updated. */ @@ -52,6 +52,11 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability); */ @interface SDLSystemCapabilityManager : NSObject +/** + YES if subscriptions are available on the connected head unit. If NO, calls to `subscribeToCapabilityType:withBlock` and `subscribeToCapabilityType:withObserver:selector` will fail. + */ +@property (assign, nonatomic, readonly) BOOL supportsSubscriptions; + /** * @see SDLDisplayCapabilities * diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m index a7ffa785a..82d7c8c82 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.m +++ b/SmartDeviceLink/SDLSystemCapabilityManager.m @@ -60,7 +60,7 @@ @interface SDLSystemCapabilityManager () @property (nullable, strong, nonatomic) NSMutableDictionary *appServicesCapabilitiesDictionary; -@property (assign, nonatomic) BOOL supportsObservers; +@property (assign, nonatomic, readwrite) BOOL supportsSubscriptions; @property (strong, nonatomic) NSMutableDictionary *> *capabilityObservers; @property (nullable, strong, nonatomic) SDLSystemCapability *lastReceivedCapability; @@ -97,7 +97,7 @@ - (void)start { SDLVersion *onSystemCapabilityNotificationRPCVersion = [SDLVersion versionWithString:@"5.1.0"]; SDLVersion *headUnitRPCVersion = SDLGlobals.sharedGlobals.rpcVersion; if ([headUnitRPCVersion isGreaterThanOrEqualToVersion:onSystemCapabilityNotificationRPCVersion]) { - _supportsObservers = YES; + _supportsSubscriptions = YES; } } @@ -123,7 +123,7 @@ - (void)stop { _remoteControlCapability = nil; _appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary]; - _supportsObservers = NO; + _supportsSubscriptions = NO; for (SDLSystemCapabilityType capabilityType in [self.class sdl_systemCapabilityTypes]) { _capabilityObservers[capabilityType] = [NSMutableArray array]; } @@ -227,7 +227,7 @@ - (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification #pragma mark - System Capabilities - (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SDLUpdateCapabilityHandler)handler { - if (self.supportsObservers) { + if (self.supportsSubscriptions) { // Just return the cached data because we get `onSystemCapability` callbacks handler(nil, self); } else { @@ -252,7 +252,7 @@ - (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SD - (void)sdl_subscribeToSystemCapabilityUpdates { for (SDLSystemCapabilityType type in [self.class sdl_systemCapabilityTypes]) { SDLGetSystemCapability *getSystemCapability = [[SDLGetSystemCapability alloc] initWithType:type]; - if (self.supportsObservers) { + if (self.supportsSubscriptions) { getSystemCapability.subscribe = @YES; } @@ -308,7 +308,6 @@ - (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability complet if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } self.videoStreamingCapability = systemCapability.videoStreamingCapability; } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeAppServices]) { - if ([self.appServicesCapabilities isEqual:systemCapability.appServicesCapabilities]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; } [self sdl_saveAppServicesCapabilitiesUpdate:systemCapability.appServicesCapabilities]; systemCapability = [[SDLSystemCapability alloc] initWithAppServicesCapabilities:self.appServicesCapabilities]; } else { @@ -367,7 +366,7 @@ - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newC #pragma mark - Subscriptions - (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block { - if (!self.supportsObservers) { return nil; } + if (!self.supportsSubscriptions) { return nil; } SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] block:block]; [self.capabilityObservers[type] addObject:observerObject]; @@ -376,7 +375,7 @@ - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newC } - (BOOL)subscribeToCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer selector:(SEL)selector { - if (!self.supportsObservers) { return NO; } + if (!self.supportsSubscriptions) { return NO; } NSUInteger numberOfParametersInSelector = [NSStringFromSelector(selector) componentsSeparatedByString:@":"].count - 1; if (numberOfParametersInSelector > 1) { return NO; } diff --git a/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h b/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h index f6350db05..0e6c8bcbb 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h +++ b/SmartDeviceLinkTests/DevAPISpecs/TestSystemCapabilityObserver.h @@ -8,6 +8,8 @@ #import +@class SDLSystemCapabilityManager; + NS_ASSUME_NONNULL_BEGIN @interface TestSystemCapabilityObserver : NSObject diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m index bc411fc51..e8d81827b 100644 --- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m +++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m @@ -29,6 +29,7 @@ #import "SDLSystemCapabilityManager.h" #import "SDLVideoStreamingCapability.h" #import "TestConnectionManager.h" +#import "TestSystemCapabilityObserver.h" @interface SDLSystemCapabilityManager () @@ -397,7 +398,7 @@ @interface SDLSystemCapabilityManager () __block id blockObserver = nil; beforeEach(^{ - blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) { + blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapability * _Nonnull systemCapability) { blockObserverTriggeredCount++; }]; @@ -438,7 +439,7 @@ @interface SDLSystemCapabilityManager () __block id blockObserver = nil; beforeEach(^{ - blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) { + blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapability * _Nonnull systemCapability) { blockObserverTriggeredCount++; }]; From 3b237aba6cbce79006b8e6d9d156fd5ed2dbcc3c Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 28 May 2019 17:34:30 -0400 Subject: [PATCH 101/179] More test fixes --- SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m index e8d81827b..4fc9a6547 100644 --- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m +++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m @@ -34,7 +34,7 @@ @interface SDLSystemCapabilityManager () -@property (assign, nonatomic) BOOL supportsObservers; +@property (assign, nonatomic, readwrite) BOOL supportsSubscriptions; @end @@ -372,7 +372,7 @@ @interface SDLSystemCapabilityManager () beforeEach(^{ blockObserverTriggeredCount = 0; - testSystemCapabilityManager.supportsObservers = YES; + testSystemCapabilityManager.supportsSubscriptions = YES; phoneObserver = [[TestSystemCapabilityObserver alloc] init]; [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:phoneObserver selector:@selector(capabilityUpdatedWithNotification:)]; @@ -384,7 +384,7 @@ @interface SDLSystemCapabilityManager () __block BOOL observationSuccess = NO; beforeEach(^{ - testSystemCapabilityManager.supportsObservers = NO; + testSystemCapabilityManager.supportsSubscriptions = NO; observationSuccess = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall withObserver:phoneObserver selector:@selector(capabilityUpdatedWithNotification:)]; }); From 200d5b1fccc75d23119ad9900d2c7140ba2730f7 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 10:06:23 -0400 Subject: [PATCH 102/179] Cleaned up destroying the session Added closeSession to the IAPSession parent class --- SmartDeviceLink/SDLIAPControlSession.m | 4 ++-- SmartDeviceLink/SDLIAPDataSession.m | 8 ++++---- SmartDeviceLink/SDLIAPSession.h | 5 +++++ SmartDeviceLink/SDLIAPSession.m | 17 ++++++++++++----- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 1309f7288..fb831ebe9 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -33,11 +33,11 @@ @interface SDLIAPSession (exposeIAPSessionPrivateMethods) @property (nonatomic, assign) BOOL isInputStreamOpen; @property (nonatomic, assign) BOOL isOutputStreamOpen; -@property (nullable, strong, nonatomic) EASession *eaSession; - (BOOL)start; - (void)startStream:(NSStream *)stream; - (void)stopStream:(NSStream *)stream; +- (void)closeSession; @end @@ -102,7 +102,7 @@ - (void)sdl_stop { [super stopStream:self.eaSession.outputStream]; [super stopStream:self.eaSession.inputStream]; - self.eaSession = nil; + [super closeSession]; } - (void)destroySession { diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index ac0225875..2fdeb1c17 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -34,11 +34,11 @@ @interface SDLIAPSession (exposeIAPSessionPrivateMethods) @property (nonatomic, assign) BOOL isInputStreamOpen; @property (nonatomic, assign) BOOL isOutputStreamOpen; -@property (nullable, strong, nonatomic) EASession *eaSession; - (BOOL)start; - (void)startStream:(NSStream *)stream; - (void)stopStream:(NSStream *)stream; +- (void)closeSession; @end @@ -93,7 +93,7 @@ - (void)sdl_stop { if (self.ioStreamThread == nil) { SDLLogV(@"Stopping data session but no thread established."); - self.eaSession = nil; + [super closeSession]; return; } @@ -105,7 +105,7 @@ - (void)sdl_stop { SDLLogE(@"Destroying thread (IOStreamThread) for data session when I/O streams have not yet closed."); } self.ioStreamThread = nil; - self.eaSession = nil; + [super closeSession]; }]; } @@ -344,7 +344,7 @@ - (void)sdl_accessoryEventLoop { // Must be called on accessoryEventLoop. - (void)sdl_closeSession { - if (!self.eaSession) { + if (self.eaSession == nil) { return; } diff --git a/SmartDeviceLink/SDLIAPSession.h b/SmartDeviceLink/SDLIAPSession.h index bd4dab8bf..0f0be80c8 100644 --- a/SmartDeviceLink/SDLIAPSession.h +++ b/SmartDeviceLink/SDLIAPSession.h @@ -16,6 +16,11 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nullable, strong, nonatomic, readonly) EAAccessory *accessory; +/** + * The session created between the app and the accessory. + */ +@property (nullable, strong, nonatomic, readonly) EASession *eaSession; + /** * The unique protocol string used to create the session with the accessory. */ diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 3e2608f1d..15c7a1b4a 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -20,11 +20,7 @@ @interface SDLIAPSession () */ @property (nonatomic, assign) BOOL isOutputStreamOpen; -/** - * The session created between the app and the accessory. - */ -@property (nullable, strong, nonatomic) EASession *eaSession; - +@property (nullable, strong, nonatomic, readwrite) EASession *eaSession; @property (nullable, strong, nonatomic, readwrite) EAAccessory *accessory; @property (nullable, strong, nonatomic, readwrite) NSString *protocolString; @@ -92,6 +88,17 @@ - (void)stopStream:(NSStream *)stream { } } +- (void)closeSession { + if (self.eaSession == nil) { + SDLLogD(@"Attempting to close session with accessory: %@, but it is already closed", self.accessory.name); + return; + } + + self.eaSession = nil; + SDLLogD(@"Session closed for: %@", self.accessory.serialNumber); + self.accessory.delegate = nil; +} + #pragma mark - Getters - (BOOL)isStopped { From a730f9a8c963010bf64794fae937096470df480b Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 10:15:06 -0400 Subject: [PATCH 103/179] Added test cases for SDLIAPConstants class --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 4 +++ SmartDeviceLink/SDLIAPConstants.h | 2 -- .../TransportSpecs/iAP/SDLIAPConstantsSpec.m | 25 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPConstantsSpec.m diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 783f50ad5..df6c7fdf5 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1378,6 +1378,7 @@ 88D5EB37220CD95000EC3782 /* SDLWeatherServiceData.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D5EB35220CD95000EC3782 /* SDLWeatherServiceData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 88D5EB38220CD95000EC3782 /* SDLWeatherServiceData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88D5EB36220CD95000EC3782 /* SDLWeatherServiceData.m */; }; 88D99DB52289C82F0039E047 /* SDLIAPControlSessionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */; }; + 88DDD0F9229ECA57002F9623 /* SDLIAPConstantsSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DDD0F8229ECA57002F9623 /* SDLIAPConstantsSpec.m */; }; 88DF998D22035CC600477AC1 /* EAAccessory+OCMock.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */; }; 88DF998F22035D1700477AC1 /* SDLIAPSessionSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */; }; 88DF999122035D5A00477AC1 /* SDLIAPTransportSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */; }; @@ -3015,6 +3016,7 @@ 88D6F17D22319FE000D4BFB3 /* SDLRPCRequestNotification.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLRPCRequestNotification.m; sourceTree = ""; }; 88D6F17E22319FE000D4BFB3 /* SDLRPCRequestNotification.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLRPCRequestNotification.h; sourceTree = ""; }; 88D99DB42289BFBE0039E047 /* SDLIAPControlSessionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLIAPControlSessionDelegate.h; sourceTree = ""; }; + 88DDD0F8229ECA57002F9623 /* SDLIAPConstantsSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPConstantsSpec.m; sourceTree = ""; }; 88DF998C22035CC600477AC1 /* EAAccessory+OCMock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "EAAccessory+OCMock.m"; sourceTree = ""; }; 88DF998E22035D1700477AC1 /* SDLIAPSessionSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPSessionSpec.m; sourceTree = ""; }; 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLIAPTransportSpec.m; sourceTree = ""; }; @@ -5977,6 +5979,7 @@ 88DF999022035D5A00477AC1 /* SDLIAPTransportSpec.m */, 88BCEA942266592D00BB7E70 /* SDLIAPControlSessionSpec.m */, 88F37A4C226F84BE00DF119B /* SDLIAPDataSessionSpec.m */, + 88DDD0F8229ECA57002F9623 /* SDLIAPConstantsSpec.m */, ); path = iAP; sourceTree = ""; @@ -7548,6 +7551,7 @@ 5DE372A41ACB336600849FAA /* SDLHMICapabilitiesSpec.m in Sources */, 5DA150D32273676A0032928D /* SDLSoftButtonReplaceOperationSpec.m in Sources */, 162E82F71A9BDE8B00906325 /* SDLResultSpec.m in Sources */, + 88DDD0F9229ECA57002F9623 /* SDLIAPConstantsSpec.m in Sources */, 1680B1141A9CD7AD00DBD79E /* SDLV1ProtocolHeaderSpec.m in Sources */, 880D2680220E038800B3F496 /* SDLWeatherServiceManifestSpec.m in Sources */, 88EEC5BE220A3B8B005AA2F9 /* SDLPublishAppServiceResponseSpec.m in Sources */, diff --git a/SmartDeviceLink/SDLIAPConstants.h b/SmartDeviceLink/SDLIAPConstants.h index 54c5d9eae..0f72f93fd 100644 --- a/SmartDeviceLink/SDLIAPConstants.h +++ b/SmartDeviceLink/SDLIAPConstants.h @@ -12,5 +12,3 @@ extern NSString *const ControlProtocolString; extern NSString *const IndexedProtocolStringPrefix; extern NSString *const LegacyProtocolString; extern NSString *const MultiSessionProtocolString; - - diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPConstantsSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPConstantsSpec.m new file mode 100644 index 000000000..b9fe49b1b --- /dev/null +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPConstantsSpec.m @@ -0,0 +1,25 @@ +// +// SDLIAPConstantsSpec.m +// SmartDeviceLinkTests +// +// Created by Nicole on 5/29/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import +#import + +#import "SDLIAPConstants.h" + +QuickSpecBegin(SDLIAPConstantsSpec) + +describe(@"SDLIAPConstants", ^{ + it(@"Should return the correct protocol string", ^ { + expect(ControlProtocolString).to(match(@"com.smartdevicelink.prot0")); + expect(IndexedProtocolStringPrefix).to(match(@"com.smartdevicelink.prot")); + expect(LegacyProtocolString).to(match(@"com.ford.sync.prot0")); + expect(MultiSessionProtocolString).to(match(@"com.smartdevicelink.multisession")); + }); +}); + +QuickSpecEnd From 107a28b1ad65f171b0dd258b3c160098734fdd30 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 10:35:29 -0400 Subject: [PATCH 104/179] Renamed methods to indicate they are private Renamed the methods called on a NSStreamEvent to indicate they are private. --- SmartDeviceLink/SDLIAPControlSession.m | 22 +++++++++++------- SmartDeviceLink/SDLIAPDataSession.m | 31 +++++++++++++++++--------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index fb831ebe9..84ef38748 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -125,22 +125,28 @@ - (void)sdl_startSessionTimer { #pragma mark - NSStreamDelegate +/** + * Handles events on the input/output streams of the open session. + * + * @param stream The stream (either input or output) that the event occured on + * @param eventCode The stream event code + */ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { switch (eventCode) { case NSStreamEventOpenCompleted: { - [self streamDidOpen:stream]; + [self sdl_streamDidOpen:stream]; break; } case NSStreamEventHasBytesAvailable: { - [self streamHasBytesAvailable:(NSInputStream *)stream]; + [self sdl_streamHasBytesAvailable:(NSInputStream *)stream]; break; } case NSStreamEventErrorOccurred: { - [self streamDidError:stream]; + [self sdl_streamDidError:stream]; break; } case NSStreamEventEndEncountered: { - [self streamDidEnd:stream]; + [self sdl_streamDidEnd:stream]; break; } case NSStreamEventNone: @@ -156,7 +162,7 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { * * @param stream The stream that got the event code. */ -- (void)streamDidOpen:(NSStream *)stream { +- (void)sdl_streamDidOpen:(NSStream *)stream { if (stream == [self.eaSession outputStream]) { SDLLogD(@"Control session output stream opened"); self.isOutputStreamOpen = YES; @@ -175,7 +181,7 @@ - (void)streamDidOpen:(NSStream *)stream { /** * Called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. */ -- (void)streamDidEnd:(NSStream *)stream { +- (void)sdl_streamDidEnd:(NSStream *)stream { SDLLogD(@"Control stream ended"); // End events come in pairs, only perform this once per set. @@ -189,7 +195,7 @@ - (void)streamDidEnd:(NSStream *)stream { /** * Called when the session gets a `NSStreamEventHasBytesAvailable` event code. A protocol string is created from the received data. Since a new session needs to be established with the protocol string, the current session is closed and a new session is created. */ -- (void)streamHasBytesAvailable:(NSInputStream *)inputStream { +- (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream { SDLLogV(@"Control stream received data"); // Read in the stream a single byte at a time @@ -218,7 +224,7 @@ - (void)streamHasBytesAvailable:(NSInputStream *)inputStream { /** * Called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. */ -- (void)streamDidError:(NSStream *)stream { +- (void)sdl_streamDidError:(NSStream *)stream { SDLLogE(@"Control stream error"); [self.protocolIndexTimer cancel]; diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 2fdeb1c17..83ceca530 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -191,26 +191,32 @@ - (void)sdl_handleOutputStreamWriteError:(NSError *)error { #pragma mark - NSStreamDelegate +/** + * Handles events on the input/output streams of the open session. + * + * @param stream The stream (either input or output) that the event occured on + * @param eventCode The stream event code + */ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { switch (eventCode) { case NSStreamEventOpenCompleted: { - [self streamDidOpen:stream]; + [self sdl_streamDidOpen:stream]; break; } case NSStreamEventHasBytesAvailable: { - [self streamHasBytesAvailable:(NSInputStream *)stream]; + [self sdl_streamHasBytesAvailable:(NSInputStream *)stream]; break; } case NSStreamEventHasSpaceAvailable: { - [self streamHasSpaceToWrite:(NSOutputStream *)stream]; + [self sdl_streamHasSpaceToWrite]; break; } case NSStreamEventErrorOccurred: { - [self streamDidError:stream]; + [self sdl_streamDidError:stream]; break; } case NSStreamEventEndEncountered: { - [self streamDidEnd:stream]; + [self sdl_streamDidEnd:stream]; break; } case NSStreamEventNone: @@ -225,7 +231,7 @@ - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { * * @param stream The stream that got the event code. */ -- (void)streamDidOpen:(NSStream *)stream { +- (void)sdl_streamDidOpen:(NSStream *)stream { if (stream == [self.eaSession outputStream]) { SDLLogD(@"Data session output stream opened"); self.isOutputStreamOpen = YES; @@ -245,7 +251,7 @@ - (void)streamDidOpen:(NSStream *)stream { /** * Called when the session gets a `NSStreamEventEndEncountered` event code. The current session is closed and a new session is attempted. */ -- (void)streamDidEnd:(NSStream *)stream { +- (void)sdl_streamDidEnd:(NSStream *)stream { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); SDLLogD(@"Data stream ended"); @@ -268,7 +274,7 @@ - (void)streamDidEnd:(NSStream *)stream { /** * Called when the session gets a `NSStreamEventHasBytesAvailable` event code. The data is passed to the listener. */ -- (void)streamHasBytesAvailable:(NSInputStream *)inputStream { +- (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); uint8_t buf[[[SDLGlobals sharedGlobals] mtuSizeForServiceType:SDLServiceTypeRPC]]; while (inputStream.streamStatus == NSStreamStatusOpen && inputStream.hasBytesAvailable) { @@ -291,17 +297,20 @@ - (void)streamHasBytesAvailable:(NSInputStream *)inputStream { } } -- (void)streamHasSpaceToWrite:(NSOutputStream *)outputStream { +/** + * Called when the session gets a `NSStreamEventHasSpaceAvailable` event code. Send any queued data to Core. + */ +- (void)sdl_streamHasSpaceToWrite { [self sdl_dequeueAndWriteToOutputStream]; } /** * Called when the session gets a `NSStreamEventErrorOccurred` event code. The current session is closed and a new session is attempted. */ -- (void)streamDidError:(NSStream *)stream { +- (void)sdl_streamDidError:(NSStream *)stream { NSAssert(!NSThread.isMainThread, @"%@ should only be called on the IO thread", NSStringFromSelector(_cmd)); - SDLLogE(@"Data session I/O streams errored for protocol: %@", self.protocolString); + SDLLogE(@"Data session %s stream errored", stream == self.eaSession.inputStream ? "input" : "output"); // To prevent deadlocks the handler must return to the runloop and not block the thread dispatch_async(dispatch_get_main_queue(), ^{ From be4a932493cdbc5731d190f95c7cf5db2bde06a2 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 10:37:49 -0400 Subject: [PATCH 105/179] Removed extra line --- SmartDeviceLink/SDLIAPDataSession.h | 1 - 1 file changed, 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.h b/SmartDeviceLink/SDLIAPDataSession.h index e53953bae..463af6e9f 100644 --- a/SmartDeviceLink/SDLIAPDataSession.h +++ b/SmartDeviceLink/SDLIAPDataSession.h @@ -17,7 +17,6 @@ NS_ASSUME_NONNULL_BEGIN @interface SDLIAPDataSession : SDLIAPSession - - (instancetype)init NS_UNAVAILABLE; /** From 2f36335509cdc8596ac87f7730e3400cbc5fcb62 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 11:06:29 -0400 Subject: [PATCH 106/179] Renamed the stop session methods --- SmartDeviceLink/SDLIAPControlSession.m | 54 ++++++++++++++------------ SmartDeviceLink/SDLIAPDataSession.m | 49 +++++++++++++++-------- 2 files changed, 62 insertions(+), 41 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 84ef38748..36c043417 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -28,7 +28,6 @@ @interface SDLIAPControlSession () @end - @interface SDLIAPSession (exposeIAPSessionPrivateMethods) @property (nonatomic, assign) BOOL isInputStreamOpen; @@ -41,9 +40,10 @@ - (void)closeSession; @end - @implementation SDLIAPControlSession +#pragma mark - Session lifecycle + - (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id)delegate { SDLLogV(@"SDLIAPControlSession init"); @@ -56,6 +56,8 @@ - (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id return self; } +#pragma mark Start + - (void)startSession { if (self.accessory == nil) { SDLLogW(@"There is no control session in progress, attempting to create a new control session."); @@ -87,17 +89,30 @@ - (BOOL)sdl_startStreams { return YES; } -- (void)sdl_stopStreamsAndDestroySession { +#pragma mark Stop + +- (void)destroySession { + SDLLogD(@"Destroying the control session"); + [self sdl_destroySession]; +} + +/** + * Makes sure the session is closed and destroyed on the main thread. + */ +- (void)sdl_destroySession { if ([NSThread isMainThread]) { - [self sdl_stop]; + [self sdl_stopAndDestroySession]; } else { dispatch_sync(dispatch_get_main_queue(), ^{ - [self sdl_stop]; + [self sdl_stopAndDestroySession]; }); } } -- (void)sdl_stop { +/** + * Closes the session streams and then destroys the session. + */ +- (void)sdl_stopAndDestroySession { NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); [super stopStream:self.eaSession.outputStream]; @@ -105,23 +120,6 @@ - (void)sdl_stop { [super closeSession]; } -- (void)destroySession { - if (self.accessory == nil) { - SDLLogV(@"Attempting to stop the control session but the accessory is nil"); - return; - } - - SDLLogD(@"Destroying the control session"); - [self sdl_stopStreamsAndDestroySession]; -} - -/** - * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and the delegate will be notified that it should attempt to establish a new control session. - */ -- (void)sdl_startSessionTimer { - if (self.protocolIndexTimer == nil) { return; } - [self.protocolIndexTimer start]; -} #pragma mark - NSStreamDelegate @@ -248,7 +246,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { void (^elapsedBlock)(void) = ^{ __strong typeof(weakSelf) strongSelf = weakSelf; SDLLogW(@"Control session failed to get the protocol string from Core after %d seconds, retrying.", ProtocolIndexTimeoutSeconds); - [strongSelf sdl_stopStreamsAndDestroySession]; + [strongSelf sdl_destroySession]; if (strongSelf.delegate == nil) { return; } [strongSelf.delegate retryControlSession]; @@ -258,6 +256,14 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { return protocolIndexTimer; } +/** + * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and the delegate will be notified that it should attempt to establish a new control session. + */ +- (void)sdl_startSessionTimer { + if (self.protocolIndexTimer == nil) { return; } + [self.protocolIndexTimer start]; +} + #pragma mark - Lifecycle Destruction - (void)dealloc { diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 83ceca530..05490a397 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -29,7 +29,6 @@ @interface SDLIAPDataSession () @end - @interface SDLIAPSession (exposeIAPSessionPrivateMethods) @property (nonatomic, assign) BOOL isInputStreamOpen; @@ -44,6 +43,8 @@ - (void)closeSession; @implementation SDLIAPDataSession +#pragma mark - Session lifecycle + - (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id)delegate forProtocol:(NSString *)protocol; { SDLLogV(@"SDLIAPDataSession init"); @@ -57,6 +58,8 @@ - (instancetype)initWithAccessory:(nullable EAAccessory *)accessory delegate:(id return self; } +#pragma mark Start + - (void)startSession { if (self.accessory == nil) { SDLLogW(@"Failed to setup data session"); @@ -78,17 +81,30 @@ - (void)startSession { } } -- (void)sdl_stopStreamsAndDestroySession { +#pragma mark Stop + +- (void)destroySession { + SDLLogD(@"Destroying the data session"); + [self sdl_destroySession]; +} + +/** + * Makes sure the session is closed and destroyed on the main thread. + */ +- (void)sdl_destroySession { if ([NSThread isMainThread]) { - [self sdl_stop]; + [self sdl_stopAndDestroySession]; } else { dispatch_sync(dispatch_get_main_queue(), ^{ - [self sdl_stop]; + [self sdl_stopAndDestroySession]; }); } } -- (void)sdl_stop { +/** + * Waits for the session streams to close on the I/O Thread and then destroys the session. + */ +- (void)sdl_stopAndDestroySession { NSAssert(NSThread.isMainThread, @"%@ must only be called on the main thread", NSStringFromSelector(_cmd)); if (self.ioStreamThread == nil) { @@ -109,16 +125,6 @@ - (void)sdl_stop { }]; } -- (void)destroySession { - if (self.accessory == nil) { - SDLLogV(@"Attempting to stop the data session but the session is nil"); - return; - } - - SDLLogD(@"Destroying the data session"); - [self sdl_stopStreamsAndDestroySession]; -} - /** * Wait for the data session to detroy its input and output streams. The data EASession can not be destroyed until both streams have closed. * @@ -136,7 +142,7 @@ - (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completio } } -#pragma mark - data send methods +#pragma mark - Sending data - (void)sendData:(NSData *)data { // Enqueue the data for transmission on the IO thread @@ -145,6 +151,9 @@ - (void)sendData:(NSData *)data { [self performSelector:@selector(sdl_dequeueAndWriteToOutputStream) onThread:self.ioStreamThread withObject:nil waitUntilDone:NO]; } +/** + * Sends any queued data to Core on the output stream for the session. + */ - (void)sdl_dequeueAndWriteToOutputStream { if ([self.ioStreamThread isCancelled]) { SDLLogV(@"Attempted to send data on I/O thread but the thread is cancelled."); @@ -179,6 +188,11 @@ - (void)sdl_dequeueAndWriteToOutputStream { } } +/** + * Handles an output stream error when attempting to write to the output stream. + * + * @param error The output stream error + */ - (void)sdl_handleOutputStreamWriteError:(NSError *)error { SDLLogE(@"Output stream error: %@", error); // TODO: We should look at the domain and the code as a tuple and decide how to handle the error based on both values. For now, if the stream is closed, we will flush the send queue and leave it as-is otherwise so that temporary error conditions can be dealt with by retrying @@ -189,6 +203,7 @@ - (void)sdl_handleOutputStreamWriteError:(NSError *)error { } } + #pragma mark - NSStreamDelegate /** @@ -322,7 +337,7 @@ - (void)sdl_streamDidError:(NSStream *)stream { }); } -#pragma mark - background I/O for data session +#pragma mark - Stream lifecycle // Data session I/O thread - (void)sdl_accessoryEventLoop { From 86b4b4d2af0e4b89034990267efbd5d547ba6c4d Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 11:08:32 -0400 Subject: [PATCH 107/179] Fixed assert description for starting stream --- SmartDeviceLink/SDLIAPDataSession.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 05490a397..63d257827 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -379,7 +379,7 @@ - (void)sdl_closeSession { } - (void)startStream:(NSStream *)stream { - NSAssert([[NSThread currentThread] isEqual:self.ioStreamThread] || [NSThread isMainThread], @"stopStream is being called on the wrong thread!!!"); + NSAssert([[NSThread currentThread] isEqual:self.ioStreamThread] || [NSThread isMainThread], @"startStream is being called on the wrong thread!!!"); [super startStream:stream]; } From cfff2c41d91579890d49339ad8c19b4015318d6a Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 11:12:38 -0400 Subject: [PATCH 108/179] Renamed retry delegate methods --- SmartDeviceLink/SDLIAPControlSession.m | 10 +++++----- SmartDeviceLink/SDLIAPControlSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPDataSession.m | 8 ++++---- SmartDeviceLink/SDLIAPDataSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPTransport.m | 6 +++--- .../TransportSpecs/iAP/SDLIAPControlSessionSpec.m | 2 +- .../TransportSpecs/iAP/SDLIAPDataSessionSpec.m | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 36c043417..534a3c614 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -62,7 +62,7 @@ - (void)startSession { if (self.accessory == nil) { SDLLogW(@"There is no control session in progress, attempting to create a new control session."); if (self.delegate == nil) { return; } - [self.delegate retryControlSession]; + [self.delegate controlSessionShouldRetry]; } else { SDLLogD(@"Starting a control session with accessory (%@)", self.accessory.name); @@ -70,7 +70,7 @@ - (void)startSession { SDLLogW(@"Control session failed to setup with accessory: %@. Attempting to create a new control session", self.accessory); [self destroySession]; if (self.delegate == nil) { return; } - [self.delegate retryControlSession]; + [self.delegate controlSessionShouldRetry]; } else { SDLLogD(@"Waiting for the protocol string from Core, setting timer for %d seconds", ProtocolIndexTimeoutSeconds); self.protocolIndexTimer = [self sdl_createProtocolIndexTimer]; @@ -187,7 +187,7 @@ - (void)sdl_streamDidEnd:(NSStream *)stream { [self destroySession]; if (self.delegate == nil) { return; } - [self.delegate retryControlSession]; + [self.delegate controlSessionShouldRetry]; } /** @@ -229,7 +229,7 @@ - (void)sdl_streamDidError:(NSStream *)stream { [self destroySession]; if (self.delegate == nil) { return; } - [self.delegate retryControlSession]; + [self.delegate controlSessionShouldRetry]; } #pragma mark - Timer @@ -249,7 +249,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { [strongSelf sdl_destroySession]; if (strongSelf.delegate == nil) { return; } - [strongSelf.delegate retryControlSession]; + [strongSelf.delegate controlSessionShouldRetry]; }; protocolIndexTimer.elapsedBlock = elapsedBlock; diff --git a/SmartDeviceLink/SDLIAPControlSessionDelegate.h b/SmartDeviceLink/SDLIAPControlSessionDelegate.h index 0e3162700..67ba2b042 100644 --- a/SmartDeviceLink/SDLIAPControlSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPControlSessionDelegate.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol SDLIAPControlSessionDelegate -- (void)retryControlSession; +- (void)controlSessionShouldRetry; - (void)controlSession:(SDLIAPControlSession *)controlSession didReceiveProtocolString:(NSString *)protocolString; @end diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 63d257827..205875116 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -64,7 +64,7 @@ - (void)startSession { if (self.accessory == nil) { SDLLogW(@"Failed to setup data session"); if (self.delegate == nil) { return; } - [self.delegate retryDataSession]; + [self.delegate dataSessionShouldRetry]; } else { SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.accessory.name, self.protocolString); @@ -72,7 +72,7 @@ - (void)startSession { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.accessory); [self destroySession]; if (self.delegate == nil) { return; } - [self.delegate retryDataSession]; + [self.delegate dataSessionShouldRetry]; } self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil]; @@ -280,7 +280,7 @@ - (void)sdl_streamDidEnd:(NSStream *)stream { [self destroySession]; if (self.delegate == nil) { return; } - [self.delegate retryDataSession]; + [self.delegate dataSessionShouldRetry]; }); // To prevent deadlocks the handler must return to the runloop and not block the thread @@ -332,7 +332,7 @@ - (void)sdl_streamDidError:(NSStream *)stream { [self destroySession]; if (![self.protocolString isEqualToString:LegacyProtocolString]) { if (self.delegate == nil) { return; } - [self.delegate retryDataSession]; + [self.delegate dataSessionShouldRetry]; } }); } diff --git a/SmartDeviceLink/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/SDLIAPDataSessionDelegate.h index b4f1ad85b..a6a5ccfeb 100644 --- a/SmartDeviceLink/SDLIAPDataSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPDataSessionDelegate.h @@ -12,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol SDLIAPDataSessionDelegate -- (void)retryDataSession; +- (void)dataSessionShouldRetry; - (void)dataReceived:(NSData *)dataIn; - (void)transportConnected; diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 67b23bd3f..6fe44df07 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -432,7 +432,7 @@ - (void)sdl_retryEstablishSession { /** * Called when the control session should be retried. */ -- (void)retryControlSession { +- (void)controlSessionShouldRetry { SDLLogV(@"Retrying the control session"); [self sdl_retryEstablishSession]; } @@ -456,7 +456,7 @@ - (void)controlSession:(nonnull SDLIAPControlSession *)controlSession didReceive * * @param dataIn The received data */ -- (void)dataReceived:(nonnull NSData *)dataIn { +- (void)dataSession:(nonnull NSData *)dataIn { [self.delegate onDataReceived:dataIn]; [self sdl_backgroundTaskStart]; } @@ -464,7 +464,7 @@ - (void)dataReceived:(nonnull NSData *)dataIn { /** * Called when the data session should be retried. */ -- (void)retryDataSession { +- (void)dataSessionShouldRetry { SDLLogV(@"Retrying the data session"); [self sdl_retryEstablishSession]; } diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m index 113c06f5f..dbce3da78 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPControlSessionSpec.m @@ -57,7 +57,7 @@ @interface SDLIAPControlSession() it(@"Should start correctly", ^{ [controlSession startSession]; - OCMExpect([mockDelegate retryControlSession]); + OCMExpect([mockDelegate controlSessionShouldRetry]); }); }); }); diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m index 84e741f7b..1d980b139 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPDataSessionSpec.m @@ -67,7 +67,7 @@ @interface SDLIAPDataSession() it(@"Should start correctly", ^{ [dataSession startSession]; - OCMExpect([mockDelegate retryDataSession]); + OCMExpect([mockDelegate dataSessionShouldRetry]); }); }); }); From 237d52ab429c52e0292bf45470acf2b676680531 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 11:27:13 -0400 Subject: [PATCH 109/179] Renamed data session connected delegate method --- SmartDeviceLink/SDLIAPDataSession.m | 2 +- SmartDeviceLink/SDLIAPDataSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPTransport.m | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 205875116..4099ca7aa 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -259,7 +259,7 @@ - (void)sdl_streamDidOpen:(NSStream *)stream { if (self.isInputStreamOpen && self.isOutputStreamOpen) { SDLLogV(@"Data session I/O streams opened for protocol: %@", self.protocolString); if (self.delegate == nil) { return; } - [self.delegate transportConnected]; + [self.delegate dataSessionDidConnect]; } } diff --git a/SmartDeviceLink/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/SDLIAPDataSessionDelegate.h index a6a5ccfeb..6c6724213 100644 --- a/SmartDeviceLink/SDLIAPDataSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPDataSessionDelegate.h @@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)dataSessionShouldRetry; - (void)dataReceived:(NSData *)dataIn; -- (void)transportConnected; +- (void)dataSessionDidConnect; @end diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 6fe44df07..7c2c0e82b 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -472,7 +472,7 @@ - (void)dataSessionShouldRetry { /** * Called when the data session has been established. Notify the delegate that the transport has been connected. */ -- (void)transportConnected { +- (void)dataSessionDidConnect { self.sessionSetupInProgress = NO; [self.delegate onTransportConnected]; } From 6c4bf0d712e41ebdcc3291890efc654df863a972 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 11:37:05 -0400 Subject: [PATCH 110/179] Renamed data session delegate data received method --- SmartDeviceLink/SDLIAPDataSession.m | 2 +- SmartDeviceLink/SDLIAPDataSessionDelegate.h | 2 +- SmartDeviceLink/SDLIAPTransport.m | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 4099ca7aa..3d42cb5ef 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -305,7 +305,7 @@ - (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream { if (bytesRead > 0) { if (self.delegate == nil) { return; } - [self.delegate dataReceived:dataIn]; + [self.delegate dataSessionDidReceiveData:dataIn]; } else { break; } diff --git a/SmartDeviceLink/SDLIAPDataSessionDelegate.h b/SmartDeviceLink/SDLIAPDataSessionDelegate.h index 6c6724213..687da5f56 100644 --- a/SmartDeviceLink/SDLIAPDataSessionDelegate.h +++ b/SmartDeviceLink/SDLIAPDataSessionDelegate.h @@ -13,7 +13,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol SDLIAPDataSessionDelegate - (void)dataSessionShouldRetry; -- (void)dataReceived:(NSData *)dataIn; +- (void)dataSessionDidReceiveData:(NSData *)data; - (void)dataSessionDidConnect; @end diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 7c2c0e82b..53b7e9912 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -454,10 +454,10 @@ - (void)controlSession:(nonnull SDLIAPControlSession *)controlSession didReceive /** * Called when the data session receives data from Core * - * @param dataIn The received data + * @param data The received data */ -- (void)dataSession:(nonnull NSData *)dataIn { - [self.delegate onDataReceived:dataIn]; +- (void)dataSessionDidReceiveData:(nonnull NSData *)data { + [self.delegate onDataReceived:data]; [self sdl_backgroundTaskStart]; } From 71b807fa75ef46b0aaad6ee20d0b20c78eab822f Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 12:03:28 -0400 Subject: [PATCH 111/179] Examples apps restarted if the manager still exists --- Example Apps/Example ObjC/ProxyManager.m | 14 +++++++++----- Example Apps/Example Swift/ProxyManager.swift | 11 ++++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m index a7732892a..c045531ef 100644 --- a/Example Apps/Example ObjC/ProxyManager.m +++ b/Example Apps/Example ObjC/ProxyManager.m @@ -54,7 +54,7 @@ - (instancetype)init { return self; } -- (void)startManager { +- (void)sdlex_startManager { __weak typeof (self) weakSelf = self; [self.sdlManager startWithReadyHandler:^(BOOL success, NSError * _Nullable error) { if (!success) { @@ -109,10 +109,14 @@ + (SDLLifecycleConfiguration *)sdlex_tcpLifecycleConfiguration { } - (void)sdlex_setupConfigurationWithLifecycleConfiguration:(SDLLifecycleConfiguration *)lifecycleConfiguration { - SDLConfiguration *config = [SDLConfiguration configurationWithLifecycle:lifecycleConfiguration lockScreen:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:[UIImage imageNamed:ExampleAppLogoName] backgroundColor:nil] logging:[self.class sdlex_logConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration]]; - self.sdlManager = [[SDLManager alloc] initWithConfiguration:config delegate:self]; - - [self startManager]; + if (self.sdlManager == nil) { + SDLConfiguration *config = [SDLConfiguration configurationWithLifecycle:lifecycleConfiguration lockScreen:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:[UIImage imageNamed:ExampleAppLogoName] backgroundColor:nil] logging:[self.class sdlex_logConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration]]; + self.sdlManager = [[SDLManager alloc] initWithConfiguration:config delegate:self]; + [self sdlex_startManager]; + } else { + // Manager already created, just start it again. + [self sdlex_startManager]; + } } + (SDLLifecycleConfiguration *)sdlex_setLifecycleConfigurationPropertiesOnConfiguration:(SDLLifecycleConfiguration *)config { diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift index b6287bf6e..a645b0c1a 100644 --- a/Example Apps/Example Swift/ProxyManager.swift +++ b/Example Apps/Example Swift/ProxyManager.swift @@ -43,9 +43,14 @@ extension ProxyManager { /// /// - Parameter connectionType: The type of transport layer to use. func start(with proxyTransportType: ProxyTransportType) { - delegate?.didChangeProxyState(ProxyState.searching) - sdlManager = SDLManager(configuration: proxyTransportType == .iap ? ProxyManager.connectIAP() : ProxyManager.connectTCP(), delegate: self) - startManager() + if sdlManager == nil { + delegate?.didChangeProxyState(ProxyState.searching) + sdlManager = SDLManager(configuration: proxyTransportType == .iap ? ProxyManager.connectIAP() : ProxyManager.connectTCP(), delegate: self) + startManager() + } else { + // Manager already created, just start it again. + startManager() + } } /// Attempts to close the connection between the this app and the car's head unit. The `SDLManagerDelegate`'s `managerDidDisconnect()` is called when connection is actually closed. From 3a8bd00d7b10689a178b6ae575656dcd53945e31 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Wed, 29 May 2019 14:14:56 -0400 Subject: [PATCH 112/179] Update choice set log --- SmartDeviceLink/SDLChoiceSet.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLChoiceSet.m b/SmartDeviceLink/SDLChoiceSet.m index da58749b4..b7aa12388 100644 --- a/SmartDeviceLink/SDLChoiceSet.m +++ b/SmartDeviceLink/SDLChoiceSet.m @@ -57,7 +57,7 @@ - (instancetype)initWithTitle:(NSString *)title delegate:(id 500) { - SDLLogW(@"Attempted to create a choice set with a %lu length. Only 500 characters are supported", (unsigned long)title.length); + SDLLogW(@"Attempted to create a choice set title with a %lu length. Only 500 characters are supported", (unsigned long)title.length); return nil; } From 0047bf7fd85297cccd52eddc91cbde6530958ad4 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 14:40:47 -0400 Subject: [PATCH 113/179] Fixed spelling, SDL logs --- SmartDeviceLink/SDLIAPSession.m | 2 +- SmartDeviceLink/SDLIAPTransport.m | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index 15c7a1b4a..dd5ad2936 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -95,7 +95,7 @@ - (void)closeSession { } self.eaSession = nil; - SDLLogD(@"Session closed for: %@", self.accessory.serialNumber); + SDLLogD(@"Session closed with: %@", self.accessory.name); self.accessory.delegate = nil; } diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 53b7e9912..0e0194c2b 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -283,9 +283,13 @@ - (void)connect { * Cleans up after a disconnected accessory by closing any open I/O streams. */ - (void)disconnect { - // Stop event listening here so that even if the transport is disconnected by the proxy we unregister for accessory local notifications + // Stop event listening here so that even if the transport is disconnected by `SDLProxy` when there is a start session timeout, the class unregisters for accessory notifications [self sdl_stopEventListening]; + self.retryCounter = 0; + self.sessionSetupInProgress = NO; + self.transportDisconnected = YES; + [self.controlSession destroySession]; [self.dataSession destroySession]; } @@ -300,7 +304,7 @@ - (void)disconnect { */ - (void)sdl_connect:(nullable EAAccessory *)accessory { if (self.transportDisconnected) { - SDLLogV(@"Will not attempt to connect to an accessory becasue the data session disconnected. Waiting for lifecycle manager to create a new tranport object."); + SDLLogV(@"Will not attempt to connect to an accessory because the data session disconnected. Waiting for lifecycle manager to create a new tranport object."); return; } From 2e12a55ceaeeb22bbcca9e8e5c25629401fa15ce Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 15:00:16 -0400 Subject: [PATCH 114/179] Added more SDL logs Added more SDL logs for debugging start session timeouts --- SmartDeviceLink/SDLIAPDataSession.m | 2 ++ SmartDeviceLink/SDLIAPTransport.m | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 3d42cb5ef..37188b532 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -169,6 +169,8 @@ - (void)sdl_dequeueAndWriteToOutputStream { NSMutableData *remainder = [self.sendDataQueue frontBuffer]; if (remainder != nil && ostream.streamStatus == NSStreamStatusOpen) { + SDLLogV(@"Writing to the data session's output stream"); + NSUInteger bytesRemaining = remainder.length; NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; if (bytesWritten < 0) { diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 0e0194c2b..999518d4d 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -262,7 +262,10 @@ - (void)sdl_applicationDidEnterBackground:(NSNotification *)notification { * @param data The data to be sent to Core */ - (void)sendData:(NSData *)data { - if (!self.dataSession.sessionInProgress) { return; } + if (!self.dataSession.sessionInProgress) { + SDLLogW(@"Attempting to send data to Core but there is no data session in progress"); + return; + } [self.dataSession sendData:data]; } From cc7f00ce119231c6b3329363b4cbf202cd78c1e6 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Wed, 29 May 2019 16:13:10 -0400 Subject: [PATCH 115/179] Fix: SDLAudioFile must be public --- SmartDeviceLink-iOS.podspec | 1 + SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 2 +- SmartDeviceLink.podspec | 1 + SmartDeviceLink/SmartDeviceLink.h | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec index 116bddd48..420695083 100644 --- a/SmartDeviceLink-iOS.podspec +++ b/SmartDeviceLink-iOS.podspec @@ -42,6 +42,7 @@ ss.public_header_files = [ 'SmartDeviceLink/SDLArtwork.h', 'SmartDeviceLink/SDLAudioControlData.h', 'SmartDeviceLink/SDLAudioControlCapabilities.h', +'SmartDeviceLink/SDLAudioFile.h', 'SmartDeviceLink/SDLAudioPassThruCapabilities.h', 'SmartDeviceLink/SDLAudioStreamingState.h', 'SmartDeviceLink/SDLAudioStreamingIndicator.h', diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 46abf3e31..a2c2638d5 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1076,7 +1076,7 @@ 5D9FC29E1FD8813900ACA5C2 /* SDLAudioStreamManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D9FC29C1FD8813900ACA5C2 /* SDLAudioStreamManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5D9FC29F1FD8813900ACA5C2 /* SDLAudioStreamManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9FC29D1FD8813900ACA5C2 /* SDLAudioStreamManager.m */; }; 5D9FC2A21FD8814A00ACA5C2 /* SDLAudioFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9FC2A01FD8814A00ACA5C2 /* SDLAudioFile.m */; }; - 5D9FC2A31FD8814A00ACA5C2 /* SDLAudioFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D9FC2A11FD8814A00ACA5C2 /* SDLAudioFile.h */; }; + 5D9FC2A31FD8814A00ACA5C2 /* SDLAudioFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D9FC2A11FD8814A00ACA5C2 /* SDLAudioFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5D9FC2A61FD8815800ACA5C2 /* SDLPCMAudioConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D9FC2A41FD8815800ACA5C2 /* SDLPCMAudioConverter.h */; }; 5D9FC2A71FD8815800ACA5C2 /* SDLPCMAudioConverter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9FC2A51FD8815800ACA5C2 /* SDLPCMAudioConverter.m */; }; 5D9FDA8F1F2A7D3400A495C8 /* bson_array.c in Sources */ = {isa = PBXBuildFile; fileRef = 5D9FDA891F2A7D3400A495C8 /* bson_array.c */; }; diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec index 40acabfea..ed6602f39 100644 --- a/SmartDeviceLink.podspec +++ b/SmartDeviceLink.podspec @@ -44,6 +44,7 @@ sdefault.public_header_files = [ 'SmartDeviceLink/SDLAudioControlData.h', 'SmartDeviceLink/SDLAudioControlCapabilities.h', 'SmartDeviceLink/SDLAudioPassThruCapabilities.h', +'SmartDeviceLink/SDLAudioFile.h', 'SmartDeviceLink/SDLAudioStreamingState.h', 'SmartDeviceLink/SDLAudioStreamingIndicator.h', 'SmartDeviceLink/SDLAudioStreamManager.h', diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h index 4ae1a7d37..5901084a5 100644 --- a/SmartDeviceLink/SmartDeviceLink.h +++ b/SmartDeviceLink/SmartDeviceLink.h @@ -371,6 +371,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[]; #import "SDLStreamingMediaConfiguration.h" // Streaming +#import "SDLAudioFile.h" #import "SDLAudioStreamManager.h" #import "SDLAudioStreamManagerDelegate.h" #import "SDLCarWindowViewController.h" From 580320bf3b162e328a3cb85c6a712baec1d232cd Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 29 May 2019 16:13:28 -0400 Subject: [PATCH 116/179] =?UTF-8?q?Cleaned=20up=20the=20data=20session?= =?UTF-8?q?=E2=80=99s=20write=20to=20output=20stream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SmartDeviceLink/SDLIAPDataSession.m | 37 ++++++++++++++++------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 37188b532..138700591 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -86,6 +86,7 @@ - (void)startSession { - (void)destroySession { SDLLogD(@"Destroying the data session"); [self sdl_destroySession]; + [self.sendDataQueue removeAllObjects]; } /** @@ -167,26 +168,28 @@ - (void)sdl_dequeueAndWriteToOutputStream { } NSMutableData *remainder = [self.sendDataQueue frontBuffer]; + if (remainder == nil) { + SDLLogV(@"No more data to write to data session's output stream. Returning"); + return; + } - if (remainder != nil && ostream.streamStatus == NSStreamStatusOpen) { - SDLLogV(@"Writing to the data session's output stream"); - - NSUInteger bytesRemaining = remainder.length; - NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; - if (bytesWritten < 0) { - if (ostream.streamError != nil) { - [self sdl_handleOutputStreamWriteError:ostream.streamError]; - } else { - // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory. - SDLLogE(@"Output stream write operation failed"); - } - } else if (bytesWritten == bytesRemaining) { - // Remove the data from the queue - [self.sendDataQueue popBuffer]; + SDLLogV(@"Writing to the data session's output stream"); + + NSUInteger bytesRemaining = remainder.length; + NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; + if (bytesWritten < 0) { + if (ostream.streamError != nil) { + [self sdl_handleOutputStreamWriteError:ostream.streamError]; } else { - // Cleave the sent bytes from the data, the remainder will sit at the head of the queue - [remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0]; + // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory. + SDLLogE(@"Output stream write operation failed"); } + } else if (bytesWritten == bytesRemaining) { + // Remove the data from the queue + [self.sendDataQueue popBuffer]; + } else { + // Cleave the sent bytes from the data, the remainder will sit at the head of the queue + [remainder replaceBytesInRange:NSMakeRange(0, (NSUInteger)bytesWritten) withBytes:NULL length:0]; } } From ea18212f1ebfaf2e1a4f24590769fb421f9b4a2f Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Wed, 29 May 2019 16:24:22 -0400 Subject: [PATCH 117/179] Use new BSON method --- SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m | 3 ++- SmartDeviceLink/SDLControlFramePayloadEndService.m | 3 ++- SmartDeviceLink/SDLControlFramePayloadNak.m | 4 +++- SmartDeviceLink/SDLControlFramePayloadRPCStartService.m | 3 ++- SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m | 3 ++- .../SDLControlFramePayloadRegisterSecondaryTransportNak.m | 3 ++- SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m | 3 ++- SmartDeviceLink/SDLControlFramePayloadVideoStartService.m | 3 ++- SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m | 3 ++- 9 files changed, 19 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m index be5460bb4..d28524f81 100644 --- a/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m @@ -65,7 +65,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadEndService.m b/SmartDeviceLink/SDLControlFramePayloadEndService.m index 372400e7d..d7e9aef48 100644 --- a/SmartDeviceLink/SDLControlFramePayloadEndService.m +++ b/SmartDeviceLink/SDLControlFramePayloadEndService.m @@ -65,7 +65,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); self.hashId = bson_object_get_int32(&payloadObject, SDLControlFrameHashIdKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadNak.m b/SmartDeviceLink/SDLControlFramePayloadNak.m index 15f5c517c..eefda10e6 100644 --- a/SmartDeviceLink/SDLControlFramePayloadNak.m +++ b/SmartDeviceLink/SDLControlFramePayloadNak.m @@ -70,7 +70,9 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + BsonArray *arrayObject = bson_object_get_array(&payloadObject, SDLControlFrameRejectedParams); if (arrayObject == NULL) { return; diff --git a/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m b/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m index d943d6a47..ea4fe6f25 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m +++ b/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m @@ -64,7 +64,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); char *utf8String = bson_object_get_string(&payloadObject, SDLControlFrameProtocolVersionKey); if (utf8String != NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m index b9e54d9a3..996f2f172 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m @@ -114,7 +114,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); self.hashId = bson_object_get_int32(&payloadObject, SDLControlFrameHashIdKey); self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m b/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m index 570d41fa5..aeca26258 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m +++ b/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m @@ -64,7 +64,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); char *reasonString = bson_object_get_string(&payloadObject, SDLControlFrameReasonKey); if (reasonString != NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m b/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m index daaf3f13c..ed76a1c7f 100644 --- a/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m +++ b/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m @@ -80,7 +80,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); char *utf8String = bson_object_get_string(&payloadObject, SDLControlFrameTCPIPAddressKey); if (utf8String != NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m b/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m index d33698ebb..24820cf43 100644 --- a/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m +++ b/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m @@ -87,7 +87,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); self.height = bson_object_get_int32(&payloadObject, SDLControlFrameHeightKey); self.width = bson_object_get_int32(&payloadObject, SDLControlFrameWidthKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m index d690d6690..23891ce24 100644 --- a/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m @@ -93,7 +93,8 @@ - (nullable NSData *)data { } - (void)sdl_parse:(NSData *)data { - BsonObject payloadObject = bson_object_from_bytes((BytePtr)data.bytes); + BsonObject payloadObject; + bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); self.height = bson_object_get_int32(&payloadObject, SDLControlFrameHeightKey); From fff87c17f1edd794fbaa7888871b8129c877dfbf Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 30 May 2019 09:58:34 -0400 Subject: [PATCH 118/179] Add audio data queueing to the audio stream manager --- SmartDeviceLink/SDLAudioFile.h | 32 +++++++++++++++++++++++-- SmartDeviceLink/SDLAudioFile.m | 9 +++++++ SmartDeviceLink/SDLAudioStreamManager.h | 7 ++++++ SmartDeviceLink/SDLAudioStreamManager.m | 30 ++++++++++++++++++++++- 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLAudioFile.h b/SmartDeviceLink/SDLAudioFile.h index e34c37a8d..794c50cab 100755 --- a/SmartDeviceLink/SDLAudioFile.h +++ b/SmartDeviceLink/SDLAudioFile.h @@ -12,21 +12,49 @@ NS_ASSUME_NONNULL_BEGIN @interface SDLAudioFile : NSObject -@property (copy, nonatomic, readonly) NSURL *inputFileURL; +/** + If initialized with a file URL, the file URL it came from + */ +@property (nullable, copy, nonatomic, readonly) NSURL *inputFileURL; -@property (copy, nonatomic, readonly) NSURL *outputFileURL; +/** + If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file + */ +@property (nullable, copy, nonatomic, readonly) NSURL *outputFileURL; /** In seconds. UINT32_MAX if unknown. */ @property (assign, nonatomic) UInt32 estimatedDuration; +/** + The PCM audio data to be transferred and played + */ @property (copy, nonatomic, readonly) NSData *data; +/** + The size of the PCM audio data in bytes + */ @property (assign, nonatomic, readonly) unsigned long long fileSize; +/** + Initialize an audio file to be queued and played + + @param inputURL The file that exists on the device to be transcoded and queued + @param outputURL The target URL that the transcoded file will be output to + @param duration The duration of the file + @return The audio file object + */ - (instancetype)initWithInputFileURL:(NSURL *)inputURL outputFileURL:(NSURL *)outputURL estimatedDuration:(UInt32)duration; +/** + Initialize a buffer of PCM audio data to be queued and played + + @param data The PCM audio data buffer + @return The audio file object + */ +- (instancetype)initWithData:(NSData *)data; + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLAudioFile.m b/SmartDeviceLink/SDLAudioFile.m index 1d0e2ef98..46b50f540 100755 --- a/SmartDeviceLink/SDLAudioFile.m +++ b/SmartDeviceLink/SDLAudioFile.m @@ -32,6 +32,15 @@ - (instancetype)initWithInputFileURL:(NSURL *)inputURL outputFileURL:(NSURL *)ou return self; } +- (instancetype)initWithData:(NSData *)data { + self = [super init]; + if (!self) { return nil; } + + _data = data; + + return self; +} + - (NSData *)data { if (_data.length == 0) { return [NSData dataWithContentsOfURL:_outputFileURL]; diff --git a/SmartDeviceLink/SDLAudioStreamManager.h b/SmartDeviceLink/SDLAudioStreamManager.h index e6608f8e1..bb44ef978 100755 --- a/SmartDeviceLink/SDLAudioStreamManager.h +++ b/SmartDeviceLink/SDLAudioStreamManager.h @@ -66,6 +66,13 @@ typedef NS_ENUM(NSInteger, SDLAudioStreamManagerError) { */ - (void)pushWithFileURL:(NSURL *)fileURL; +/** + Push a new audio buffer onto the queue. Call `playNextWhenReady` to start playing the pushed audio buffer. + + @param data The audio buffer to be pushed onto the queue + */ +- (void)pushWithData:(NSData *)data; + /** Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed. diff --git a/SmartDeviceLink/SDLAudioStreamManager.m b/SmartDeviceLink/SDLAudioStreamManager.m index 69312b0b5..f91db09c5 100755 --- a/SmartDeviceLink/SDLAudioStreamManager.m +++ b/SmartDeviceLink/SDLAudioStreamManager.m @@ -46,10 +46,15 @@ - (instancetype)initWithManager:(id)streamManager return self; } +#pragma mark - Getters + - (NSArray *)queue { return [_mutableQueue copy]; } +#pragma mark - Pushing to the Queue +#pragma mark Files + - (void)pushWithFileURL:(NSURL *)fileURL { dispatch_async(_audioQueue, ^{ [self sdl_pushWithContentsOfURL:fileURL]; @@ -79,6 +84,21 @@ - (void)sdl_pushWithContentsOfURL:(NSURL *)fileURL { } } +#pragma mark Raw Data + +- (void)pushWithData:(NSData *)data { + dispatch_async(_audioQueue, ^{ + [self sdl_pushWithData:data]; + }); +} + +- (void)sdl_pushWithData:(NSData *)data { + SDLAudioFile *audioFile = [[SDLAudioFile alloc] initWithData:data]; + [self.mutableQueue addObject:audioFile]; +} + +#pragma mark Playing from the Queue + - (void)playNextWhenReady { dispatch_async(_audioQueue, ^{ [self sdl_playNextWhenReady]; @@ -104,8 +124,14 @@ - (void)sdl_playNextWhenReady { [self.mutableQueue removeObjectAtIndex:0]; // Strip the first bunch of bytes (because of how Apple outputs the data) and send to the audio stream, if we don't do this, it will make a weird click sound + NSData *audioData = nil; + if (file.inputFileURL != nil) { + audioData = [file.data subdataWithRange:NSMakeRange(5760, (file.data.length - 5760))]; + } else { + audioData = file.data; + } + SDLLogD(@"Playing audio file: %@", file); - NSData *audioData = [file.data subdataWithRange:NSMakeRange(5760, (file.data.length - 5760))]; __block BOOL success = [self.streamManager sendAudioData:audioData]; self.playing = YES; @@ -125,6 +151,8 @@ - (void)sdl_playNextWhenReady { }); } +#pragma mark - Stopping Playback + - (void)stop { dispatch_async(_audioQueue, ^{ self.shouldPlayWhenReady = NO; From 0bc09b69b1e6ff98aed152b460f83e5a54c3ad15 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 30 May 2019 10:24:04 -0400 Subject: [PATCH 119/179] Create and call proper audio stream manager delegate methods --- SmartDeviceLink/SDLAudioStreamManager.m | 15 ++++++++++++-- .../SDLAudioStreamManagerDelegate.h | 20 ++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLAudioStreamManager.m b/SmartDeviceLink/SDLAudioStreamManager.m index f91db09c5..1ea9ac3ee 100755 --- a/SmartDeviceLink/SDLAudioStreamManager.m +++ b/SmartDeviceLink/SDLAudioStreamManager.m @@ -131,22 +131,33 @@ - (void)sdl_playNextWhenReady { audioData = file.data; } + // Send the audio file, which starts it playing immediately SDLLogD(@"Playing audio file: %@", file); __block BOOL success = [self.streamManager sendAudioData:audioData]; self.playing = YES; + // Determine the length of the audio PCM data and perform a few items once the audio has finished playing float audioLengthSecs = (float)audioData.length / (float)32000.0; __weak typeof(self) weakself = self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(audioLengthSecs * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ weakself.playing = NO; NSError *error = nil; if (weakself.delegate != nil) { - [weakself.delegate audioStreamManager:weakself fileDidFinishPlaying:file.inputFileURL successfully:success]; + if (file.inputFileURL != nil) { + [weakself.delegate audioStreamManager:weakself fileDidFinishPlaying:file.inputFileURL successfully:success]; + } else if ([weakself.delegate respondsToSelector:@selector(audioStreamManager:dataBufferDidFinishPlayingSuccessfully:)]) { + [weakself.delegate audioStreamManager:weakself dataBufferDidFinishPlayingSuccessfully:success]; + } } + SDLLogD(@"Ending Audio file: %@", file); [[NSFileManager defaultManager] removeItemAtURL:file.outputFileURL error:&error]; if (weakself.delegate != nil && error != nil) { - [weakself.delegate audioStreamManager:weakself errorDidOccurForFile:file.inputFileURL error:error]; + if (file.inputFileURL != nil) { + [weakself.delegate audioStreamManager:weakself errorDidOccurForFile:file.inputFileURL error:error]; + } else if ([weakself.delegate respondsToSelector:@selector(audioStreamManager:errorDidOccurForDataBuffer:)]) { + [weakself.delegate audioStreamManager:weakself errorDidOccurForDataBuffer:error]; + } } }); } diff --git a/SmartDeviceLink/SDLAudioStreamManagerDelegate.h b/SmartDeviceLink/SDLAudioStreamManagerDelegate.h index acad1472c..04235d95d 100755 --- a/SmartDeviceLink/SDLAudioStreamManagerDelegate.h +++ b/SmartDeviceLink/SDLAudioStreamManagerDelegate.h @@ -29,12 +29,30 @@ NS_ASSUME_NONNULL_BEGIN /** Called when a file from the SDLAudioStreamManager could not play - @param audioManager A reference to the audio stream manager + @param audioManager A reference to the audio stream manager @param fileURL The URL that failed @param error The error that occurred */ - (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForFile:(NSURL *)fileURL error:(NSError *)error; +@optional + +/** + Called when a data buffer from the SDLAudioStreamManager finishes playing + + @param audioManager A reference to the audio stream manager + @param successfully Whether or not the data buffer played successfully + */ +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager dataBufferDidFinishPlayingSuccessfully:(BOOL)successfully; + +/** + Called when a data buffer from the SDLAudioStreamManager could not play + + @param audioManager A reference to the audio stream manager + @param error The error that occurred + */ +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForDataBuffer:(NSError *)error; + @end NS_ASSUME_NONNULL_END From 3779a2ba32cc38ed047341eb15393b86a5b2787a Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 30 May 2019 11:05:43 -0400 Subject: [PATCH 120/179] Added SDL log for debugging output stream writes --- SmartDeviceLink/SDLIAPDataSession.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 138700591..16a6bdbff 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -146,6 +146,8 @@ - (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completio #pragma mark - Sending data - (void)sendData:(NSData *)data { + SDLLogV(@"Sending data %lu. I/O streams open? %s", (unsigned long)data.length, self.isStopped ? "no" : "yes"); + // Enqueue the data for transmission on the IO thread [self.sendDataQueue enqueueBuffer:data.mutableCopy]; @@ -173,10 +175,11 @@ - (void)sdl_dequeueAndWriteToOutputStream { return; } - SDLLogV(@"Writing to the data session's output stream"); - NSUInteger bytesRemaining = remainder.length; NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; + + SDLLogV(@"%ld bytes written to data session output stream", (long)bytesWritten); + if (bytesWritten < 0) { if (ostream.streamError != nil) { [self sdl_handleOutputStreamWriteError:ostream.streamError]; @@ -321,6 +324,7 @@ - (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream { * Called when the session gets a `NSStreamEventHasSpaceAvailable` event code. Send any queued data to Core. */ - (void)sdl_streamHasSpaceToWrite { + SDLLogV(@"NSStreamEventHasSpaceAvailable"); [self sdl_dequeueAndWriteToOutputStream]; } From b4f86f96cdcb3b0f9069bd639021295d52e7cda0 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 30 May 2019 12:40:39 -0400 Subject: [PATCH 121/179] Fixed many PR isues Rename some files added more unit tests fixed syntax Moved enums to a public file changed function names to align more with the standards --- SmartDeviceLink-iOS.podspec | 1 + SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 44 ++-- SmartDeviceLink.podspec | 1 + .../SDLDynamicMenuUpdateAlgorithm.h | 28 +++ .../SDLDynamicMenuUpdateAlgorithm.m | 104 ++++++++ .../SDLDynamicMenuUpdateRunScore.h | 34 +++ .../SDLDynamicMenuUpdateRunScore.m | 28 +++ SmartDeviceLink/SDLMenuManager.h | 2 +- SmartDeviceLink/SDLMenuManager.m | 236 ++++++++++-------- SmartDeviceLink/SDLMenuManagerConstants.h | 28 +++ SmartDeviceLink/SDLMenuUpdateAlgorithm.h | 24 -- SmartDeviceLink/SDLMenuUpdateAlgorithm.m | 121 --------- SmartDeviceLink/SDLScreenManager.h | 25 +- SmartDeviceLink/SmartDeviceLink.h | 1 + .../DevAPISpecs/SDLMenuManagerSpec.m | 12 +- SmartDeviceLinkTests/SDLMenuRunScoreSpec.m | 6 +- .../SDLMenuUpdateAlgorithmSpec.m | 94 ++++--- .../TestUtilities/TestConnectionManager.h | 2 +- .../TestUtilities/TestConnectionManager.m | 11 +- 19 files changed, 464 insertions(+), 338 deletions(-) create mode 100644 SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.h create mode 100644 SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m create mode 100644 SmartDeviceLink/SDLDynamicMenuUpdateRunScore.h create mode 100644 SmartDeviceLink/SDLDynamicMenuUpdateRunScore.m create mode 100644 SmartDeviceLink/SDLMenuManagerConstants.h delete mode 100644 SmartDeviceLink/SDLMenuUpdateAlgorithm.h delete mode 100644 SmartDeviceLink/SDLMenuUpdateAlgorithm.m diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec index 116bddd48..300d4cab1 100644 --- a/SmartDeviceLink-iOS.podspec +++ b/SmartDeviceLink-iOS.podspec @@ -204,6 +204,7 @@ ss.public_header_files = [ 'SmartDeviceLink/SDLMediaServiceManifest.h', 'SmartDeviceLink/SDLMediaType.h', 'SmartDeviceLink/SDLMenuCell.h', +'SmartDeviceLink/SDLMenuManagerConstants.h, 'SmartDeviceLink/SDLMenuParams.h', 'SmartDeviceLink/SDLMetadataTags.h', 'SmartDeviceLink/SDLMetadataType.h', diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 6a13bb20f..fe7e7e601 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1229,12 +1229,13 @@ 5DF40B26208FA7DE00DD6FDA /* SDLMenuManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */; }; 5DF40B28208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */; }; 5DFFB9151BD7C89700DB3F04 /* SDLConnectionManagerType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */; }; - 752ECDB6228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */; }; - 752ECDB7228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */; }; + 752ECDB6228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.h in Headers */ = {isa = PBXBuildFile; fileRef = 752ECDB4228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.h */; }; + 752ECDB7228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB5228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.m */; }; 752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */; }; 752ECDBB228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */; }; - 756C62762289F11F008B57A2 /* SDLMenuRunScore.h in Headers */ = {isa = PBXBuildFile; fileRef = 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */; }; - 756C62772289F11F008B57A2 /* SDLMenuRunScore.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */; }; + 755F176222A00B7C0041B9CB /* SDLMenuManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 755F176122A00B7C0041B9CB /* SDLMenuManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 756C62762289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.h in Headers */ = {isa = PBXBuildFile; fileRef = 756C62742289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.h */; }; + 756C62772289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C62752289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m */; }; 880245A420F79C3400ED195B /* SDLFileManagerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; 880245A520F79C3400ED195B /* SDLFileManagerConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 880245A320F79C3400ED195B /* SDLFileManagerConfiguration.m */; }; 880D267A220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */; }; @@ -2874,12 +2875,13 @@ 5DF40B25208FA7DE00DD6FDA /* SDLMenuManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLMenuManagerSpec.m; path = DevAPISpecs/SDLMenuManagerSpec.m; sourceTree = ""; }; 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandManagerSpec.m; path = DevAPISpecs/SDLVoiceCommandManagerSpec.m; sourceTree = ""; }; 5DFFB9141BD7C89700DB3F04 /* SDLConnectionManagerType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLConnectionManagerType.h; sourceTree = ""; }; - 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuUpdateAlgorithm.h; sourceTree = ""; }; - 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuUpdateAlgorithm.m; sourceTree = ""; }; + 752ECDB4228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLDynamicMenuUpdateAlgorithm.h; sourceTree = ""; }; + 752ECDB5228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLDynamicMenuUpdateAlgorithm.m; sourceTree = ""; }; 752ECDB8228C42E100D945F4 /* SDLMenuRunScoreSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuRunScoreSpec.m; sourceTree = ""; }; 752ECDBA228C532600D945F4 /* SDLMenuUpdateAlgorithmSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuUpdateAlgorithmSpec.m; sourceTree = ""; }; - 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuRunScore.h; sourceTree = ""; }; - 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLMenuRunScore.m; sourceTree = ""; }; + 755F176122A00B7C0041B9CB /* SDLMenuManagerConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLMenuManagerConstants.h; sourceTree = ""; }; + 756C62742289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLDynamicMenuUpdateRunScore.h; sourceTree = ""; }; + 756C62752289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLDynamicMenuUpdateRunScore.m; sourceTree = ""; }; 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFileManagerConfiguration.h; sourceTree = ""; }; 880245A320F79C3400ED195B /* SDLFileManagerConfiguration.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLFileManagerConfiguration.m; sourceTree = ""; }; 880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherServiceDataSpec.m; sourceTree = ""; }; @@ -3820,15 +3822,12 @@ 5D339CE5207C0651000CC364 /* Menu */ = { isa = PBXGroup; children = ( + 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */, 5D339CEC207C08AB000CC364 /* Cells */, 5D339CF1207C0ACE000CC364 /* SDLMenuManager.h */, 5D339CF2207C0ACE000CC364 /* SDLMenuManager.m */, 5DF40B20208E761A00DD6FDA /* SDLVoiceCommandManager.h */, 5DF40B21208E761A00DD6FDA /* SDLVoiceCommandManager.m */, - 756C62742289F11F008B57A2 /* SDLMenuRunScore.h */, - 756C62752289F11F008B57A2 /* SDLMenuRunScore.m */, - 752ECDB4228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h */, - 752ECDB5228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m */, ); name = Menu; sourceTree = ""; @@ -5813,6 +5812,18 @@ name = Menu; sourceTree = ""; }; + 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */ = { + isa = PBXGroup; + children = ( + 756C62742289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.h */, + 756C62752289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m */, + 752ECDB4228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.h */, + 752ECDB5228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.m */, + 755F176122A00B7C0041B9CB /* SDLMenuManagerConstants.h */, + ); + name = "Dynamic Menu Update Utilities"; + sourceTree = ""; + }; 880245A120F79BDA00ED195B /* Configuration */ = { isa = PBXGroup; children = ( @@ -6343,6 +6354,7 @@ 5D61FDF11A84238C00846EE7 /* SDLUpdateTurnList.h in Headers */, 5DB996571F268ECB002D8795 /* SDLControlFramePayloadAudioStartServiceAck.h in Headers */, 5D61FD671A84238C00846EE7 /* SDLResult.h in Headers */, + 755F176222A00B7C0041B9CB /* SDLMenuManagerConstants.h in Headers */, 5D61FD351A84238C00846EE7 /* SDLPowerModeStatus.h in Headers */, 5D61FD971A84238C00846EE7 /* SDLSingleTireStatus.h in Headers */, 5D61FCE21A84238C00846EE7 /* SDLKeyboardLayout.h in Headers */, @@ -6464,7 +6476,7 @@ 5D61FC821A84238C00846EE7 /* SDLDeviceInfo.h in Headers */, 5DD60D98221C5D7D00A82A4F /* SDLVersion.h in Headers */, 5D61FCA91A84238C00846EE7 /* SDLFileType.h in Headers */, - 756C62762289F11F008B57A2 /* SDLMenuRunScore.h in Headers */, + 756C62762289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.h in Headers */, 8877F5EE1F34A72200DC128A /* SDLSendHapticDataResponse.h in Headers */, DA8966F21E56973700413EAB /* SDLStreamingMediaManagerConstants.h in Headers */, 883C22C8222ED84D00939C4C /* SDLRPCFunctionNames.h in Headers */, @@ -6606,7 +6618,7 @@ 5D61FCAD1A84238C00846EE7 /* SDLFunctionID.h in Headers */, DA9F7E831DCC047200ACAE48 /* SDLWayPointType.h in Headers */, 5D61FDF51A84238C00846EE7 /* SDLV1ProtocolHeader.h in Headers */, - 752ECDB6228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.h in Headers */, + 752ECDB6228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.h in Headers */, 5D92936320B3551600FCC775 /* SDLKeyboardDelegate.h in Headers */, 5D92936820B3601700FCC775 /* SDLChoiceSetManager.h in Headers */, 5DBF06351E64A9FE00A5CF03 /* SDLLogConstants.h in Headers */, @@ -7237,7 +7249,7 @@ 8818ADD92100FC18007D6F19 /* SDLTurnSignal.m in Sources */, 5D8B17541AC9E11B006A6E1C /* SDLDialNumberResponse.m in Sources */, DA6223BE1E7B088200878689 /* CVPixelBufferRef+SDLUtil.m in Sources */, - 752ECDB7228B4D6B00D945F4 /* SDLMenuUpdateAlgorithm.m in Sources */, + 752ECDB7228B4D6B00D945F4 /* SDLDynamicMenuUpdateAlgorithm.m in Sources */, 1FF7DABC1F75B2BF00B46C30 /* SDLFocusableItemLocator.m in Sources */, EED5CA021F4D18EC00F04000 /* SDLRAWH264Packetizer.m in Sources */, 5D61FC851A84238C00846EE7 /* SDLDeviceLevelStatus.m in Sources */, @@ -7292,7 +7304,7 @@ 880D267E220DE5DF00B3F496 /* SDLWeatherServiceManifest.m in Sources */, 5D9FC2A21FD8814A00ACA5C2 /* SDLAudioFile.m in Sources */, E9C32B9F1AB20C5900F283AF /* EAAccessoryManager+SDLProtocols.m in Sources */, - 756C62772289F11F008B57A2 /* SDLMenuRunScore.m in Sources */, + 756C62772289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m in Sources */, 5D61FDA81A84238C00846EE7 /* SDLSpeakResponse.m in Sources */, 5DB92D331AC9C8BA00C15BB0 /* SDLRPCStruct.m in Sources */, 1EAA474220355FF3000FE74B /* SDLLightControlCapabilities.m in Sources */, diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec index 40acabfea..7ebcc00ce 100644 --- a/SmartDeviceLink.podspec +++ b/SmartDeviceLink.podspec @@ -205,6 +205,7 @@ sdefault.public_header_files = [ 'SmartDeviceLink/SDLMediaServiceManifest.h', 'SmartDeviceLink/SDLMediaType.h', 'SmartDeviceLink/SDLMenuCell.h', +'SmartDeviceLink/SDLMenuManagerConstants.h, 'SmartDeviceLink/SDLMenuParams.h', 'SmartDeviceLink/SDLMetadataTags.h', 'SmartDeviceLink/SDLMetadataType.h', diff --git a/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.h b/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.h new file mode 100644 index 000000000..64d7d2585 --- /dev/null +++ b/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.h @@ -0,0 +1,28 @@ +// +// SDLMenuUpdateAlgorithm.h +// SmartDeviceLink +// +// Created by Justin Gluck on 5/14/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +@class SDLDynamicMenuUpdateRunScore; +@class SDLMenuCell; + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLDynamicMenuUpdateAlgorithm : NSObject + +/** + Compares the old and the new menus to find the best combination of add and delete commands + + @param oldMenuCells The old menu array + @param updatedMenuCells The new menu array + */ ++ (nullable SDLDynamicMenuUpdateRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m new file mode 100644 index 000000000..552bf6644 --- /dev/null +++ b/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m @@ -0,0 +1,104 @@ +// +// SDLMenuUpdateAlgorithm.m +// SmartDeviceLink +// +// Created by Justin Gluck on 5/14/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLDynamicMenuUpdateAlgorithm.h" +#import "SDLDynamicMenuUpdateRunScore.h" +#import "SDLMenuCell.h" +#import "SDLLogMacros.h" +#import "SDLMenuManagerConstants.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation SDLDynamicMenuUpdateAlgorithm + +#pragma mark - Update Menu Cells ++ (nullable SDLDynamicMenuUpdateRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ + if(oldMenuCells.count > 0 && updatedMenuCells.count == 0) { + return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesforMenu:oldMenuCells] updatedStatus:@[] score:0]; + }else if(oldMenuCells.count == 0 && updatedMenuCells.count > 0) { + return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllAddStatusesForMenu:updatedMenuCells] score:updatedMenuCells.count]; + } else if(oldMenuCells.count == 0 && updatedMenuCells.count == 0) { + return nil; + } + + return [SDLDynamicMenuUpdateAlgorithm sdl_startCompareAtRun:0 oldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; +} + ++ (nullable SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)startRun oldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells { + SDLDynamicMenuUpdateRunScore *bestScore = nil; + + for (NSUInteger run = startRun; run < oldMenuCells.count; run++) { + // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds + NSMutableArray *oldMenuStatus = [SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesforMenu:oldMenuCells]; + NSMutableArray *newMenuStatus = [SDLDynamicMenuUpdateAlgorithm sdl_buildAllAddStatusesForMenu:updatedMenuCells]; + + NSUInteger startIndex = 0; + for(NSUInteger oldCellIndex = run; oldCellIndex < oldMenuCells.count; oldCellIndex++) { //For each old item + // Create inner loop to compare old cells to new cells to find a match, if a match if found we mark the index at match for both the old and the new status to keep since we do not want to send RPCs for those cases + for(NSUInteger newCellIndex = startIndex; newCellIndex < updatedMenuCells.count; newCellIndex++) { + if([oldMenuCells[oldCellIndex] isEqual:updatedMenuCells[newCellIndex]]) { + oldMenuStatus[oldCellIndex] = @(MenuCellStateKeep); + newMenuStatus[newCellIndex] = @(MenuCellStateKeep); + startIndex = newCellIndex + 1; + break; + } + } + } + + // Add RPC are the biggest operation so we need to find the run with the least amount of Adds. We will reset the run we use each time a runscore is less than the current score. + NSUInteger numberOfAdds = 0; + for(NSUInteger status = 0; status < newMenuStatus.count; status++) { + // 0 = Delete 1 = Add 2 = Keep + if(newMenuStatus[status].integerValue == MenuCellStateAdd) { + numberOfAdds++; + } + } + + // As soon as we a run that requires 0 Adds we will use it since we cant do better then 0 + if(numberOfAdds == 0) { + bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; + return bestScore; + } + // if we havent create the bestScore object or if the current score beats the old score then we will create a new bestScore + if(bestScore == nil || numberOfAdds < bestScore.score) { + bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; + } + } + + return bestScore; +} + +/** + Builds a 1-1 array of Deletes for every element in the array + + @param oldMenu The old menu array + */ ++ (NSMutableArray *)sdl_buildAllDeleteStatusesforMenu:(NSArray *)oldMenu { + NSMutableArray *oldMenuStatus = [[NSMutableArray alloc] init]; + for(NSUInteger index = 0; index < oldMenu.count; index++) { + [oldMenuStatus addObject:@(MenuCellStateDelete)]; + } + return [oldMenuStatus mutableCopy]; +} + +/** + Builds a 1-1 array of Adds for every element in the array + + @param newMenu The new menu array + */ ++ (NSMutableArray *)sdl_buildAllAddStatusesForMenu:(NSArray *)newMenu { + NSMutableArray *newMenuStatus = [[NSMutableArray alloc] init]; + for(NSUInteger index = 0; index < newMenu.count; index++) { + [newMenuStatus addObject:@(MenuCellStateAdd)]; + } + return [newMenuStatus mutableCopy]; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLDynamicMenuUpdateRunScore.h b/SmartDeviceLink/SDLDynamicMenuUpdateRunScore.h new file mode 100644 index 000000000..12f251970 --- /dev/null +++ b/SmartDeviceLink/SDLDynamicMenuUpdateRunScore.h @@ -0,0 +1,34 @@ +// +// SDLMenuRunScore.h +// SmartDeviceLink +// +// Created by Justin Gluck on 5/13/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLDynamicMenuUpdateRunScore : NSObject + +/** + Will contain all the Deletes and Keeps + */ +@property (copy, nonatomic, readonly) NSArray *oldStatus; + +/** + Will contain all the Adds and Keeps + */ +@property (copy, nonatomic, readonly) NSArray *updatedStatus; + +/** + Will contain the score, number of total Adds that will need to be created + */ +@property (assign, nonatomic, readonly) NSUInteger score; + +- (instancetype)initWithOldStatus:(NSArray *)oldStatus updatedStatus:(NSArray *)updatedStatus score:(NSUInteger)score; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLDynamicMenuUpdateRunScore.m b/SmartDeviceLink/SDLDynamicMenuUpdateRunScore.m new file mode 100644 index 000000000..5066904a5 --- /dev/null +++ b/SmartDeviceLink/SDLDynamicMenuUpdateRunScore.m @@ -0,0 +1,28 @@ +// +// SDLMenuRunScore.m +// SmartDeviceLink +// +// Created by Justin Gluck on 5/13/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLDynamicMenuUpdateRunScore.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation SDLDynamicMenuUpdateRunScore + +- (instancetype)initWithOldStatus:(NSArray *)oldStatus updatedStatus:(NSArray *)updatedStatus score:(NSUInteger)score { + self = [super init]; + if (!self) { return nil; } + + _oldStatus = oldStatus; + _updatedStatus = updatedStatus; + _score = score; + + return self; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLMenuManager.h b/SmartDeviceLink/SDLMenuManager.h index 0671b8524..f559b6fb8 100644 --- a/SmartDeviceLink/SDLMenuManager.h +++ b/SmartDeviceLink/SDLMenuManager.h @@ -7,7 +7,7 @@ // #import -#import "SDLScreenManager.h" +#import "SDLMenuManagerConstants.h" @class SDLFileManager; @class SDLMenuCell; diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index b86df4612..2c757592c 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -22,8 +22,8 @@ #import "SDLLogMacros.h" #import "SDLMenuCell.h" #import "SDLMenuParams.h" -#import "SDLMenuRunScore.h" -#import "SDLMenuUpdateAlgorithm.h" +#import "SDLDynamicMenuUpdateRunScore.h" +#import "SDLDynamicMenuUpdateAlgorithm.h" #import "SDLOnCommand.h" #import "SDLOnHMIStatus.h" #import "SDLRegisterAppInterfaceResponse.h" @@ -58,7 +58,7 @@ @interface SDLMenuManager() @property (assign, nonatomic) UInt32 lastMenuId; @property (copy, nonatomic) NSArray *oldMenuCells; -@property (copy, nonatomic, nullable) SDLMenuRunScore *runScore; +@property (copy, nonatomic, nullable) SDLDynamicMenuUpdateRunScore *runScore; @end UInt32 const ParentIdNotFound = UINT32_MAX; @@ -149,82 +149,31 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; - if([self checkUpdateMode: self.dynamicMenuUpdatesMode]) { - // RunScore will contain the best possible combination of ADDS, DELETES and KEEPS. oldStatus(Deletes/Keeps) updatedStatus(Adds/Keeps), - _runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; - - NSArray *deleteMenuStatus = self.runScore.oldStatus; - NSArray *addMenuStatus = self.runScore.updatedStatus; - - NSArray *cellsToDelete = [self buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; - - // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares - NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; - - // Since we may be adding cells to the list we need to update those cells to have a cellID - [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; - - // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. - [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; - - // Upload the artworks - NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; - if (artworksToBeUploaded.count > 0) { - [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { - if (error != nil) { - SDLLogE(@"Error uploading menu artworks: %@", error); - } - SDLLogD(@"Menu artworks uploaded"); - __weak typeof(self) weakself = self; - [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { - [weakself sendSubMenuUpdates:oldKeeps newKeepCell:newKeeps atIndex:0]; - }]; - }]; - } - - __weak typeof(self) weakself = self; - [self sdl_updateCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd withCompletionHandler:^(NSError * _Nullable error) { - [weakself sendSubMenuUpdates:oldKeeps newKeepCell:newKeeps atIndex:0]; - }]; + if([self sdl_isDynamicMenuUpdateActive: self.dynamicMenuUpdatesMode]) { + [self sdl_startDynamicMenuUpdate]; } else { - self.lastMenuId = MenuCellIdMin; - [self sdl_updateIdsOnMenuCells:menuCells parentId:ParentIdNotFound]; - - NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; - if (artworksToBeUploaded.count > 0) { - [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { - if (error != nil) { - SDLLogE(@"Error uploading menu artworks: %@", error); - } - - SDLLogD(@"Menu artworks uploaded"); - [self sdl_updateCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells withCompletionHandler:nil]; - }]; - } - [self sdl_updateCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells withCompletionHandler:nil]; + [self sdl_startNonDynamicMenuUpdate]; } } #pragma mark - Build Deletes, Keeps, Adds -- (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { +- (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKeptCells newKeptCells:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { if(oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) { self.inProgressUpdate = nil; return; } if(oldKeptCells[startIndex].subCells.count > 0) { - SDLMenuRunScore *tempScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldKeptCells[startIndex].subCells updatedMenuCells:newKeptCells[startIndex].subCells]; + SDLDynamicMenuUpdateRunScore *tempScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldKeptCells[startIndex].subCells updatedMenuCells:newKeptCells[startIndex].subCells]; NSArray *deleteMenuStatus = tempScore.oldStatus; NSArray *addMenuStatus = tempScore.updatedStatus; - NSArray *cellsToDelete = [self buildDeleteMenuItems:deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; - NSArray *cellsToAdd = [self buildAddMenuItems:addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + NSArray *cellsToDelete = [self sdl_buildDeleteMenuItems:deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; + NSArray *cellsToAdd = [self sdl_buildAddMenuItems:addMenuStatus compareTo:newKeptCells[startIndex].subCells]; - NSArray *oldKeeps = [self buildOldKeepMenuItems: deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; - NSArray *newKeeps = [self buildKeepNewMenuItems: addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + NSArray *oldKeeps = [self sdl_buildOldKeepMenuItems: deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; + NSArray *newKeeps = [self sdl_buildKeepNewMenuItems: addMenuStatus compareTo:newKeptCells[startIndex].subCells]; [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId]; [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; @@ -232,59 +181,79 @@ - (void)sendSubMenuUpdates:(NSArray *)oldKeptCells newKeepCell:(N __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:cellsToDelete withCompletionHandler:^(NSError * _Nullable error) { [weakself sdl_sendUpdatedMenu:cellsToAdd usingMenu:weakself.menuCells[startIndex].subCells withCompletionHandler:^(NSError * _Nullable error) { - [weakself sendSubMenuUpdates:oldKeptCells newKeepCell:newKeptCells atIndex:(startIndex + 1)]; + // After the first set of submenu cells were added and deleted we must find the next set of subcells untll we loop through all the elemetns + [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeptCells newKeptCells:newKeptCells atIndex:(startIndex + 1)]; }]; }]; } else { - [self sendSubMenuUpdates:oldKeptCells newKeepCell:newKeptCells atIndex:(startIndex + 1)]; + // After the first set of submenu cells were added and deleted we must find the next set of subcells untll we loop through all the elemetns + [self sdl_startSubMenuUpdatesWithOldKeptCells:oldKeptCells newKeptCells:newKeptCells atIndex:(startIndex + 1)]; } } -// Main Menu -- (NSArray *)buildDeleteMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { +- (NSArray *)sdl_buildDeleteMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,0,2,0] => [A,B,C,D] = [B,D] - [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { - if(status.integerValue == 0) { // 0 means the cell was marked for Deletion + for(NSUInteger index = 0; index < oldStatusList.count; index++) { + if(oldStatusList[index].integerValue == MenuCellStateDelete) { [deleteCells addObject:oldList[index]]; } - }]; + } +// [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { +// if(status.integerValue == 0) { // 0 means the cell was marked for Deletion +// [deleteCells addObject:oldList[index]]; +// } +// }]; return [deleteCells copy]; } -- (NSArray *)buildAddMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)menuList { +- (NSArray *)sdl_buildAddMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)menuList { NSMutableArray *addCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,1,2,1] => [A,B,C,D] = [B,D] - [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { - if(status.integerValue == 1) { // 1 means the cell was marked for add + for(NSUInteger index = 0; index < newStatusList.count; index++) { + if(newStatusList[index].integerValue == MenuCellStateAdd) { [addCells addObject:menuList[index]]; } - }]; + } +// [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { +// if(status.integerValue == 1) { // 1 means the cell was marked for add +// [addCells addObject:menuList[index]]; +// } +// }]; return [addCells copy]; } -- (NSArray *)buildOldKeepMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { +- (NSArray *)sdl_buildOldKeepMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { - if(status.integerValue == 2) { // 2 means the cell was marked for Keep + for(NSUInteger index = 0; index < oldStatusList.count; index++) { + if(oldStatusList[index].integerValue == MenuCellStateKeep) { [keepMenuCells addObject:oldList[index]]; } - }]; + } +// [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { +// if(status.integerValue == 2) { // 2 means the cell was marked for Keep +// [keepMenuCells addObject:oldList[index]]; +// } +// }]; return [keepMenuCells copy]; } -- (NSArray *)buildKeepNewMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)newList { +- (NSArray *)sdl_buildKeepNewMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)newList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - - [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { - if(status.integerValue == 2) { // 2 means the cell was marked for Keep + for(NSUInteger index = 0; index < newStatusList.count; index++) { + if(newStatusList[index].integerValue == MenuCellStateKeep) { [keepMenuCells addObject:newList[index]]; } - }]; + } +// [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { +// if(status.integerValue == 2) { // 2 means the cell was marked for Keep +// [keepMenuCells addObject:newList[index]]; +// } +// }]; return [keepMenuCells copy]; } @@ -298,7 +267,67 @@ - (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCell #pragma mark - Updating System -- (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells withCompletionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { +- (void)sdl_startDynamicMenuUpdate { + _runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; + + NSArray *deleteMenuStatus = self.runScore.oldStatus; + NSArray *addMenuStatus = self.runScore.updatedStatus; + + NSArray *cellsToDelete = [self sdl_buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *cellsToAdd = [self sdl_buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; + // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares + NSArray *oldKeeps = [self sdl_buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *newKeeps = [self sdl_buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; + + // Cells that will be added need new ids + [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; + + // Since we are creating a new Menu but keeping old cells we must firt transfer the old cellIDs to the new menus kept cells. + [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; + + // Upload the artworks + NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; + if (artworksToBeUploaded.count > 0) { + [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { + if (error != nil) { + SDLLogE(@"Error uploading menu artworks: %@", error); + } + SDLLogD(@"Menu artworks uploaded"); + // Update cells with artworks once they're uploaded + __weak typeof(self) weakself = self; + [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) { + [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0]; + }]; + }]; + } + // Update cells without artworks + __weak typeof(self) weakself = self; + [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) { + [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0]; + }]; +} + +- (void)sdl_startNonDynamicMenuUpdate { + self.lastMenuId = MenuCellIdMin; + [self sdl_updateIdsOnMenuCells:self.menuCells parentId:ParentIdNotFound]; + + NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; + if (artworksToBeUploaded.count > 0) { + [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { + if (error != nil) { + SDLLogE(@"Error uploading menu artworks: %@", error); + } + + SDLLogD(@"Menu artworks uploaded"); + // Update cells with artworks once they're uploaded + [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; + }]; + } + // Update cells without artworks + [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; +} + +- (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells completionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone] || [self.currentSystemContext isEqualToEnum:SDLSystemContextMenu]) { @@ -323,7 +352,7 @@ - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd } if (weakself.hasQueuedUpdate) { - [weakself sdl_updateCellsToDelete:deleteCells cellsToAdd:addCells withCompletionHandler:nil]; + [weakself sdl_updateMenuWithCellsToDelete:deleteCells cellsToAdd:addCells completionHandler:nil]; weakself.hasQueuedUpdate = NO; } }]; @@ -333,12 +362,12 @@ - (void)sdl_updateCellsToDelete:(NSArray *)deleteCells cellsToAdd #pragma mark Delete Old Menu Items - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuCells withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { - if (self.oldMenuCells.count == 0 || deleteMenuCells == nil) { + if (deleteMenuCells.count == 0) { completionHandler(nil); return; } - NSArray *deleteMenuCommands = [self sdl_deleteCommandsForCells: deleteMenuCells]; + NSArray *deleteMenuCommands = [self sdl_deleteCommandsForCells:deleteMenuCells]; [self.connectionManager sendRequests:deleteMenuCommands progressHandler:nil completionHandler:^(BOOL success) { if (!success) { SDLLogW(@"Unable to delete all old menu commands"); @@ -352,6 +381,13 @@ - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuC #pragma mark Send New Menu Items +/** + Creates add commands + + @param updatedMenu The cells you will be adding + @param menu The list of all cells. This may be different then self.menuCells since this function is called on subcell cells as well. When comparing 2 sub menu cells this function will be passed the list of all subcells on that cell. + @param completionHandler handler + */ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSArray *)menu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { if (self.menuCells.count == 0) { SDLLogD(@"No main menu to send"); @@ -407,17 +443,14 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSA #pragma mark - Helpers -- (BOOL)checkUpdateMode:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { +- (BOOL)sdl_isDynamicMenuUpdateActive:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { switch (dynamicMenuUpdatesMode) { case SDLDynamicMenuUpdatesModeForceOn: return true; - break; case SDLDynamicMenuUpdatesModeForceOff: return false; - break; case SDLDynamicMenuUpdatesModeOnWithCompatibility: - return [self.displayCapabilities.displayName isEqualToString:@"GEN3_8_INCH"] ? false : true; - break; + return ![self.displayCapabilities.displayName isEqualToEnum:SDLDisplayTypeGen38Inch]; } } @@ -476,20 +509,20 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U } #pragma mark Commands / SubMenu RPCs - - (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexOf:(NSArray *)menu { NSMutableArray *mutableCommands = [NSMutableArray array]; - [menu enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull menuCell, NSUInteger mainIndex, BOOL * _Nonnull stop) { - [cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull updatedCell, NSUInteger updatedIndex, BOOL * _Nonnull stop) { - if([menuCell isEqual:updatedCell]) { - if (updatedCell.subCells.count > 0) { - [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:updatedCell withArtwork:shouldHaveArtwork position:(UInt16)mainIndex]]; + + for(NSUInteger menuInteger = 0; menuInteger < menu.count; menuInteger++) { + for(NSUInteger updateCellsIndex = 0; updateCellsIndex < cells.count; updateCellsIndex++) { + if([menu[menuInteger] isEqual:cells[updateCellsIndex]]) { + if(cells[updateCellsIndex].subCells.count > 0) { + [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[updateCellsIndex] withArtwork:shouldHaveArtwork position:(UInt16)menuInteger]]; } else { - [mutableCommands addObject:[self sdl_commandForMenuCell:updatedCell withArtwork:shouldHaveArtwork position:(UInt16)mainIndex]]; + [mutableCommands addObject:[self sdl_commandForMenuCell:cells[updateCellsIndex] withArtwork:shouldHaveArtwork position:(UInt16)menuInteger]]; } } - }]; - }]; + } + } return [mutableCommands copy]; } @@ -519,7 +552,6 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U return [mutableCommands copy]; } -//Loop thought keep compare to oldMenu and transfer cell Ids to new cells - (SDLAddCommand *)sdl_commandForMenuCell:(SDLMenuCell *)cell withArtwork:(BOOL)shouldHaveArtwork position:(UInt16)position { SDLAddCommand *command = [[SDLAddCommand alloc] init]; diff --git a/SmartDeviceLink/SDLMenuManagerConstants.h b/SmartDeviceLink/SDLMenuManagerConstants.h new file mode 100644 index 000000000..8ff19ea82 --- /dev/null +++ b/SmartDeviceLink/SDLMenuManagerConstants.h @@ -0,0 +1,28 @@ +// +// SDLMenuManagerConstants.h +// SmartDeviceLink +// +// Created by Justin Gluck on 5/30/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import + +/** + Dynamic Menu Manager Mode + + - SDLDynamicMenuUpdatesModeForceOn: Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues. + - SDLDynamicMenuUpdatesModeForceOn: This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units. + - SDLDynamicMenuUpdatesModeForceOff: This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus. + */ +typedef NS_ENUM(NSUInteger, SDLDynamicMenuUpdatesMode) { + SDLDynamicMenuUpdatesModeForceOn = 0, + SDLDynamicMenuUpdatesModeForceOff, + SDLDynamicMenuUpdatesModeOnWithCompatibility +}; + +typedef NS_ENUM(NSUInteger, MenuCellState) { + MenuCellStateDelete = 0, + MenuCellStateAdd, + MenuCellStateKeep +}; diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.h b/SmartDeviceLink/SDLMenuUpdateAlgorithm.h deleted file mode 100644 index ca0fa71b7..000000000 --- a/SmartDeviceLink/SDLMenuUpdateAlgorithm.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// SDLMenuUpdateAlgorithm.h -// SmartDeviceLink -// -// Created by Justin Gluck on 5/14/19. -// Copyright © 2019 smartdevicelink. All rights reserved. -// - -#import - -@class SDLMenuRunScore; -@class SDLMenuCell; - -NS_ASSUME_NONNULL_BEGIN - -@interface SDLMenuUpdateAlgorithm : NSObject - -+ (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells; -+ (NSMutableArray *)buildDeleteStatus:(NSArray *)oldMenu; -+ (NSMutableArray *)buildAddStatus:(NSArray *)newMenu; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLMenuUpdateAlgorithm.m deleted file mode 100644 index 516fdbc30..000000000 --- a/SmartDeviceLink/SDLMenuUpdateAlgorithm.m +++ /dev/null @@ -1,121 +0,0 @@ -// -// SDLMenuUpdateAlgorithm.m -// SmartDeviceLink -// -// Created by Justin Gluck on 5/14/19. -// Copyright © 2019 smartdevicelink. All rights reserved. -// - -#import "SDLMenuUpdateAlgorithm.h" -#import "SDLMenuRunScore.h" -#import "SDLMenuCell.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef NS_ENUM(NSUInteger, MenuCellState) { - MenuCellStateDelete, - MenuCellStateAdd, - MenuCellStateKeep -}; - -@implementation SDLMenuUpdateAlgorithm - -#pragma mark - Update Menu Cells -+ (nullable SDLMenuRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ - //Compare old and new menus, maybe make sure we have less then 100 Cells - if(oldMenuCells.count && !updatedMenuCells.count) { - return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells] score:0]; - } - if(!oldMenuCells.count && updatedMenuCells.count) { - return [[SDLMenuRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLMenuUpdateAlgorithm buildAddStatus:updatedMenuCells] score:updatedMenuCells.count]; - } - - if(!oldMenuCells.count && !updatedMenuCells.count) { - return nil; - } - - for(SDLMenuCell *cell in oldMenuCells) { - NSLog(@"OldCellOrder = %@", cell.title); - } - for(SDLMenuCell *cell in updatedMenuCells) { - NSLog(@"NewCellOrder = %@", cell.title); - } - - // SDLMenuRunScore *bestScoreMenu = nil; - - return [SDLMenuUpdateAlgorithm startCompareAtRun:0 oldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; -} - -+ (nullable SDLMenuRunScore *)startCompareAtRun:(NSUInteger)startRun oldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells { - SDLMenuRunScore *bestScoreMenu = nil; - - if(startRun >= oldMenuCells.count) { - return bestScoreMenu; - } - - for (NSUInteger run = startRun; run < oldMenuCells.count; run++) { //For each run - // Set the menu status as a 1-1 array, start off will oldMenus = all Deletes, newMenu = all Adds - NSMutableArray *oldMenuStatus = [SDLMenuUpdateAlgorithm buildDeleteStatus:oldMenuCells]; - NSMutableArray *newMenuStatus = [SDLMenuUpdateAlgorithm buildAddStatus:updatedMenuCells]; - - NSUInteger startIndex = 0; - for(NSUInteger oldCellIndex = run; oldCellIndex < oldMenuCells.count; oldCellIndex++) { //For each old item - //Create inner loop to compare old cells to new cells to find a match, if a match if found we mark the index at match for both the old and the new status to keep since we do not want to send RPCs for those cases - for(NSUInteger newCellIndex = startIndex; newCellIndex < updatedMenuCells.count; newCellIndex++) { - if([oldMenuCells[oldCellIndex] isEqual:updatedMenuCells[newCellIndex]]) { - oldMenuStatus[oldCellIndex] = @(MenuCellStateKeep); - newMenuStatus[newCellIndex] = @(MenuCellStateKeep); - startIndex = newCellIndex + 1; - break; - } - } - } - - NSUInteger numberOfAdds = 0; - for(NSUInteger status = 0; status < newMenuStatus.count; status++) { - // 0 = Delete 1 = Add 2 = Keep - if(newMenuStatus[status].integerValue == 1) { - numberOfAdds++; - } - } - - if(numberOfAdds == 0) { - bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; - NSLog(@"BestScore: %lu", (unsigned long)bestScoreMenu.score); - NSLog(@"OldMenuStatus: %@",bestScoreMenu.oldStatus); - NSLog(@"NewMenuStatus: %@",bestScoreMenu.updatedStatus); - return bestScoreMenu; - } - - NSLog(@"Run: %lu, RunScore: %lu", (unsigned long)run, (unsigned long)numberOfAdds); - if(bestScoreMenu == nil || numberOfAdds < bestScoreMenu.score) { - bestScoreMenu = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; - } - } - - NSLog(@"BestScore: %lu", (unsigned long)bestScoreMenu.score); - NSLog(@"OldMenuStatus: %@",bestScoreMenu.oldStatus); - NSLog(@"NewMenuStatus: %@",bestScoreMenu.updatedStatus); - - return bestScoreMenu; -} - -+ (NSMutableArray *)buildDeleteStatus:(NSArray *)oldMenu { - NSMutableArray *oldMenuStatus = [[NSMutableArray alloc] init]; - for(SDLMenuCell *cells in oldMenu) { - [oldMenuStatus addObject:@(MenuCellStateDelete)]; - } - return [oldMenuStatus mutableCopy]; -} - -+ (NSMutableArray *)buildAddStatus:(NSArray *)newMenu { - NSMutableArray *newMenuStatus = [[NSMutableArray alloc] init]; - for(SDLMenuCell *cells in newMenu) { - [newMenuStatus addObject:@(MenuCellStateAdd)]; - } - return [newMenuStatus mutableCopy]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLScreenManager.h b/SmartDeviceLink/SDLScreenManager.h index 8eae28f71..91e0498be 100644 --- a/SmartDeviceLink/SDLScreenManager.h +++ b/SmartDeviceLink/SDLScreenManager.h @@ -11,6 +11,7 @@ #import "SDLInteractionMode.h" #import "SDLMetadataType.h" #import "SDLTextAlignment.h" +#import "SDLMenuManagerConstants.h" @class SDLArtwork; @class SDLChoiceCell; @@ -27,28 +28,6 @@ NS_ASSUME_NONNULL_BEGIN -typedef enum { - /** - * FORCE_ON: Forces on compatibility mode. This will force the menu manager to delete and re-add - * each menu item for every menu update. This mode is generally not advised due to performance issues. - */ - SDLDynamicMenuUpdatesModeForceOn = 0, - - /** - * FORCE_OFF: This mode forces the menu manager to always dynamically update menu items for each menu - * update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units. - */ - SDLDynamicMenuUpdatesModeForceOff = 1, - - /** - * ON_WITH_COMPAT_MODE: This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known - * menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update - * the menus. - */ - SDLDynamicMenuUpdatesModeOnWithCompatibility = 2 - -} SDLDynamicMenuUpdatesMode; - /** The handler run when the update has completed @@ -144,7 +123,7 @@ typedef void(^SDLPreloadChoiceCompletionHandler)(NSError *__nullable error); /** The current status for dynamic menu updates. */ -@property (nonatomic, assign) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; +@property (assign, nonatomic) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; /** The current list of voice commands available for the user to speak and be recognized by the IVI's voice recognition engine. diff --git a/SmartDeviceLink/SmartDeviceLink.h b/SmartDeviceLink/SmartDeviceLink.h index 4ae1a7d37..6340e714b 100644 --- a/SmartDeviceLink/SmartDeviceLink.h +++ b/SmartDeviceLink/SmartDeviceLink.h @@ -310,6 +310,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[]; #import "SDLMassageZone.h" #import "SDLMediaClockFormat.h" #import "SDLMediaType.h" +#import "SDLMenuManagerConstants.h" #import "SDLMetadataType.h" #import "SDLModuleType.h" #import "SDLNavigationAction.h" diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index f5b3ce83a..8d6877303 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -14,6 +14,7 @@ #import "SDLImageFieldName.h" #import "SDLMenuCell.h" #import "SDLMenuManager.h" +#import "SDLMenuManagerConstants.h" #import "SDLOnCommand.h" #import "SDLOnHMIStatus.h" #import "SDLRPCNotificationNotification.h" @@ -285,7 +286,7 @@ @interface SDLMenuManager() expect(adds).to(haveCount(2)); }); - it(@"should send dynamic deletes first then dynamic adds case 2", ^{ + fit(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -307,7 +308,7 @@ @interface SDLMenuManager() expect(submenu).to(haveCount(2)); }); - it(@"should send dynamic deletes first then dynamic adds case 3", ^{ + it(@"should send dynamic deletes first then dynamic adds when removing one submenu cell", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -333,14 +334,15 @@ @interface SDLMenuManager() expect(submenu).to(haveCount(2)); }); - it(@"should send dynamic deletes first then dynamic adds case 4", ^{ + it(@"should send dynamic deletes first then dynamic adds when adding one new cell", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell, textOnlyCell2]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -355,7 +357,7 @@ @interface SDLMenuManager() expect(submenu).to(haveCount(2)); }); - it(@"should send dynamic deletes first then dynamic adds case 5", ^{ + it(@"should send dynamic deletes first then dynamic adds when cells stay the same", ^{ testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; diff --git a/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m b/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m index a760dd264..1c2fca4fe 100644 --- a/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m +++ b/SmartDeviceLinkTests/SDLMenuRunScoreSpec.m @@ -2,19 +2,19 @@ #import #import -#import "SDLMenuRunScore.h" +#import "SDLDynamicMenuUpdateRunScore.h" QuickSpecBegin(SDLMenuRunScoreSpec) describe(@"menuRunScore", ^{ - __block SDLMenuRunScore *runScore = nil; + __block SDLDynamicMenuUpdateRunScore *runScore = nil; beforeEach(^{ NSArray *oldMenuStatus = @[@1, @2, @3]; NSArray *updatedMenuStatus = @[@3, @2, @1]; NSUInteger numberOfAdds = 5; - runScore = [[SDLMenuRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:updatedMenuStatus score:numberOfAdds]; + runScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:updatedMenuStatus score:numberOfAdds]; }); it(@"should instantiate correctly", ^{ diff --git a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m index bd33e8105..6ac300cc7 100644 --- a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m +++ b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m @@ -11,8 +11,8 @@ #import #import "SDLMenuCell.h" -#import "SDLMenuRunScore.h" -#import "SDLMenuUpdateAlgorithm.h" +#import "SDLDynamicMenuUpdateRunScore.h" +#import "SDLDynamicMenuUpdateAlgorithm.h" QuickSpecBegin(SDLMenuUpdateAlgorithmSpec) @@ -23,8 +23,7 @@ typedef NS_ENUM(NSUInteger, MenuCellState) { }; describe(@"menuUpdateAlgorithm", ^{ - __block SDLMenuRunScore *runScore = nil; - //__block SDLMenuUpdateAlgorithm *updatelgorithm = nil; + __block SDLDynamicMenuUpdateRunScore *runScore = nil; __block SDLMenuCell *oldCell1 = nil; __block SDLMenuCell *oldCell2 = nil; @@ -63,22 +62,22 @@ typedef NS_ENUM(NSUInteger, MenuCellState) { NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; NSArray *updatedMenuCells = @[newCell1, newCell2, newCell3, newCell4, newCell5]; - runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; expect(runScore.updatedStatus.count).to(equal(5)); expect(runScore.oldStatus.count).to(equal(4)); expect(runScore.score).to(equal(1)); - expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[4].integerValue).to(equal(@(MenuCellStateAdd))); + expect(runScore.updatedStatus[0].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[1].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[2].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[3].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[4].integerValue).to(equal(MenuCellStateAdd)); - expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.oldStatus[0].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[1].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[2].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[3].integerValue).to(equal(MenuCellStateKeep)); }); it(@"should have a new menu status of 222 and an old menu status of 2220 on best run", ^{ @@ -86,61 +85,80 @@ typedef NS_ENUM(NSUInteger, MenuCellState) { NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; NSArray *updatedMenuCells = @[newCell1, newCell2, newCell3]; - runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; expect(runScore.updatedStatus.count).to(equal(3)); expect(runScore.oldStatus.count).to(equal(4)); expect(runScore.score).to(equal(0)); - expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[0].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[1].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[2].integerValue).to(equal(MenuCellStateKeep)); - expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[3].integerValue).to(equal(@(MenuCellStateDelete))); + expect(runScore.oldStatus[0].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[1].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[2].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[3].integerValue).to(equal(MenuCellStateDelete)); }); it(@"should have a new menu status of 111 and an old menu status of 000 on best run", ^{ NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3]; NSArray *updatedMenuCells = @[newCell4, newCell5, newCell6]; - runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; expect(runScore.updatedStatus.count).to(equal(3)); expect(runScore.oldStatus.count).to(equal(3)); expect(runScore.score).to(equal(3)); - expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateAdd))); - expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateAdd))); - expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateAdd))); + expect(runScore.updatedStatus[0].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[1].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[2].integerValue).to(equal(MenuCellStateAdd)); - expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateDelete))); - expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateDelete))); - expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateDelete))); + expect(runScore.oldStatus[0].integerValue).to(equal(MenuCellStateDelete)); + expect(runScore.oldStatus[1].integerValue).to(equal(MenuCellStateDelete)); + expect(runScore.oldStatus[2].integerValue).to(equal(MenuCellStateDelete)); }); it(@"should have a new menu status of 1212 and an old menu status of 2020 on best run", ^{ NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; NSArray *updatedMenuCells = @[oldCell2, oldCell1, oldCell4, oldCell3 ]; - runScore = [SDLMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; expect(runScore.updatedStatus.count).to(equal(4)); expect(runScore.oldStatus.count).to(equal(4)); expect(runScore.score).to(equal(2)); - expect(runScore.updatedStatus[0].integerValue).to(equal(@(MenuCellStateAdd))); - expect(runScore.updatedStatus[1].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.updatedStatus[2].integerValue).to(equal(@(MenuCellStateAdd))); - expect(runScore.updatedStatus[3].integerValue).to(equal(@(MenuCellStateKeep))); + expect(runScore.updatedStatus[0].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[1].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.updatedStatus[2].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[3].integerValue).to(equal(MenuCellStateKeep)); - expect(runScore.oldStatus[0].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[1].integerValue).to(equal(@(MenuCellStateDelete))); - expect(runScore.oldStatus[2].integerValue).to(equal(@(MenuCellStateKeep))); - expect(runScore.oldStatus[3].integerValue).to(equal(@(MenuCellStateDelete))); + expect(runScore.oldStatus[0].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[1].integerValue).to(equal(MenuCellStateDelete)); + expect(runScore.oldStatus[2].integerValue).to(equal(MenuCellStateKeep)); + expect(runScore.oldStatus[3].integerValue).to(equal(MenuCellStateDelete)); }); + + it(@"should have no new menu status and an old menu status is 2222", ^{ + NSArray *oldMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; + NSArray *updatedMenuCells = @[]; + + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore.updatedStatus.count).to(equal(0)); + expect(runScore.oldStatus.count).to(equal(4)); + expect(runScore.score).to(equal(0)); + + expect(runScore.updatedStatus.count).to(equal(0)); + + expect(runScore.oldStatus[0].integerValue).to(equal(MenuCellStateDelete)); + expect(runScore.oldStatus[1].integerValue).to(equal(MenuCellStateDelete)); + expect(runScore.oldStatus[2].integerValue).to(equal(MenuCellStateDelete)); + expect(runScore.oldStatus[3].integerValue).to(equal(MenuCellStateDelete)); + }); + }); }); diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h index b538249b0..5b07db771 100644 --- a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h +++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.h @@ -27,7 +27,7 @@ NS_ASSUME_NONNULL_BEGIN */ @property (copy, nonatomic, nullable) SDLResponseHandler lastRequestBlock; -@property (copy, nonatomic, nullable) SDLMultipleRequestCompletionHandler lastMultipleCompletionBlock; +@property (copy, nonatomic, nullable) NSMutableArray *multipleCompletionBlocks; /** * Call the last request's block with a specific response. diff --git a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m index 5ba813171..4f823a4e6 100644 --- a/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m +++ b/SmartDeviceLinkTests/TestUtilities/TestConnectionManager.m @@ -22,6 +22,7 @@ - (instancetype)init { } _receivedRequests = [NSMutableArray<__kindof SDLRPCMessage *> array]; + _multipleCompletionBlocks = [NSMutableArray array]; return self; } @@ -50,7 +51,7 @@ - (void)sendRequests:(nonnull NSArray *)requests progressHandle } }]; - _lastMultipleCompletionBlock = completionHandler; + [_multipleCompletionBlocks addObject:completionHandler]; } - (void)sendSequentialRequests:(nonnull NSArray *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler { @@ -59,7 +60,7 @@ - (void)sendSequentialRequests:(nonnull NSArray *)requests prog progressHandler(request, nil, nil, (double)idx / (double)requests.count); }]; - _lastMultipleCompletionBlock = completionHandler; + [_multipleCompletionBlocks addObject:completionHandler]; } - (void)respondToLastRequestWithResponse:(__kindof SDLRPCResponse *)response { @@ -97,8 +98,10 @@ - (void)respondToRequestWithResponse:(__kindof SDLRPCResponse *)response request } - (void)respondToLastMultipleRequestsWithSuccess:(BOOL)success { - if (self.lastMultipleCompletionBlock != nil) { - self.lastMultipleCompletionBlock(success); + if (self.multipleCompletionBlocks.lastObject != nil) { + SDLMultipleRequestCompletionHandler block = [self.multipleCompletionBlocks.lastObject copy]; + [self.multipleCompletionBlocks removeLastObject]; + block(success); } } From d69416bc747965f0d47f1ad507af1f9f9ac12309 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 30 May 2019 12:47:17 -0400 Subject: [PATCH 122/179] removed old files that have been renamed --- SmartDeviceLink/SDLMenuCell.m | 1 - SmartDeviceLink/SDLMenuRunScore.h | 23 ----------------------- SmartDeviceLink/SDLMenuRunScore.m | 24 ------------------------ 3 files changed, 48 deletions(-) delete mode 100644 SmartDeviceLink/SDLMenuRunScore.h delete mode 100644 SmartDeviceLink/SDLMenuRunScore.m diff --git a/SmartDeviceLink/SDLMenuCell.m b/SmartDeviceLink/SDLMenuCell.m index e0b626286..81ba056bf 100644 --- a/SmartDeviceLink/SDLMenuCell.m +++ b/SmartDeviceLink/SDLMenuCell.m @@ -12,7 +12,6 @@ NS_ASSUME_NONNULL_BEGIN - @interface SDLMenuCell() @property (assign, nonatomic) UInt32 parentCellId; diff --git a/SmartDeviceLink/SDLMenuRunScore.h b/SmartDeviceLink/SDLMenuRunScore.h deleted file mode 100644 index 31125b389..000000000 --- a/SmartDeviceLink/SDLMenuRunScore.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// SDLMenuRunScore.h -// SmartDeviceLink -// -// Created by Justin Gluck on 5/13/19. -// Copyright © 2019 smartdevicelink. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface SDLMenuRunScore : NSObject - -@property (copy, nonatomic, readonly) NSArray *oldStatus; -@property (copy, nonatomic, readonly) NSArray *updatedStatus; -@property (assign, nonatomic, readonly) NSUInteger score; - -- (instancetype)initWithOldStatus:(NSArray *)oldStatus updatedStatus:(NSArray *)updatedStatus score:(NSUInteger)score; - -@end - -NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLMenuRunScore.m b/SmartDeviceLink/SDLMenuRunScore.m deleted file mode 100644 index 6a731fa0c..000000000 --- a/SmartDeviceLink/SDLMenuRunScore.m +++ /dev/null @@ -1,24 +0,0 @@ -// -// SDLMenuRunScore.m -// SmartDeviceLink -// -// Created by Justin Gluck on 5/13/19. -// Copyright © 2019 smartdevicelink. All rights reserved. -// - -#import "SDLMenuRunScore.h" - -@implementation SDLMenuRunScore - -- (instancetype)initWithOldStatus:(NSArray *)oldStatus updatedStatus:(NSArray *)updatedStatus score:(NSUInteger)score { - self = [super init]; - if (!self) { return nil; } - - _oldStatus = oldStatus; - _updatedStatus = updatedStatus; - _score = score; - - return self; -} - -@end From d2b3058364f0b8636ee02eb82e78725e9a0574cc Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 30 May 2019 12:49:37 -0400 Subject: [PATCH 123/179] removing old commented code --- SmartDeviceLink/SDLMenuManager.m | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 2c757592c..6229d1e4e 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -200,11 +200,6 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep [deleteCells addObject:oldList[index]]; } } -// [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { -// if(status.integerValue == 0) { // 0 means the cell was marked for Deletion -// [deleteCells addObject:oldList[index]]; -// } -// }]; return [deleteCells copy]; } @@ -217,11 +212,6 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep [addCells addObject:menuList[index]]; } } -// [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { -// if(status.integerValue == 1) { // 1 means the cell was marked for add -// [addCells addObject:menuList[index]]; -// } -// }]; return [addCells copy]; } @@ -233,12 +223,6 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep [keepMenuCells addObject:oldList[index]]; } } -// [oldStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { -// if(status.integerValue == 2) { // 2 means the cell was marked for Keep -// [keepMenuCells addObject:oldList[index]]; -// } -// }]; - return [keepMenuCells copy]; } @@ -249,12 +233,6 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep [keepMenuCells addObject:newList[index]]; } } -// [newStatusList enumerateObjectsUsingBlock:^(NSNumber * _Nonnull status, NSUInteger index, BOOL * _Nonnull stop) { -// if(status.integerValue == 2) { // 2 means the cell was marked for Keep -// [keepMenuCells addObject:newList[index]]; -// } -// }]; - return [keepMenuCells copy]; } @@ -386,7 +364,7 @@ - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuC @param updatedMenu The cells you will be adding @param menu The list of all cells. This may be different then self.menuCells since this function is called on subcell cells as well. When comparing 2 sub menu cells this function will be passed the list of all subcells on that cell. - @param completionHandler handler + @param completionHandler handler */ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSArray *)menu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { if (self.menuCells.count == 0) { From caa00690f54acca2db3a5fe10ed2425c795a0008 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 30 May 2019 12:52:40 -0400 Subject: [PATCH 124/179] fixing formatting --- SmartDeviceLink/SDLMenuManager.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 6229d1e4e..f97868145 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -251,11 +251,11 @@ - (void)sdl_startDynamicMenuUpdate { NSArray *deleteMenuStatus = self.runScore.oldStatus; NSArray *addMenuStatus = self.runScore.updatedStatus; - NSArray *cellsToDelete = [self sdl_buildDeleteMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *cellsToDelete = [self sdl_buildDeleteMenuItems:deleteMenuStatus compareTo:self.oldMenuCells]; NSArray *cellsToAdd = [self sdl_buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares - NSArray *oldKeeps = [self sdl_buildOldKeepMenuItems: deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *newKeeps = [self sdl_buildKeepNewMenuItems: addMenuStatus compareTo:self.menuCells]; + NSArray *oldKeeps = [self sdl_buildOldKeepMenuItems:deleteMenuStatus compareTo:self.oldMenuCells]; + NSArray *newKeeps = [self sdl_buildKeepNewMenuItems:addMenuStatus compareTo:self.menuCells]; // Cells that will be added need new ids [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; From 09dc70795aede5ab840b27735beb9f2e346a58ae Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 30 May 2019 13:58:31 -0400 Subject: [PATCH 125/179] AudioStreamManager tests --- SmartDeviceLink/SDLAudioStreamManager.m | 36 ++++---- .../DevAPISpecs/SDLAudioStreamManagerSpec.m | 82 ++++++++++++++++--- .../SDLStreamingAudioManagerMock.h | 7 +- .../SDLStreamingAudioManagerMock.m | 20 +++-- 4 files changed, 108 insertions(+), 37 deletions(-) diff --git a/SmartDeviceLink/SDLAudioStreamManager.m b/SmartDeviceLink/SDLAudioStreamManager.m index 1ea9ac3ee..ff16f2b16 100755 --- a/SmartDeviceLink/SDLAudioStreamManager.m +++ b/SmartDeviceLink/SDLAudioStreamManager.m @@ -46,6 +46,13 @@ - (instancetype)initWithManager:(id)streamManager return self; } +- (void)stop { + dispatch_async(_audioQueue, ^{ + self.shouldPlayWhenReady = NO; + [self.mutableQueue removeAllObjects]; + }); +} + #pragma mark - Getters - (NSArray *)queue { @@ -140,37 +147,30 @@ - (void)sdl_playNextWhenReady { float audioLengthSecs = (float)audioData.length / (float)32000.0; __weak typeof(self) weakself = self; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(audioLengthSecs * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - weakself.playing = NO; + __strong typeof(weakself) strongSelf = weakself; + + strongSelf.playing = NO; NSError *error = nil; - if (weakself.delegate != nil) { + if (strongSelf.delegate != nil) { if (file.inputFileURL != nil) { - [weakself.delegate audioStreamManager:weakself fileDidFinishPlaying:file.inputFileURL successfully:success]; - } else if ([weakself.delegate respondsToSelector:@selector(audioStreamManager:dataBufferDidFinishPlayingSuccessfully:)]) { - [weakself.delegate audioStreamManager:weakself dataBufferDidFinishPlayingSuccessfully:success]; + [strongSelf.delegate audioStreamManager:strongSelf fileDidFinishPlaying:file.inputFileURL successfully:success]; + } else if ([strongSelf.delegate respondsToSelector:@selector(audioStreamManager:dataBufferDidFinishPlayingSuccessfully:)]) { + [strongSelf.delegate audioStreamManager:strongSelf dataBufferDidFinishPlayingSuccessfully:success]; } } SDLLogD(@"Ending Audio file: %@", file); [[NSFileManager defaultManager] removeItemAtURL:file.outputFileURL error:&error]; - if (weakself.delegate != nil && error != nil) { + if (strongSelf.delegate != nil && error != nil) { if (file.inputFileURL != nil) { - [weakself.delegate audioStreamManager:weakself errorDidOccurForFile:file.inputFileURL error:error]; - } else if ([weakself.delegate respondsToSelector:@selector(audioStreamManager:errorDidOccurForDataBuffer:)]) { - [weakself.delegate audioStreamManager:weakself errorDidOccurForDataBuffer:error]; + [strongSelf.delegate audioStreamManager:strongSelf errorDidOccurForFile:file.inputFileURL error:error]; + } else if ([strongSelf.delegate respondsToSelector:@selector(audioStreamManager:errorDidOccurForDataBuffer:)]) { + [strongSelf.delegate audioStreamManager:strongSelf errorDidOccurForDataBuffer:error]; } } }); } -#pragma mark - Stopping Playback - -- (void)stop { - dispatch_async(_audioQueue, ^{ - self.shouldPlayWhenReady = NO; - [self.mutableQueue removeAllObjects]; - }); -} - @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m index a087ecb5a..320282465 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m @@ -10,6 +10,7 @@ __block SDLAudioStreamManager *testManager = nil; __block SDLStreamingAudioManagerMock *mockAudioManager = nil; __block NSURL *testAudioFileURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"testAudio" withExtension:@"mp3"]; + __block NSData *testAudioFileData = [NSData dataWithContentsOfURL:testAudioFileURL options:0 error:nil]; beforeEach(^{ mockAudioManager = [[SDLStreamingAudioManagerMock alloc] init]; @@ -27,30 +28,91 @@ }); describe(@"when audio streaming is not connected", ^{ + context(@"with a file URL", ^{ + beforeEach(^{ + mockAudioManager.audioConnected = NO; + [testManager pushWithFileURL:testAudioFileURL]; + + [NSThread sleepForTimeInterval:0.5]; + }); + + describe(@"after attempting to play the file", ^{ + beforeEach(^{ + [mockAudioManager clearData]; + [testManager playNextWhenReady]; + }); + + it(@"should fail to send data", ^{ + expect(mockAudioManager.dataSinceClear.length).to(equal(0)); + expect(mockAudioManager.error.code).toEventually(equal(SDLAudioStreamManagerErrorNotConnected)); + }); + }); + }); + + context(@"with a data buffer", ^{ + beforeEach(^{ + mockAudioManager.audioConnected = NO; + [testManager pushWithData:testAudioFileData]; + + [NSThread sleepForTimeInterval:0.5]; + }); + + describe(@"after attempting to play the file", ^{ + beforeEach(^{ + [mockAudioManager clearData]; + [testManager playNextWhenReady]; + }); + + it(@"should fail to send data", ^{ + expect(mockAudioManager.dataSinceClear.length).to(equal(0)); + expect(mockAudioManager.error.code).toEventually(equal(SDLAudioStreamManagerErrorNotConnected)); + }); + }); + }); + }); + + describe(@"after adding an audio file to the queue", ^{ beforeEach(^{ - mockAudioManager.audioConnected = NO; + mockAudioManager.audioConnected = YES; [testManager pushWithFileURL:testAudioFileURL]; [NSThread sleepForTimeInterval:0.5]; }); + it(@"should have a file in the queue", ^{ + expect(testManager.queue).toNot(beEmpty()); + }); + describe(@"after attempting to play the file", ^{ beforeEach(^{ [mockAudioManager clearData]; [testManager playNextWhenReady]; }); - it(@"should fail to send data", ^{ - expect(mockAudioManager.dataSinceClear.length).to(equal(0)); - expect(mockAudioManager.fileError.code).to(equal(SDLAudioStreamManagerErrorNotConnected)); + fit(@"should be sending data", ^{ + expect(testManager.isPlaying).toEventually(beTrue()); + expect(mockAudioManager.dataSinceClear.length).toEventually(equal(34380)); + + // Fails when it shouldn't, `weakself` goes to nil in `sdl_playNextWhenReady` + expect(mockAudioManager.finishedPlaying).toEventually(beTrue()); + }); + }); + + describe(@"after stopping the manager", ^{ + beforeEach(^{ + [testManager stop]; + }); + + it(@"should have an empty queue", ^{ + expect(testManager.queue).toEventually(beEmpty()); }); }); }); - describe(@"after adding an audio file to the queue", ^{ + describe(@"after adding an audio buffer to the queue", ^{ beforeEach(^{ mockAudioManager.audioConnected = YES; - [testManager pushWithFileURL:testAudioFileURL]; + [testManager pushWithData:testAudioFileData]; [NSThread sleepForTimeInterval:0.5]; }); @@ -59,7 +121,7 @@ expect(testManager.queue).toNot(beEmpty()); }); - describe(@"after attempting to play the file", ^{ + describe(@"after attempting to play the audio buffer", ^{ beforeEach(^{ [mockAudioManager clearData]; [testManager playNextWhenReady]; @@ -67,10 +129,10 @@ it(@"should be sending data", ^{ expect(testManager.isPlaying).toEventually(beTrue()); - expect(mockAudioManager.dataSinceClear.length).toEventually(equal(34380)); + expect(mockAudioManager.dataSinceClear.length).toEventually(equal(14838)); // Fails when it shouldn't, `weakself` goes to nil in `sdl_playNextWhenReady` -// expect(mockAudioManager.fileFinishedPlaying).toEventually(beTrue()); + expect(mockAudioManager.finishedPlaying).toEventually(beTrue()); }); }); @@ -80,7 +142,7 @@ }); it(@"should have an empty queue", ^{ - expect(testManager.queue).to(beEmpty()); + expect(testManager.queue).toEventually(beEmpty()); }); }); }); diff --git a/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.h b/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.h index 2717798a5..0b92d26d5 100644 --- a/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.h +++ b/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.h @@ -21,13 +21,14 @@ #pragma mark SDLStreamingAudioManagerType @property (assign, nonatomic, readonly, getter=isAudioConnected) BOOL audioConnected; - (BOOL)sendAudioData:(NSData *)audioData; - - (void)setAudioConnected:(BOOL)audioConnected; #pragma mark SDLAudioStreamManagerDelegate - (void)audioStreamManager:(SDLAudioStreamManager *)audioManager fileDidFinishPlaying:(SDLAudioFile *)file successfully:(BOOL)successfully; +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager dataBufferDidFinishPlayingSuccessfully:(BOOL)successfully; - (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForFile:(SDLAudioFile *)file error:(NSError *)error; -@property (assign, nonatomic, readonly) BOOL fileFinishedPlaying; -@property (strong, nonatomic, readonly) NSError *fileError; +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForDataBuffer:(NSError *)error; +@property (assign, nonatomic, readonly) BOOL finishedPlaying; +@property (strong, nonatomic, readonly) NSError *error; @end diff --git a/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.m b/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.m index 21d1d8732..6d03a7264 100644 --- a/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.m +++ b/SmartDeviceLinkTests/SDLStreamingAudioManagerMock.m @@ -14,8 +14,8 @@ @interface SDLStreamingAudioManagerMock() @property (strong, nonatomic) NSMutableData *mutableDataSinceClear; -@property (assign, nonatomic, readwrite) BOOL fileFinishedPlaying; -@property (strong, nonatomic, readwrite) NSError *fileError; +@property (assign, nonatomic, readwrite) BOOL finishedPlaying; +@property (strong, nonatomic, readwrite) NSError *error; @end @@ -35,8 +35,8 @@ - (void)clearData { _lastSentData = nil; _mutableDataSinceClear = nil; - _fileFinishedPlaying = NO; - _fileError = nil; + _finishedPlaying = NO; + _error = nil; } #pragma mark SDLStreamingAudioManagerType @@ -62,11 +62,19 @@ - (void)setAudioConnected:(BOOL)audioConnected { #pragma mark SDLAudioStreamManagerDelegate - (void)audioStreamManager:(SDLAudioStreamManager *)audioManager fileDidFinishPlaying:(SDLAudioFile *)file successfully:(BOOL)successfully { - _fileFinishedPlaying = successfully; + _finishedPlaying = successfully; +} + +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager dataBufferDidFinishPlayingSuccessfully:(BOOL)successfully { + _finishedPlaying = successfully; } - (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForFile:(SDLAudioFile *)file error:(NSError *)error { - _fileError = error; + _error = error; +} + +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForDataBuffer:(NSError *)error { + _error = error; } @end From 574e69e60a506e51be0e9dcad7fd94f642c3b71e Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 30 May 2019 15:36:50 -0400 Subject: [PATCH 126/179] changed enumerateObjectsUsingBlock to a for loop --- SmartDeviceLink/SDLMenuManager.m | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index f97868145..ecb6a1f8c 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -518,15 +518,16 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U - (NSArray *)sdl_allCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork { NSMutableArray *mutableCommands = [NSMutableArray array]; - [cells enumerateObjectsUsingBlock:^(SDLMenuCell * _Nonnull cell, NSUInteger index, BOOL * _Nonnull stop) { - if (cell.subCells.count > 0) { - [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]]; - [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cell.subCells withArtwork:shouldHaveArtwork]]; + + for(NSUInteger cellIndex = 0; cellIndex < cells.count; cellIndex++) { + if(cells[cellIndex].subCells.count > 0) { + [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)index]]; + [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cells[cellIndex].subCells withArtwork:shouldHaveArtwork]]; } else { - [mutableCommands addObject:[self sdl_commandForMenuCell:cell withArtwork:shouldHaveArtwork position:(UInt16)index]]; + [mutableCommands addObject:[self sdl_commandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)index]]; } - }]; - + } + return [mutableCommands copy]; } From 6e83a5642afe817dca4d0011737f384cac13c6b8 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Thu, 30 May 2019 15:52:32 -0400 Subject: [PATCH 127/179] Cleaned up the IAP classes private methods --- SmartDeviceLink/SDLIAPControlSession.m | 16 +------- SmartDeviceLink/SDLIAPDataSession.m | 23 ++---------- SmartDeviceLink/SDLIAPSession.h | 37 +++++++++++++++++++ SmartDeviceLink/SDLIAPSession.m | 13 +------ .../TransportSpecs/iAP/SDLIAPSessionSpec.m | 7 ---- 5 files changed, 44 insertions(+), 52 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index 534a3c614..e941c8a36 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -28,18 +28,6 @@ @interface SDLIAPControlSession () @end -@interface SDLIAPSession (exposeIAPSessionPrivateMethods) - -@property (nonatomic, assign) BOOL isInputStreamOpen; -@property (nonatomic, assign) BOOL isOutputStreamOpen; - -- (BOOL)start; -- (void)startStream:(NSStream *)stream; -- (void)stopStream:(NSStream *)stream; -- (void)closeSession; - -@end - @implementation SDLIAPControlSession #pragma mark - Session lifecycle @@ -79,7 +67,7 @@ - (void)startSession { } - (BOOL)sdl_startStreams { - if (![super start]) { return NO; } + if (![super createSession]) { return NO; } // No need for its own thread as only a small amount of data will be transmitted before control session is destroyed SDLLogD(@"Created the control session successfully"); @@ -117,7 +105,7 @@ - (void)sdl_stopAndDestroySession { [super stopStream:self.eaSession.outputStream]; [super stopStream:self.eaSession.inputStream]; - [super closeSession]; + [super cleanupClosedSession]; } diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 16a6bdbff..1c046dd38 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -29,18 +29,6 @@ @interface SDLIAPDataSession () @end -@interface SDLIAPSession (exposeIAPSessionPrivateMethods) - -@property (nonatomic, assign) BOOL isInputStreamOpen; -@property (nonatomic, assign) BOOL isOutputStreamOpen; - -- (BOOL)start; -- (void)startStream:(NSStream *)stream; -- (void)stopStream:(NSStream *)stream; -- (void)closeSession; - -@end - @implementation SDLIAPDataSession #pragma mark - Session lifecycle @@ -68,7 +56,7 @@ - (void)startSession { } else { SDLLogD(@"Starting data session with accessory: %@, using protocol: %@", self.accessory.name, self.protocolString); - if (![super start]) { + if (![super createSession]) { SDLLogW(@"Data session failed to setup with accessory: %@. Retrying...", self.accessory); [self destroySession]; if (self.delegate == nil) { return; } @@ -110,7 +98,7 @@ - (void)sdl_stopAndDestroySession { if (self.ioStreamThread == nil) { SDLLogV(@"Stopping data session but no thread established."); - [super closeSession]; + [super cleanupClosedSession]; return; } @@ -122,7 +110,7 @@ - (void)sdl_stopAndDestroySession { SDLLogE(@"Destroying thread (IOStreamThread) for data session when I/O streams have not yet closed."); } self.ioStreamThread = nil; - [super closeSession]; + [super cleanupClosedSession]; }]; } @@ -146,8 +134,6 @@ - (void)sdl_isIOThreadCanceled:(dispatch_semaphore_t)canceledSemaphore completio #pragma mark - Sending data - (void)sendData:(NSData *)data { - SDLLogV(@"Sending data %lu. I/O streams open? %s", (unsigned long)data.length, self.isStopped ? "no" : "yes"); - // Enqueue the data for transmission on the IO thread [self.sendDataQueue enqueueBuffer:data.mutableCopy]; @@ -178,8 +164,6 @@ - (void)sdl_dequeueAndWriteToOutputStream { NSUInteger bytesRemaining = remainder.length; NSInteger bytesWritten = [ostream write:remainder.bytes maxLength:bytesRemaining]; - SDLLogV(@"%ld bytes written to data session output stream", (long)bytesWritten); - if (bytesWritten < 0) { if (ostream.streamError != nil) { [self sdl_handleOutputStreamWriteError:ostream.streamError]; @@ -324,7 +308,6 @@ - (void)sdl_streamHasBytesAvailable:(NSInputStream *)inputStream { * Called when the session gets a `NSStreamEventHasSpaceAvailable` event code. Send any queued data to Core. */ - (void)sdl_streamHasSpaceToWrite { - SDLLogV(@"NSStreamEventHasSpaceAvailable"); [self sdl_dequeueAndWriteToOutputStream]; } diff --git a/SmartDeviceLink/SDLIAPSession.h b/SmartDeviceLink/SDLIAPSession.h index 0f0be80c8..75b1f6d55 100644 --- a/SmartDeviceLink/SDLIAPSession.h +++ b/SmartDeviceLink/SDLIAPSession.h @@ -31,6 +31,16 @@ NS_ASSUME_NONNULL_BEGIN */ @property (assign, readonly, getter=isStopped) BOOL stopped; +/** + * The input stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the input stream. The input stream is closed when the stream status is `NSStreamStatusClosed`. + */ +@property (nonatomic, assign) BOOL isInputStreamOpen; + +/** + * The output stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the output stream. The output stream has been closed when the stream status is `NSStreamStatusClosed`. + */ +@property (nonatomic, assign) BOOL isOutputStreamOpen; + /** * The unique ID assigned to the session between the app and accessory. If no session exists the value will be 0. */ @@ -60,6 +70,33 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)destroySession; +/** + * Creates a session with the accessory. + * + * @return Whether or not the session was created successfully + */ +- (BOOL)createSession; + +/** + * Starts a session input or output stream. + * + * @param stream The stream to be started. + */ +- (void)startStream:(NSStream *)stream; + +/** + * Stops a session input or output stream. + * + * @param stream The stream to be stopped. + */ +- (void)stopStream:(NSStream *)stream; + +/** + * Cleans up a closed session + */ +- (void)cleanupClosedSession; + + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLIAPSession.m b/SmartDeviceLink/SDLIAPSession.m index dd5ad2936..96844b3a7 100644 --- a/SmartDeviceLink/SDLIAPSession.m +++ b/SmartDeviceLink/SDLIAPSession.m @@ -10,15 +10,6 @@ NS_ASSUME_NONNULL_BEGIN @interface SDLIAPSession () -/** - * The input stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the input stream. The input stream is closed when the stream status is `NSStreamStatusClosed`. - */ -@property (nonatomic, assign) BOOL isInputStreamOpen; - -/** - * The output stream for the session is open when a `NSStreamEventOpenCompleted` event is received for the output stream. The output stream has been closed when the stream status is `NSStreamStatusClosed`. - */ -@property (nonatomic, assign) BOOL isOutputStreamOpen; @property (nullable, strong, nonatomic, readwrite) EASession *eaSession; @property (nullable, strong, nonatomic, readwrite) EAAccessory *accessory; @@ -52,7 +43,7 @@ - (void)destroySession {} #pragma mark - Private Stream Lifecycle Helpers -- (BOOL)start { +- (BOOL)createSession { SDLLogD(@"Opening EASession with accessory: %@", self.accessory.name); self.eaSession = [[EASession alloc] initWithAccessory:self.accessory forProtocol:self.protocolString]; return (self.eaSession != nil); @@ -88,7 +79,7 @@ - (void)stopStream:(NSStream *)stream { } } -- (void)closeSession { +- (void)cleanupClosedSession { if (self.eaSession == nil) { SDLLogD(@"Attempting to close session with accessory: %@, but it is already closed", self.accessory.name); return; diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m index 17984383f..f253a1d44 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPSessionSpec.m @@ -14,13 +14,6 @@ #import "SDLIAPSession.h" #import "SDLIAPConstants.h" -@interface SDLIAPSession () - -@property (nonatomic, assign) BOOL isInputStreamOpen; -@property (nonatomic, assign) BOOL isOutputStreamOpen; - -@end - QuickSpecBegin(SDLIAPSessionSpec) From 9fa2c894c6779c29d3af2be1658282b8a6e90c3c Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 30 May 2019 16:05:42 -0400 Subject: [PATCH 128/179] added test to compare cells removed setter updated unit tests removed fit --- SmartDeviceLink/SDLMenuManager.m | 15 ++++++++++----- .../DevAPISpecs/SDLMenuCellSpec.m | 15 +++++++++++++++ .../DevAPISpecs/SDLMenuManagerSpec.m | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index ecb6a1f8c..f8710c39a 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -109,9 +109,6 @@ - (void)stop { } #pragma mark - Setters -- (void)setDynamicMenuUpdatesMode:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { - _dynamicMenuUpdatesMode = dynamicMenuUpdatesMode; -} - (void)setMenuCells:(NSArray *)menuCells { if (self.currentHMILevel == nil @@ -367,7 +364,7 @@ - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuC @param completionHandler handler */ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSArray *)menu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { - if (self.menuCells.count == 0) { + if (self.menuCells.count == 0 || updatedMenu.count == 0) { SDLLogD(@"No main menu to send"); completionHandler(nil); return; @@ -487,6 +484,14 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U } #pragma mark Commands / SubMenu RPCs +/** + Add menu commands + + @param cells that need to be added + @param shouldHaveArtwork artwork bool + @param menu a list of all cells to get index, either main menu or subcells + @return list of SDLRPCRequest addCommands + */ - (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexOf:(NSArray *)menu { NSMutableArray *mutableCommands = [NSMutableArray array]; @@ -527,7 +532,7 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U [mutableCommands addObject:[self sdl_commandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)index]]; } } - + return [mutableCommands copy]; } diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m index 84936f211..5be085116 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m @@ -8,6 +8,7 @@ describe(@"a menu cell", ^{ __block SDLMenuCell *testCell = nil; + __block SDLMenuCell *testCell2 = nil; describe(@"initializing", ^{ __block NSString *someTitle = nil; @@ -53,6 +54,20 @@ expect(testCell.voiceCommands).to(beNil()); expect(testCell.subCells).to(equal(someSubcells)); }); + + it(@"should compare cells and return true if equal", ^{ + testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells]; + testCell2 = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells]; + + expect([testCell isEqual:testCell2]).to(equal(true)); + }); + + it(@"should compare cells and return false if not equal ", ^{ + testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells]; + testCell2 = [[SDLMenuCell alloc] initWithTitle:@"False" icon:someArtwork subCells:someSubcells]; + + expect([testCell isEqual:testCell2]).to(equal(false)); + }); }); }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index 8d6877303..435073cc6 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -286,7 +286,7 @@ @interface SDLMenuManager() expect(adds).to(haveCount(2)); }); - fit(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ + it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; From 0f3f75911ae30e9ed9f5cc9403ae57c71536541c Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 30 May 2019 16:09:11 -0400 Subject: [PATCH 129/179] Fix position not being set on SDLChoiceSet VRHelpList --- SmartDeviceLink/SDLChoiceSet.m | 8 ++++++++ SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m | 13 +++++++++++++ 2 files changed, 21 insertions(+) diff --git a/SmartDeviceLink/SDLChoiceSet.m b/SmartDeviceLink/SDLChoiceSet.m index b7aa12388..0892e611d 100644 --- a/SmartDeviceLink/SDLChoiceSet.m +++ b/SmartDeviceLink/SDLChoiceSet.m @@ -123,6 +123,14 @@ + (void)setDefaultLayout:(SDLChoiceSetLayout)defaultLayout { _defaultLayout = defaultLayout; } +- (void)setHelpList:(nullable NSArray *)helpList { + _helpList = helpList; + + for (NSUInteger i = 0; i < _helpList.count; i++) { + _helpList[i].position = @(i + 1); + } +} + #pragma mark - Etc. - (NSString *)description { diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m index c89a969be..bce012034 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetSpec.m @@ -69,6 +69,7 @@ expect(testChoiceSet.timeoutPrompt).to(equal([SDLTTSChunk textChunksFromString:testTimeoutPrompt])); expect(testChoiceSet.helpPrompt).to(equal([SDLTTSChunk textChunksFromString:testHelpPrompt])); expect(testChoiceSet.helpList).to(equal(@[testHelpItem])); + expect(testChoiceSet.helpList.firstObject.position).to(equal(1)); expect(testChoiceSet.delegate).to(equal(testDelegate)); expect(testChoiceSet.choices).to(equal(@[testCell])); }); @@ -150,6 +151,18 @@ }); }); }); + + describe(@"setting data", ^{ + beforeEach(^{ + testChoiceSet = [[SDLChoiceSet alloc] init]; + }); + + it(@"should properly set help list position", ^{ + testChoiceSet.helpList = @[testHelpItem]; + + expect(testHelpItem.position).to(equal(1)); + }); + }); }); QuickSpecEnd From 3be915dc756519bcd637c7cec66c955ec5f279ce Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Fri, 31 May 2019 09:29:04 -0400 Subject: [PATCH 130/179] added unit test --- .../SDLMenuUpdateAlgorithmSpec.m | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m index 6ac300cc7..a8a666fb6 100644 --- a/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m +++ b/SmartDeviceLinkTests/SDLMenuUpdateAlgorithmSpec.m @@ -151,14 +151,37 @@ typedef NS_ENUM(NSUInteger, MenuCellState) { expect(runScore.oldStatus.count).to(equal(4)); expect(runScore.score).to(equal(0)); - expect(runScore.updatedStatus.count).to(equal(0)); - expect(runScore.oldStatus[0].integerValue).to(equal(MenuCellStateDelete)); expect(runScore.oldStatus[1].integerValue).to(equal(MenuCellStateDelete)); expect(runScore.oldStatus[2].integerValue).to(equal(MenuCellStateDelete)); expect(runScore.oldStatus[3].integerValue).to(equal(MenuCellStateDelete)); }); + it(@"should have menu status of 1111 and no old menu status", ^{ + NSArray *oldMenuCells = @[]; + NSArray *updatedMenuCells = @[oldCell1, oldCell2, oldCell3, oldCell4]; + + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore.updatedStatus.count).to(equal(4)); + expect(runScore.oldStatus.count).to(equal(0)); + expect(runScore.score).to(equal(4)); + + expect(runScore.updatedStatus[0].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[1].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[2].integerValue).to(equal(MenuCellStateAdd)); + expect(runScore.updatedStatus[3].integerValue).to(equal(MenuCellStateAdd)); + }); + + + it(@"should return nil of old and new menu is an empty array", ^{ + NSArray *oldMenuCells = @[]; + NSArray *updatedMenuCells = @[]; + + runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldMenuCells updatedMenuCells:updatedMenuCells]; + + expect(runScore).to(beNil()); + }); }); }); From 87f6a919f158237dc18c2e11caed23b1eb947805 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 31 May 2019 09:41:55 -0400 Subject: [PATCH 131/179] Fix using uninitialized objects on pre protocol v5 head units --- SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadEndService.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadNak.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadRPCStartService.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m | 5 ++++- .../SDLControlFramePayloadRegisterSecondaryTransportNak.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadVideoStartService.m | 5 ++++- SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m | 5 ++++- 9 files changed, 36 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m index d28524f81..2dd186b1f 100644 --- a/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadAudioStartServiceAck.m @@ -66,7 +66,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadEndService.m b/SmartDeviceLink/SDLControlFramePayloadEndService.m index d7e9aef48..cabfb09df 100644 --- a/SmartDeviceLink/SDLControlFramePayloadEndService.m +++ b/SmartDeviceLink/SDLControlFramePayloadEndService.m @@ -66,7 +66,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } self.hashId = bson_object_get_int32(&payloadObject, SDLControlFrameHashIdKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadNak.m b/SmartDeviceLink/SDLControlFramePayloadNak.m index eefda10e6..55b9a6dad 100644 --- a/SmartDeviceLink/SDLControlFramePayloadNak.m +++ b/SmartDeviceLink/SDLControlFramePayloadNak.m @@ -71,7 +71,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } BsonArray *arrayObject = bson_object_get_array(&payloadObject, SDLControlFrameRejectedParams); if (arrayObject == NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m b/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m index ea4fe6f25..6409884d0 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m +++ b/SmartDeviceLink/SDLControlFramePayloadRPCStartService.m @@ -65,7 +65,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } char *utf8String = bson_object_get_string(&payloadObject, SDLControlFrameProtocolVersionKey); if (utf8String != NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m index 996f2f172..e6afae672 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadRPCStartServiceAck.m @@ -115,7 +115,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } self.hashId = bson_object_get_int32(&payloadObject, SDLControlFrameHashIdKey); self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m b/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m index aeca26258..600fd1b61 100644 --- a/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m +++ b/SmartDeviceLink/SDLControlFramePayloadRegisterSecondaryTransportNak.m @@ -65,7 +65,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } char *reasonString = bson_object_get_string(&payloadObject, SDLControlFrameReasonKey); if (reasonString != NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m b/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m index ed76a1c7f..24b49ccec 100644 --- a/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m +++ b/SmartDeviceLink/SDLControlFramePayloadTransportEventUpdate.m @@ -81,7 +81,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } char *utf8String = bson_object_get_string(&payloadObject, SDLControlFrameTCPIPAddressKey); if (utf8String != NULL) { diff --git a/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m b/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m index 24820cf43..d8dc841be 100644 --- a/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m +++ b/SmartDeviceLink/SDLControlFramePayloadVideoStartService.m @@ -88,7 +88,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } self.height = bson_object_get_int32(&payloadObject, SDLControlFrameHeightKey); self.width = bson_object_get_int32(&payloadObject, SDLControlFrameWidthKey); diff --git a/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m b/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m index 23891ce24..7f071df50 100644 --- a/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m +++ b/SmartDeviceLink/SDLControlFramePayloadVideoStartServiceAck.m @@ -94,7 +94,10 @@ - (nullable NSData *)data { - (void)sdl_parse:(NSData *)data { BsonObject payloadObject; - bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + size_t retval = bson_object_from_bytes_len(&payloadObject, (BytePtr)data.bytes, data.length); + if (retval <= 0) { + return; + } self.mtu = bson_object_get_int64(&payloadObject, SDLControlFrameMTUKey); self.height = bson_object_get_int32(&payloadObject, SDLControlFrameHeightKey); From ff55c388cb42b248fb86058edda8578a5433cb72 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 11:26:46 -0400 Subject: [PATCH 132/179] Refactored example app starting manager methods --- Example Apps/Example ObjC/ProxyManager.m | 10 +++++----- Example Apps/Example Swift/ProxyManager.swift | 11 ++++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m index c045531ef..453e843eb 100644 --- a/Example Apps/Example ObjC/ProxyManager.m +++ b/Example Apps/Example ObjC/ProxyManager.m @@ -109,14 +109,14 @@ + (SDLLifecycleConfiguration *)sdlex_tcpLifecycleConfiguration { } - (void)sdlex_setupConfigurationWithLifecycleConfiguration:(SDLLifecycleConfiguration *)lifecycleConfiguration { - if (self.sdlManager == nil) { - SDLConfiguration *config = [SDLConfiguration configurationWithLifecycle:lifecycleConfiguration lockScreen:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:[UIImage imageNamed:ExampleAppLogoName] backgroundColor:nil] logging:[self.class sdlex_logConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration]]; - self.sdlManager = [[SDLManager alloc] initWithConfiguration:config delegate:self]; - [self sdlex_startManager]; - } else { + if (self.sdlManager != nil) { // Manager already created, just start it again. [self sdlex_startManager]; + return; } + SDLConfiguration *config = [SDLConfiguration configurationWithLifecycle:lifecycleConfiguration lockScreen:[SDLLockScreenConfiguration enabledConfigurationWithAppIcon:[UIImage imageNamed:ExampleAppLogoName] backgroundColor:nil] logging:[self.class sdlex_logConfiguration] fileManager:[SDLFileManagerConfiguration defaultConfiguration]]; + self.sdlManager = [[SDLManager alloc] initWithConfiguration:config delegate:self]; + [self sdlex_startManager]; } + (SDLLifecycleConfiguration *)sdlex_setLifecycleConfigurationPropertiesOnConfiguration:(SDLLifecycleConfiguration *)config { diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift index a645b0c1a..40a703e4a 100644 --- a/Example Apps/Example Swift/ProxyManager.swift +++ b/Example Apps/Example Swift/ProxyManager.swift @@ -43,14 +43,15 @@ extension ProxyManager { /// /// - Parameter connectionType: The type of transport layer to use. func start(with proxyTransportType: ProxyTransportType) { - if sdlManager == nil { - delegate?.didChangeProxyState(ProxyState.searching) - sdlManager = SDLManager(configuration: proxyTransportType == .iap ? ProxyManager.connectIAP() : ProxyManager.connectTCP(), delegate: self) - startManager() - } else { + guard sdlManager == nil else { // Manager already created, just start it again. startManager() + return } + + delegate?.didChangeProxyState(ProxyState.searching) + sdlManager = SDLManager(configuration: proxyTransportType == .iap ? ProxyManager.connectIAP() : ProxyManager.connectTCP(), delegate: self) + startManager() } /// Attempts to close the connection between the this app and the car's head unit. The `SDLManagerDelegate`'s `managerDidDisconnect()` is called when connection is actually closed. From f8534bdec79eed921a26314b2a5bf689fbc41020 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 11:39:56 -0400 Subject: [PATCH 133/179] Renamed control session timeout timer methods --- SmartDeviceLink/SDLIAPControlSession.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLIAPControlSession.m b/SmartDeviceLink/SDLIAPControlSession.m index e941c8a36..e6505e4b3 100644 --- a/SmartDeviceLink/SDLIAPControlSession.m +++ b/SmartDeviceLink/SDLIAPControlSession.m @@ -61,7 +61,7 @@ - (void)startSession { [self.delegate controlSessionShouldRetry]; } else { SDLLogD(@"Waiting for the protocol string from Core, setting timer for %d seconds", ProtocolIndexTimeoutSeconds); - self.protocolIndexTimer = [self sdl_createProtocolIndexTimer]; + self.protocolIndexTimer = [self sdl_createControlSessionProtocolIndexStringDataTimeoutTimer]; } } } @@ -160,7 +160,7 @@ - (void)sdl_streamDidOpen:(NSStream *)stream { // When both streams are open, session initialization is complete. Let the delegate know. if (self.isInputStreamOpen && self.isOutputStreamOpen) { SDLLogV(@"Control session I/O streams opened for protocol: %@", self.protocolString); - [self sdl_startSessionTimer]; + [self sdl_startControlSessionProtocolIndexStringDataTimeoutTimer]; } } @@ -227,7 +227,7 @@ - (void)sdl_streamDidError:(NSStream *)stream { * * @return A timer */ -- (SDLTimer *)sdl_createProtocolIndexTimer { +- (SDLTimer *)sdl_createControlSessionProtocolIndexStringDataTimeoutTimer { SDLTimer *protocolIndexTimer = [[SDLTimer alloc] initWithDuration:ProtocolIndexTimeoutSeconds repeat:NO]; __weak typeof(self) weakSelf = self; @@ -247,7 +247,7 @@ - (SDLTimer *)sdl_createProtocolIndexTimer { /** * Starts a timer for the session. Core has ~10 seconds to send the protocol string, otherwise the control session is closed and the delegate will be notified that it should attempt to establish a new control session. */ -- (void)sdl_startSessionTimer { +- (void)sdl_startControlSessionProtocolIndexStringDataTimeoutTimer { if (self.protocolIndexTimer == nil) { return; } [self.protocolIndexTimer start]; } From 8b68e7baa7fd54b39b310c22f0d6f3b6e7e6605f Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 13:29:46 -0400 Subject: [PATCH 134/179] Refactored stream errored on write in data session Refactored the stream errored on write in data session class --- SmartDeviceLink/SDLIAPDataSession.m | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index 1c046dd38..b6ec6e9dc 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -145,7 +145,7 @@ - (void)sendData:(NSData *)data { */ - (void)sdl_dequeueAndWriteToOutputStream { if ([self.ioStreamThread isCancelled]) { - SDLLogV(@"Attempted to send data on I/O thread but the thread is cancelled."); + SDLLogW(@"Attempted to send data on I/O thread but the thread is cancelled."); return; } @@ -166,7 +166,8 @@ - (void)sdl_dequeueAndWriteToOutputStream { if (bytesWritten < 0) { if (ostream.streamError != nil) { - [self sdl_handleOutputStreamWriteError:ostream.streamError]; + // Once a stream has reported an error, it cannot be re-used for read or write operations. Shut down the stream and attempt to create a new session. + [self sdl_streamDidError:ostream]; } else { // The write operation failed but there is no further information about the error. This can occur when disconnecting from an external accessory. SDLLogE(@"Output stream write operation failed"); @@ -180,22 +181,6 @@ - (void)sdl_dequeueAndWriteToOutputStream { } } -/** - * Handles an output stream error when attempting to write to the output stream. - * - * @param error The output stream error - */ -- (void)sdl_handleOutputStreamWriteError:(NSError *)error { - SDLLogE(@"Output stream error: %@", error); - // TODO: We should look at the domain and the code as a tuple and decide how to handle the error based on both values. For now, if the stream is closed, we will flush the send queue and leave it as-is otherwise so that temporary error conditions can be dealt with by retrying - if (self.eaSession == nil || - self.eaSession.outputStream == nil || - self.eaSession.outputStream.streamStatus != NSStreamStatusOpen) { - [self.sendDataQueue removeAllObjects]; - } -} - - #pragma mark - NSStreamDelegate /** From 12ee2a0682981c3d7b5af99a306706bd626475c2 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 13:39:28 -0400 Subject: [PATCH 135/179] Update SmartDeviceLink/SDLIAPTransport.m Fixed SDL log spelling Co-Authored-By: Joel Fischer --- SmartDeviceLink/SDLIAPTransport.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 999518d4d..1a977dc45 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -307,7 +307,7 @@ - (void)disconnect { */ - (void)sdl_connect:(nullable EAAccessory *)accessory { if (self.transportDisconnected) { - SDLLogV(@"Will not attempt to connect to an accessory because the data session disconnected. Waiting for lifecycle manager to create a new tranport object."); + SDLLogV(@"Will not attempt to connect to an accessory because the data session disconnected. Waiting for lifecycle manager to create a new transport object."); return; } From eab92bbed34a6561eeeb383f149bef4c3c2b7e9d Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 31 May 2019 14:28:37 -0400 Subject: [PATCH 136/179] Fix audio stream manager tests --- SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m index 320282465..e538122f5 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLAudioStreamManagerSpec.m @@ -87,9 +87,11 @@ beforeEach(^{ [mockAudioManager clearData]; [testManager playNextWhenReady]; + + [NSThread sleepForTimeInterval:1.0]; }); - fit(@"should be sending data", ^{ + it(@"should be sending data", ^{ expect(testManager.isPlaying).toEventually(beTrue()); expect(mockAudioManager.dataSinceClear.length).toEventually(equal(34380)); From be493ea3d808811a2f26afdc26461cbe16518e1d Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 31 May 2019 15:28:08 -0400 Subject: [PATCH 137/179] Force ChoiceSets to work on Ford Sync Gen 3 * Call preload handler if it fails --- SmartDeviceLink/SDLChoiceSetManager.m | 6 +++++- SmartDeviceLink/SDLError.h | 1 + SmartDeviceLink/SDLError.m | 12 ++++++++++++ SmartDeviceLink/SDLErrorConstants.h | 3 ++- SmartDeviceLink/SDLPreloadChoicesOperation.m | 11 +++++++++-- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLChoiceSetManager.m b/SmartDeviceLink/SDLChoiceSetManager.m index 36914d553..5562b1515 100644 --- a/SmartDeviceLink/SDLChoiceSetManager.m +++ b/SmartDeviceLink/SDLChoiceSetManager.m @@ -183,7 +183,11 @@ - (void)didEnterStateStartupError { #pragma mark Upload / Delete - (void)preloadChoices:(NSArray *)choices withCompletionHandler:(nullable SDLPreloadChoiceCompletionHandler)handler { - if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) { return; } + if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) { + NSError *error = [NSError sdl_choiceSetManager_incorrectState:self.currentState]; + handler(error); + return; + } NSMutableSet *choicesToUpload = [[self sdl_choicesToBeUploadedWithArray:choices] mutableCopy]; [choicesToUpload minusSet:self.preloadedMutableChoices]; diff --git a/SmartDeviceLink/SDLError.h b/SmartDeviceLink/SDLError.h index 280c20309..715305a24 100644 --- a/SmartDeviceLink/SDLError.h +++ b/SmartDeviceLink/SDLError.h @@ -68,6 +68,7 @@ extern SDLErrorDomain *const SDLErrorDomainRPCStore; + (NSError *)sdl_choiceSetManager_choiceDeletionFailed:(NSDictionary *)userInfo; + (NSError *)sdl_choiceSetManager_choiceUploadFailed:(NSDictionary *)userInfo; + (NSError *)sdl_choiceSetManager_failedToCreateMenuItems; ++ (NSError *)sdl_choiceSetManager_incorrectState:(NSString *)state; #pragma mark Transport diff --git a/SmartDeviceLink/SDLError.m b/SmartDeviceLink/SDLError.m index f72608a31..8a716c5b0 100644 --- a/SmartDeviceLink/SDLError.m +++ b/SmartDeviceLink/SDLError.m @@ -8,6 +8,8 @@ #import "SDLError.h" +#import "SDLChoiceSetManager.h" + NS_ASSUME_NONNULL_BEGIN #pragma mark Error Domains @@ -237,6 +239,16 @@ + (NSError *)sdl_choiceSetManager_failedToCreateMenuItems { return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorFailedToCreateMenuItems userInfo:userInfo]; } ++ (NSError *)sdl_choiceSetManager_incorrectState:(SDLChoiceManagerState *)state { + NSString *errorString = [NSString stringWithFormat:@"Choice Set Manager error invalid state: %@", state]; + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: errorString, + NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The choice set manager could be in an invalid state because the head unit doesn't support choice sets or the manager failed to set up correctly.", nil), + NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"If you are setting the menuName, it is possible that the head unit is sending incorrect displayCapabilities.", nil) + }; + return [NSError errorWithDomain:SDLErrorDomainChoiceSetManager code:SDLChoiceSetManagerErrorInvalidState userInfo:userInfo]; +} + #pragma mark Transport + (NSError *)sdl_transport_unknownError { diff --git a/SmartDeviceLink/SDLErrorConstants.h b/SmartDeviceLink/SDLErrorConstants.h index 8cbed860e..f7c7bcc2a 100644 --- a/SmartDeviceLink/SDLErrorConstants.h +++ b/SmartDeviceLink/SDLErrorConstants.h @@ -123,7 +123,8 @@ typedef NS_ENUM(NSInteger, SDLChoiceSetManagerError) { SDLChoiceSetManagerErrorPendingPresentationDeleted = -1, SDLChoiceSetManagerErrorDeletionFailed = -2, SDLChoiceSetManagerErrorUploadFailed = -3, - SDLChoiceSetManagerErrorFailedToCreateMenuItems = -4 + SDLChoiceSetManagerErrorFailedToCreateMenuItems = -4, + SDLChoiceSetManagerErrorInvalidState = -5 }; /** diff --git a/SmartDeviceLink/SDLPreloadChoicesOperation.m b/SmartDeviceLink/SDLPreloadChoicesOperation.m index 8fe9718cb..caedc168b 100644 --- a/SmartDeviceLink/SDLPreloadChoicesOperation.m +++ b/SmartDeviceLink/SDLPreloadChoicesOperation.m @@ -157,8 +157,15 @@ - (nullable SDLCreateInteractionChoiceSet *)sdl_choiceFromCell:(SDLChoiceCell *) } else { vrCommands = cell.voiceCommands; } - - NSString *menuName = [self.displayCapabilities hasTextFieldOfName:SDLTextFieldNameMenuName] ? cell.text : nil; + + NSString *menuName = nil; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if ([self.displayCapabilities.displayType isEqualToEnum:SDLDisplayTypeGen38Inch] || [self.displayCapabilities hasTextFieldOfName:SDLTextFieldNameMenuName]) { + menuName = cell.text; + } +#pragma clang diagnostic pop + if(!menuName) { SDLLogE(@"Could not convert SDLChoiceCell to SDLCreateInteractionChoiceSet. It will not be shown. Cell: %@", cell); return nil; From 9961a287ed5461d6534df0999dc8bc08cd38b1e9 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 15:56:40 -0400 Subject: [PATCH 138/179] Refactored the create session methods Refactored the create session methods in iAPTransport class --- SmartDeviceLink/SDLIAPTransport.m | 178 ++++++++++++++++-------------- 1 file changed, 98 insertions(+), 80 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 999518d4d..e4826f18c 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -29,7 +29,7 @@ @interface SDLIAPTransport () *)protocolStrings { + // Order of the protocol strings is important!! + return @[MultiSessionProtocolString, ControlProtocolString, LegacyProtocolString]; +} + +/** + * Attempts to create a session with a connected accessory. + * + * @param connectedAccessory The connected accessory + * @return True if a session was started with the connected accessory, false if not + */ +- (BOOL)sdl_establishSessionWithConnectedAccessory:(EAAccessory *)connectedAccessory { + for (NSString *protocolString in [self.class protocolStrings]) { + if (![connectedAccessory supportsProtocol:protocolString]) { + continue; + } + + BOOL connecting = [self createSessionWithAccessory:connectedAccessory protocolString:protocolString]; + if (connecting) { + return connecting; + } + } + + return NO; +} + +/** + * Searches through the EAAccessoryManager's list of connected accessories for an SDL enabled accessory. If an accessory is found a session is attempted with the accessory. + * + * @return True if a session was started with the connected accessory, false if no session could be created or if no SDL enabled accessory was found. + */ +- (BOOL)sdl_establishSessionWithAccessory { + for (NSString *protocolString in [self.class protocolStrings]) { + EAAccessory *sdlAccessory = [EAAccessoryManager findAccessoryForProtocol:protocolString]; + if (sdlAccessory == nil) { + continue; + } + + BOOL connecting = [self createSessionWithAccessory:sdlAccessory protocolString:protocolString]; + if (connecting) { + return connecting; + } + } + + return NO; +} + +/** + * Creates a session with a passed accessory and protocol string. If the accessory supports the multisession protocol string, a data session can be created right away with the accessory. If the accessory does not support the multisession protocol string, but does support the control protocol string, two sessions must be created. First, a control session is created to get the new protocol string needed to create a data session with the accessory. Then, the control session is destroyed and the data session created with the new protocol string. + * + * @param accessory The connected accessory + * @param protocolString The unique protocol string used to create the session with the accessory + * @return True if a session was started with the connected accessory, false if no session could be created or if no SDL enabled accessory was found. + */ +- (BOOL)createSessionWithAccessory:(EAAccessory *)accessory protocolString:(NSString *)protocolString { + if (![self.class sdl_plistContainsAllSupportedProtocolStrings]) { + return NO; + } + + if ([protocolString isEqualToString:MultiSessionProtocolString] && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { + self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:MultiSessionProtocolString]; + [self.dataSession startSession]; + return YES; + } else if ([protocolString isEqualToString:ControlProtocolString]) { + self.controlSession = [[SDLIAPControlSession alloc] initWithAccessory:accessory delegate:self]; + [self.controlSession startSession]; + return YES; + } else if ([protocolString isEqualToString:LegacyProtocolString]) { + self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:LegacyProtocolString]; + [self.dataSession startSession]; + return YES; + } + + return NO; +} + #pragma mark - Lifecycle Destruction From bde8a7d9c3f757400e3126d797594ea7abf481fa Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 16:03:38 -0400 Subject: [PATCH 139/179] Renamed transportDisconnected var --- .../TransportSpecs/iAP/SDLIAPTransportSpec.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m index e31a300e4..0f39c0dff 100644 --- a/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m +++ b/SmartDeviceLinkTests/TransportSpecs/iAP/SDLIAPTransportSpec.m @@ -27,7 +27,7 @@ @interface SDLIAPTransport () @property (assign, nonatomic) int retryCounter; @property (assign, nonatomic) BOOL sessionSetupInProgress; -@property (assign, nonatomic) BOOL transportDisconnected; +@property (assign, nonatomic) BOOL transportDestroyed; @property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; @property (assign, nonatomic) BOOL accessoryConnectDuringActiveSession; - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAccessory:(EAAccessory *)newAccessory; @@ -134,7 +134,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc it(@"It should cleanup on disconnect", ^{ expect(transport.retryCounter).to(equal(0)); expect(transport.sessionSetupInProgress).to(beFalse()); - expect(transport.transportDisconnected).to(beFalse()); + expect(transport.transportDestroyed).to(beFalse()); }); }); @@ -153,7 +153,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc it(@"It should cleanup on disconnect", ^{ expect(transport.retryCounter).to(equal(0)); expect(transport.sessionSetupInProgress).to(beFalse()); - expect(transport.transportDisconnected).to(beTrue()); + expect(transport.transportDestroyed).to(beTrue()); }); it(@"It should close and destroy data session", ^{ @@ -180,7 +180,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc it(@"It should cleanup on disconnect", ^{ expect(transport.retryCounter).to(equal(0)); expect(transport.sessionSetupInProgress).to(beFalse()); - expect(transport.transportDisconnected).to(beFalse()); + expect(transport.transportDestroyed).to(beFalse()); }); it(@"It should close and destroy data session", ^{ From 335ca76d338ac11ee235a3c4c7066c698b6c4275 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Fri, 31 May 2019 16:11:11 -0400 Subject: [PATCH 140/179] Fixed compile error --- SmartDeviceLink/SDLIAPTransport.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index fa9d8a4a5..0caaebe8b 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -306,7 +306,7 @@ - (void)disconnect { * @param accessory The accessory to attempt connection with or nil to scan for accessories. */ - (void)sdl_connect:(nullable EAAccessory *)accessory { - if (self.transportDisconnected) { + if (self.transportDestroyed) { SDLLogV(@"Will not attempt to connect to an accessory because the data session disconnected. Waiting for lifecycle manager to create a new transport object."); return; } From e31c41e7ef183f9148a6e2f2fdeb85d34ca51dbd Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 4 Jun 2019 09:59:21 -0400 Subject: [PATCH 141/179] Removed unused var --- SmartDeviceLink/SDLIAPTransport.m | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 0caaebe8b..b420a98ba 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -334,13 +334,12 @@ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { self.retryCounter++; // If the accessory is not `nil` attempt to create a session with the accessory. - EAAccessory *sdlAccessory = accessory; - if (sdlAccessory != nil && [self sdl_establishSessionWithConnectedAccessory:sdlAccessory]) { + if (accessory != nil && [self sdl_establishSessionWithConnectedAccessory:accessory]) { // Session was created successfully with the accessory return; } - // Search through the EAAccessoryManager's connected accessory list for an SDL enabled accessory and if successful create a session with the accessory. + // Search through the EAAccessoryManager's connected accessory list for an SDL enabled accessory and attempt to create a session with the accessory. BOOL sessionEstablished = [self sdl_establishSessionWithAccessory]; if (!sessionEstablished) { SDLLogV(@"No accessory supporting SDL was found, dismissing setup. Available connected accessories: %@", EAAccessoryManager.sharedAccessoryManager.connectedAccessories); From fc10172bdebb8a66fd371137437c9b8095a93e13 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 4 Jun 2019 10:23:15 -0400 Subject: [PATCH 142/179] Refactored protocol string check --- SmartDeviceLink/SDLIAPTransport.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index b420a98ba..3422ff39f 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -576,7 +576,7 @@ - (BOOL)createSessionWithAccessory:(EAAccessory *)accessory protocolString:(NSSt } if ([protocolString isEqualToString:MultiSessionProtocolString] && SDL_SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9")) { - self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:MultiSessionProtocolString]; + self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocolString]; [self.dataSession startSession]; return YES; } else if ([protocolString isEqualToString:ControlProtocolString]) { @@ -584,7 +584,7 @@ - (BOOL)createSessionWithAccessory:(EAAccessory *)accessory protocolString:(NSSt [self.controlSession startSession]; return YES; } else if ([protocolString isEqualToString:LegacyProtocolString]) { - self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:LegacyProtocolString]; + self.dataSession = [[SDLIAPDataSession alloc] initWithAccessory:accessory delegate:self forProtocol:protocolString]; [self.dataSession startSession]; return YES; } From 888ea1ae1e9e250363c121d5cfc4be84760bf0a1 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Tue, 4 Jun 2019 10:45:16 -0400 Subject: [PATCH 143/179] added unit tests to test callbacks for filemanager , fixed issue with cell position. --- SmartDeviceLink/SDLMenuManager.m | 56 +++++++++--------- .../DevAPISpecs/SDLMenuCellSpec.m | 13 +++-- .../DevAPISpecs/SDLMenuManagerSpec.m | 57 ++++++++++++------- 3 files changed, 71 insertions(+), 55 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index f8710c39a..adc35b869 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -166,11 +166,11 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep NSArray *deleteMenuStatus = tempScore.oldStatus; NSArray *addMenuStatus = tempScore.updatedStatus; - NSArray *cellsToDelete = [self sdl_buildDeleteMenuItems:deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; - NSArray *cellsToAdd = [self sdl_buildAddMenuItems:addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + NSArray *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:deleteMenuStatus basedOnStatusList:oldKeptCells[startIndex].subCells]; + NSArray *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:addMenuStatus basedOnStatusList:newKeptCells[startIndex].subCells]; - NSArray *oldKeeps = [self sdl_buildOldKeepMenuItems: deleteMenuStatus compareTo:oldKeptCells[startIndex].subCells]; - NSArray *newKeeps = [self sdl_buildKeepNewMenuItems: addMenuStatus compareTo:newKeptCells[startIndex].subCells]; + NSArray *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems: deleteMenuStatus basedOnStatusList:oldKeptCells[startIndex].subCells]; + NSArray *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems: addMenuStatus basedOnStatusList:newKeptCells[startIndex].subCells]; [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId]; [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; @@ -188,46 +188,46 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep } } -- (NSArray *)sdl_buildDeleteMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { +- (NSArray *)sdl_filterDeleteMenuItemsWithOldMenuItems:(NSArray *)oldMenuItems basedOnStatusList:(NSArray *)oldList { NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,0,2,0] => [A,B,C,D] = [B,D] - for(NSUInteger index = 0; index < oldStatusList.count; index++) { - if(oldStatusList[index].integerValue == MenuCellStateDelete) { + for(NSUInteger index = 0; index < oldMenuItems.count; index++) { + if(oldMenuItems[index].integerValue == MenuCellStateDelete) { [deleteCells addObject:oldList[index]]; } } return [deleteCells copy]; } -- (NSArray *)sdl_buildAddMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)menuList { +- (NSArray *)sdl_filterAddMenuItemsWithNewMenuItems:(NSArray *)newMenuItems basedOnStatusList:(NSArray *)statusList { NSMutableArray *addCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,1,2,1] => [A,B,C,D] = [B,D] - for(NSUInteger index = 0; index < newStatusList.count; index++) { - if(newStatusList[index].integerValue == MenuCellStateAdd) { - [addCells addObject:menuList[index]]; + for(NSUInteger index = 0; index < newMenuItems.count; index++) { + if(newMenuItems[index].integerValue == MenuCellStateAdd) { + [addCells addObject:statusList[index]]; } } return [addCells copy]; } -- (NSArray *)sdl_buildOldKeepMenuItems:(NSArray *)oldStatusList compareTo:(NSArray *)oldList { +- (NSArray *)sdl_filterKeepMenuItemsWithOldMenuItems:(NSArray *)oldMenuItems basedOnStatusList:(NSArray *)statusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - for(NSUInteger index = 0; index < oldStatusList.count; index++) { - if(oldStatusList[index].integerValue == MenuCellStateKeep) { - [keepMenuCells addObject:oldList[index]]; + for(NSUInteger index = 0; index < oldMenuItems.count; index++) { + if(oldMenuItems[index].integerValue == MenuCellStateKeep) { + [keepMenuCells addObject:statusList[index]]; } } return [keepMenuCells copy]; } -- (NSArray *)sdl_buildKeepNewMenuItems:(NSArray *)newStatusList compareTo:(NSArray *)newList { +- (NSArray *)sdl_filterKeepMenuItemsWithNewMenuItems:(NSArray *)newMenuItems basedOnStatusList:(NSArray *)statusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - for(NSUInteger index = 0; index < newStatusList.count; index++) { - if(newStatusList[index].integerValue == MenuCellStateKeep) { - [keepMenuCells addObject:newList[index]]; + for(NSUInteger index = 0; index < newMenuItems.count; index++) { + if(newMenuItems[index].integerValue == MenuCellStateKeep) { + [keepMenuCells addObject:statusList[index]]; } } return [keepMenuCells copy]; @@ -248,11 +248,11 @@ - (void)sdl_startDynamicMenuUpdate { NSArray *deleteMenuStatus = self.runScore.oldStatus; NSArray *addMenuStatus = self.runScore.updatedStatus; - NSArray *cellsToDelete = [self sdl_buildDeleteMenuItems:deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *cellsToAdd = [self sdl_buildAddMenuItems:addMenuStatus compareTo:self.menuCells]; + NSArray *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:deleteMenuStatus basedOnStatusList:self.oldMenuCells]; + NSArray *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:addMenuStatus basedOnStatusList:self.menuCells]; // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares - NSArray *oldKeeps = [self sdl_buildOldKeepMenuItems:deleteMenuStatus compareTo:self.oldMenuCells]; - NSArray *newKeeps = [self sdl_buildKeepNewMenuItems:addMenuStatus compareTo:self.menuCells]; + NSArray *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems:deleteMenuStatus basedOnStatusList:self.oldMenuCells]; + NSArray *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems:addMenuStatus basedOnStatusList:self.menuCells]; // Cells that will be added need new ids [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; @@ -261,7 +261,7 @@ - (void)sdl_startDynamicMenuUpdate { [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; // Upload the artworks - NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; + NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:cellsToAdd]; if (artworksToBeUploaded.count > 0) { [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { if (error != nil) { @@ -421,9 +421,9 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSA - (BOOL)sdl_isDynamicMenuUpdateActive:(SDLDynamicMenuUpdatesMode)dynamicMenuUpdatesMode { switch (dynamicMenuUpdatesMode) { case SDLDynamicMenuUpdatesModeForceOn: - return true; + return YES; case SDLDynamicMenuUpdatesModeForceOff: - return false; + return NO; case SDLDynamicMenuUpdatesModeOnWithCompatibility: return ![self.displayCapabilities.displayName isEqualToEnum:SDLDisplayTypeGen38Inch]; } @@ -526,10 +526,10 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U for(NSUInteger cellIndex = 0; cellIndex < cells.count; cellIndex++) { if(cells[cellIndex].subCells.count > 0) { - [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)index]]; + [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)cellIndex]]; [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cells[cellIndex].subCells withArtwork:shouldHaveArtwork]]; } else { - [mutableCommands addObject:[self sdl_commandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)index]]; + [mutableCommands addObject:[self sdl_commandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)cellIndex]]; } } diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m index 5be085116..ee6f61278 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuCellSpec.m @@ -54,17 +54,18 @@ expect(testCell.voiceCommands).to(beNil()); expect(testCell.subCells).to(equal(someSubcells)); }); - - it(@"should compare cells and return true if equal", ^{ - testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells]; - testCell2 = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells]; + }); + describe(@"check cell eqality", ^{ + it(@"should compare cells and return true if cells equal", ^{ + testCell = [[SDLMenuCell alloc] initWithTitle:@"Title" icon:nil subCells:@[]]; + testCell2 = [[SDLMenuCell alloc] initWithTitle:@"Title" icon:nil subCells:@[]]; expect([testCell isEqual:testCell2]).to(equal(true)); }); it(@"should compare cells and return false if not equal ", ^{ - testCell = [[SDLMenuCell alloc] initWithTitle:someTitle icon:someArtwork subCells:someSubcells]; - testCell2 = [[SDLMenuCell alloc] initWithTitle:@"False" icon:someArtwork subCells:someSubcells]; + testCell = [[SDLMenuCell alloc] initWithTitle:@"True" icon:nil subCells:@[]]; + testCell2 = [[SDLMenuCell alloc] initWithTitle:@"False" icon:nil subCells:@[]]; expect([testCell isEqual:testCell2]).to(equal(false)); }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index 435073cc6..24da66726 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -266,15 +266,20 @@ @interface SDLMenuManager() describe(@"updating when a menu already exists with dynamic updates on", ^{ beforeEach(^{ testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOn; + OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]); }); it(@"should send deletes first", ^{ testManager.menuCells = @[textOnlyCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Adds - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Submenu + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textAndImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -282,16 +287,19 @@ @interface SDLMenuManager() NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; - expect(deletes).to(haveCount(1)); - expect(adds).to(haveCount(2)); + expect(deletes).to(haveCount(2)); + expect(adds).to(haveCount(3)); }); it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ - testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + testManager.menuCells = @[textOnlyCell, submenuCell, submenuImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork - testManager.menuCells = @[textAndImageCell, submenuCell, submenuImageCell, textOnlyCell]; + testManager.menuCells = @[submenuCell, submenuImageCell, textOnlyCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; @@ -304,17 +312,20 @@ @interface SDLMenuManager() NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; expect(deletes).to(haveCount(1)); - expect(adds).to(haveCount(6)); - expect(submenu).to(haveCount(2)); + expect(adds).to(haveCount(9)); + expect(submenu).to(haveCount(4)); }); it(@"should send dynamic deletes first then dynamic adds when removing one submenu cell", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -330,14 +341,17 @@ @interface SDLMenuManager() expect(deletes).to(haveCount(0)); expect(subDeletes).to(haveCount(1)); - expect(adds).to(haveCount(5)); - expect(submenu).to(haveCount(2)); + expect(adds).to(haveCount(10)); + expect(submenu).to(haveCount(4)); }); it(@"should send dynamic deletes first then dynamic adds when adding one new cell", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell, textOnlyCell2]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -353,17 +367,18 @@ @interface SDLMenuManager() NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; expect(deletes).to(haveCount(0)); - expect(adds).to(haveCount(6)); - expect(submenu).to(haveCount(2)); + expect(adds).to(haveCount(11)); + expect(submenu).to(haveCount(4)); }); it(@"should send dynamic deletes first then dynamic adds when cells stay the same", ^{ testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -372,7 +387,7 @@ @interface SDLMenuManager() NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; expect(deletes).to(haveCount(0)); - expect(adds).to(haveCount(3)); + expect(adds).to(haveCount(6)); }); }); From d99672428978c7d194853023ec512b426b18c99e Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Wed, 5 Jun 2019 09:59:17 -0400 Subject: [PATCH 144/179] Update documentation on AudioStreamManager --- SmartDeviceLink/SDLAudioStreamManager.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/SmartDeviceLink/SDLAudioStreamManager.h b/SmartDeviceLink/SDLAudioStreamManager.h index bb44ef978..b405cae5d 100755 --- a/SmartDeviceLink/SDLAudioStreamManager.h +++ b/SmartDeviceLink/SDLAudioStreamManager.h @@ -69,6 +69,15 @@ typedef NS_ENUM(NSInteger, SDLAudioStreamManagerError) { /** Push a new audio buffer onto the queue. Call `playNextWhenReady` to start playing the pushed audio buffer. + This data must be of the required PCM format. See SDLSystemCapabilityManager.pcmStreamCapability and SDLAudioPassThruCapability.h. + + This is *an example* of a PCM format used by some head units: + - audioType: PCM + - samplingRate: 16kHZ + - bitsPerSample: 16 bits + + There is generally only one channel to the data. + @param data The audio buffer to be pushed onto the queue */ - (void)pushWithData:(NSData *)data; From fbb94813f916049ffae1b7ec5aa41637b2257f0b Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Wed, 5 Jun 2019 10:01:18 -0400 Subject: [PATCH 145/179] Note new AudioStreamManager method --- SmartDeviceLink/SDLStreamingMediaManager.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLStreamingMediaManager.h b/SmartDeviceLink/SDLStreamingMediaManager.h index c306f8550..8e96e7ebb 100644 --- a/SmartDeviceLink/SDLStreamingMediaManager.h +++ b/SmartDeviceLink/SDLStreamingMediaManager.h @@ -170,7 +170,9 @@ NS_ASSUME_NONNULL_BEGIN - (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer presentationTimestamp:(CMTime)presentationTimestamp; /** - * This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback + * This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback. + * + * NOTE: See the `.audioManager` (SDLAudioStreamManager) `pushWithData:` method for a more modern API. * * @param audioData The data in PCM audio format, to be played * From b7f13d11037bb29a213fc07036489c97d897ce36 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 5 Jun 2019 10:21:17 -0400 Subject: [PATCH 146/179] Operation finished if no text or image buttons sent --- SmartDeviceLink/SDLSoftButtonReplaceOperation.m | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m index 82f5b4ffe..c967e10a9 100644 --- a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m +++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m @@ -56,11 +56,17 @@ - (void)start { SDLLogW(@"Soft button images are not supported. Attempting to send text-only soft buttons. If any button does not contain text, no buttons will be sent."); // Send text buttons if all the soft buttons have text - [self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^{}]; + __weak typeof(self) weakself = self; + [self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^(BOOL success) { + if (!success) { + SDLLogE(@"Head unit does not support images and some of the soft buttons do not have text, so none of the buttons will be sent."); + [weakself finishOperation]; + } + }]; } else if ([self sdl_currentStateHasImages] && ![self sdl_allCurrentStateImagesAreUploaded]) { // If there are images that aren't uploaded // Send text buttons if all the soft buttons have text - [self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^{}]; + [self sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:^(BOOL success) {}]; // Upload initial images __weak typeof(self) weakself = self; @@ -205,7 +211,7 @@ - (void)sdl_sendCurrentStateSoftButtonsWithCompletionHandler:(void (^)(void))han /** Returns text soft buttons representing the current states of the button objects, or returns if _any_ of the buttons' current states are image only buttons. */ -- (void)sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:(void (^)(void))handler { +- (void)sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:(void (^)(BOOL success))handler { if (self.isCancelled) { [self finishOperation]; } @@ -216,7 +222,7 @@ - (void)sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:(void (^)(v SDLSoftButton *button = buttonObject.currentStateSoftButton; if (button.text == nil) { SDLLogW(@"Attempted to create text buttons, but some buttons don't support text, so no text-only soft buttons will be sent"); - handler(); + handler(NO); return; } @@ -235,7 +241,7 @@ - (void)sdl_sendCurrentStateTextOnlySoftButtonsWithCompletionHandler:(void (^)(v } SDLLogD(@"Finished sending text only soft buttons"); - handler(); + handler(YES); }]; } From dd9bb6f799c0cf438c1e58ba65e8ffd31621f614 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 5 Jun 2019 11:21:34 -0400 Subject: [PATCH 147/179] Added test cases --- .../SDLSoftButtonReplaceOperationSpec.m | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m index 2c8de460f..8b162d283 100644 --- a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m +++ b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m @@ -52,6 +52,13 @@ __block SDLSoftButtonState *object3State1 = nil; __block SDLSoftButtonObject *button3 = nil; + __block NSString *object4Name = @"O4 Name"; + __block NSString *object4State1Name = @"O4S1 Name"; + __block NSString *object4State1IconName = SDLStaticIconNameAlbum; + __block SDLArtwork *object4State1Art = nil; + __block SDLSoftButtonState *object4State1 = nil; + __block SDLSoftButtonObject *button4 = nil; + __block NSString *testMainField1 = @"Test main field 1"; beforeEach(^{ @@ -73,6 +80,10 @@ object3State1 = [[SDLSoftButtonState alloc] initWithStateName:object3State1Name text:object3State1Text artwork:object3State1Art]; button3 = [[SDLSoftButtonObject alloc] initWithName:object3Name state:object3State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}]; + object4State1Art = [[SDLArtwork alloc] initWithStaticIcon:object4State1IconName]; + object4State1 = [[SDLSoftButtonState alloc] initWithStateName:object4State1Name text:nil artwork:object4State1Art];; + button4 = [[SDLSoftButtonObject alloc] initWithName:object4Name state:object4State1 handler:^(SDLOnButtonPress * _Nullable buttonPress, SDLOnButtonEvent * _Nullable buttonEvent) {}];; + OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:[OCMArg invokeBlock] completionHandler:[OCMArg invokeBlock]]); }); @@ -139,6 +150,35 @@ }); }); + context(@"but we don't support artworks and some buttons are image-only", ^{ + __block NSArray *testImageOnlySoftButtonObjects = nil; + + beforeEach(^{ + testImageOnlySoftButtonObjects = @[button3, button4]; + }); + + beforeEach(^{ + SDLSoftButtonCapabilities *capabilities = [[SDLSoftButtonCapabilities alloc] init]; + capabilities.imageSupported = @NO; + + testOp = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager capabilities:capabilities softButtonObjects:testImageOnlySoftButtonObjects mainField1:testMainField1]; + [testOp start]; + }); + + it(@"should not send artworks", ^{ + OCMReject([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg any]]); + }); + + it(@"should not send any buttons", ^{ + NSArray *sentRequests = testConnectionManager.receivedRequests; + expect(sentRequests).to(haveCount(0)); + }); + + it(@"should have set the operation to finished", ^ { + expect(testOp.isFinished).to(beTrue()); + }); + }); + context(@"and we support artworks", ^{ __block SDLSoftButtonCapabilities *buttonCapabilities = nil; From 02465d1dbeb8eb4dce1af6ca8d8749eafb511862 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 5 Jun 2019 13:18:48 -0400 Subject: [PATCH 148/179] addbetter documentation , added unit tests , fixes some minor PR issues --- SmartDeviceLink/SDLMenuManager.m | 11 ++--- SmartDeviceLink/SDLScreenManager.h | 3 +- .../DevAPISpecs/SDLMenuManagerSpec.m | 43 ++++++++++++++++++- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index adc35b869..f4728839c 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -146,7 +146,7 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; - if([self sdl_isDynamicMenuUpdateActive: self.dynamicMenuUpdatesMode]) { + if([self sdl_isDynamicMenuUpdateActive:self.dynamicMenuUpdatesMode]) { [self sdl_startDynamicMenuUpdate]; } else { [self sdl_startNonDynamicMenuUpdate]; @@ -319,7 +319,7 @@ - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells ce __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { - [weakself sdl_sendUpdatedMenu:addCells usingMenu: weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { + [weakself sdl_sendUpdatedMenu:addCells usingMenu:weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { weakself.inProgressUpdate = nil; if (completionHandler != nil) { @@ -485,11 +485,12 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U #pragma mark Commands / SubMenu RPCs /** - Add menu commands + This method will receive the cells to be added and the updated menu array. It will then build an array of add commands using the correct index to position the new items in the correct location. - @param cells that need to be added + @param cells that will be added to the menu, this array must contain only cells that are not already in the menu. @param shouldHaveArtwork artwork bool - @param menu a list of all cells to get index, either main menu or subcells + @param the new menu array, this array should contain all the values the develeoper has set to be included in the new menu. This is used for placing the newly added cells in the correct locaiton. + e.g. If the new menu array is [A, B, C, D] but only [C, D] are new we need to pass [A, B , C , D] so C and D can be added to index 2 and 3 respectively. @return list of SDLRPCRequest addCommands */ - (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexOf:(NSArray *)menu { diff --git a/SmartDeviceLink/SDLScreenManager.h b/SmartDeviceLink/SDLScreenManager.h index 91e0498be..576cbd145 100644 --- a/SmartDeviceLink/SDLScreenManager.h +++ b/SmartDeviceLink/SDLScreenManager.h @@ -121,7 +121,8 @@ typedef void(^SDLPreloadChoiceCompletionHandler)(NSError *__nullable error); @property (copy, nonatomic) NSArray *menu; /** - The current status for dynamic menu updates. + The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to SDLDynamicMenuUpdatesModeForceOn, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI. If set to SDLDynamicMenuUpdatesModeForceOff, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus. We reccomend using either SDLDynamicMenuUpdatesModeOnWithCompatibility or SDLDynamicMenuUpdatesModeForceOn. SDLDynamicMenuUpdatesModeOnWithCompatibility makes sure you have a head unit that supports dynamic updates. If the head unit does not support dynamic updates, dynamic updates will be set to off automatically. + */ @property (assign, nonatomic) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index 24da66726..998952bcb 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -7,21 +7,30 @@ #import "SDLDeleteCommand.h" #import "SDLDeleteSubMenu.h" #import "SDLDisplayCapabilities.h" +#import "SDLDisplayType.h" #import "SDLFileManager.h" #import "SDLHMILevel.h" #import "SDLImage.h" #import "SDLImageField.h" #import "SDLImageFieldName.h" +#import "SDLMediaClockFormat.h" #import "SDLMenuCell.h" #import "SDLMenuManager.h" #import "SDLMenuManagerConstants.h" #import "SDLOnCommand.h" #import "SDLOnHMIStatus.h" +#import "SDLRegisterAppInterfaceResponse.h" #import "SDLRPCNotificationNotification.h" -#import "SDLSystemContext.h" +#import "SDLRPCParameterNames.h" +#import "SDLRPCResponseNotification.h" +#import "SDLSetDisplayLayoutResponse.h" #import "SDLScreenManager.h" +#import "SDLScreenParams.h" +#import "SDLSystemContext.h" +#import "SDLTextField.h" #import "TestConnectionManager.h" + @interface SDLMenuCell() @property (assign, nonatomic) UInt32 parentCellId; @@ -54,7 +63,9 @@ @interface SDLMenuManager() __block SDLMenuManager *testManager = nil; __block TestConnectionManager *mockConnectionManager = nil; __block SDLFileManager *mockFileManager = nil; - + __block SDLSetDisplayLayoutResponse *testSetDisplayLayoutResponse = nil; + __block SDLDisplayCapabilities *testDisplayCapabilities = nil; + __block SDLRegisterAppInterfaceResponse *testRegisterAppInterfaceResponse = nil; __block SDLArtwork *testArtwork = nil; __block SDLArtwork *testArtwork2 = nil; @@ -160,6 +171,34 @@ @interface SDLMenuManager() }); }); + describe(@"Notificaiton Responses", ^{ + it(@"should set display capabilities when SDLDidReceiveSetDisplayLayoutResponse is received", ^{ + testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init]; + + testSetDisplayLayoutResponse = [[SDLSetDisplayLayoutResponse alloc] init]; + testSetDisplayLayoutResponse.success = @YES; + testSetDisplayLayoutResponse.displayCapabilities = testDisplayCapabilities; + + SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveRegisterAppInterfaceResponse object:self rpcResponse:testSetDisplayLayoutResponse]; + [[NSNotificationCenter defaultCenter] postNotification:notification]; + + expect(testManager.displayCapabilities).to(equal(testDisplayCapabilities)); + }); + + it(@"should set display capabilities when SDLDidReceiveRegisterAppInterfaceResponse is received", ^{ + testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init]; + + testRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init]; + testRegisterAppInterfaceResponse.success = @YES; + testRegisterAppInterfaceResponse.displayCapabilities = testDisplayCapabilities; + + SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveSetDisplayLayoutResponse object:self rpcResponse:testRegisterAppInterfaceResponse]; + [[NSNotificationCenter defaultCenter] postNotification:notification]; + + expect(testManager.displayCapabilities).to(equal(testDisplayCapabilities)); + }); + }); + describe(@"updating menu cells", ^{ beforeEach(^{ testManager.currentHMILevel = SDLHMILevelFull; From 7b3972399f7cc650303af8171301428dcd7c2dad Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 10 Jun 2019 13:19:40 -0400 Subject: [PATCH 149/179] fixing pr issues, formatting, spelling, documentation --- .../SDLDynamicMenuUpdateAlgorithm.m | 24 ++++---- SmartDeviceLink/SDLMenuManager.m | 55 ++++++++++--------- SmartDeviceLink/SDLScreenManager.h | 7 ++- 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m b/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m index 552bf6644..51bfd14e2 100644 --- a/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m +++ b/SmartDeviceLink/SDLDynamicMenuUpdateAlgorithm.m @@ -18,11 +18,11 @@ @implementation SDLDynamicMenuUpdateAlgorithm #pragma mark - Update Menu Cells + (nullable SDLDynamicMenuUpdateRunScore *)compareOldMenuCells:(NSArray *)oldMenuCells updatedMenuCells:(NSArray *)updatedMenuCells{ - if(oldMenuCells.count > 0 && updatedMenuCells.count == 0) { + if (oldMenuCells.count > 0 && updatedMenuCells.count == 0) { return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllDeleteStatusesforMenu:oldMenuCells] updatedStatus:@[] score:0]; - }else if(oldMenuCells.count == 0 && updatedMenuCells.count > 0) { + }else if (oldMenuCells.count == 0 && updatedMenuCells.count > 0) { return [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:@[] updatedStatus:[SDLDynamicMenuUpdateAlgorithm sdl_buildAllAddStatusesForMenu:updatedMenuCells] score:updatedMenuCells.count]; - } else if(oldMenuCells.count == 0 && updatedMenuCells.count == 0) { + } else if (oldMenuCells.count == 0 && updatedMenuCells.count == 0) { return nil; } @@ -38,10 +38,10 @@ + (nullable SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)sta NSMutableArray *newMenuStatus = [SDLDynamicMenuUpdateAlgorithm sdl_buildAllAddStatusesForMenu:updatedMenuCells]; NSUInteger startIndex = 0; - for(NSUInteger oldCellIndex = run; oldCellIndex < oldMenuCells.count; oldCellIndex++) { //For each old item + for (NSUInteger oldCellIndex = run; oldCellIndex < oldMenuCells.count; oldCellIndex++) { //For each old item // Create inner loop to compare old cells to new cells to find a match, if a match if found we mark the index at match for both the old and the new status to keep since we do not want to send RPCs for those cases - for(NSUInteger newCellIndex = startIndex; newCellIndex < updatedMenuCells.count; newCellIndex++) { - if([oldMenuCells[oldCellIndex] isEqual:updatedMenuCells[newCellIndex]]) { + for (NSUInteger newCellIndex = startIndex; newCellIndex < updatedMenuCells.count; newCellIndex++) { + if ([oldMenuCells[oldCellIndex] isEqual:updatedMenuCells[newCellIndex]]) { oldMenuStatus[oldCellIndex] = @(MenuCellStateKeep); newMenuStatus[newCellIndex] = @(MenuCellStateKeep); startIndex = newCellIndex + 1; @@ -52,20 +52,20 @@ + (nullable SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)sta // Add RPC are the biggest operation so we need to find the run with the least amount of Adds. We will reset the run we use each time a runscore is less than the current score. NSUInteger numberOfAdds = 0; - for(NSUInteger status = 0; status < newMenuStatus.count; status++) { + for (NSUInteger status = 0; status < newMenuStatus.count; status++) { // 0 = Delete 1 = Add 2 = Keep - if(newMenuStatus[status].integerValue == MenuCellStateAdd) { + if (newMenuStatus[status].integerValue == MenuCellStateAdd) { numberOfAdds++; } } // As soon as we a run that requires 0 Adds we will use it since we cant do better then 0 - if(numberOfAdds == 0) { + if (numberOfAdds == 0) { bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; return bestScore; } // if we havent create the bestScore object or if the current score beats the old score then we will create a new bestScore - if(bestScore == nil || numberOfAdds < bestScore.score) { + if (bestScore == nil || numberOfAdds < bestScore.score) { bestScore = [[SDLDynamicMenuUpdateRunScore alloc] initWithOldStatus:oldMenuStatus updatedStatus:newMenuStatus score:numberOfAdds]; } } @@ -80,7 +80,7 @@ + (nullable SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)sta */ + (NSMutableArray *)sdl_buildAllDeleteStatusesforMenu:(NSArray *)oldMenu { NSMutableArray *oldMenuStatus = [[NSMutableArray alloc] init]; - for(NSUInteger index = 0; index < oldMenu.count; index++) { + for (NSUInteger index = 0; index < oldMenu.count; index++) { [oldMenuStatus addObject:@(MenuCellStateDelete)]; } return [oldMenuStatus mutableCopy]; @@ -93,7 +93,7 @@ + (nullable SDLDynamicMenuUpdateRunScore *)sdl_startCompareAtRun:(NSUInteger)sta */ + (NSMutableArray *)sdl_buildAllAddStatusesForMenu:(NSArray *)newMenu { NSMutableArray *newMenuStatus = [[NSMutableArray alloc] init]; - for(NSUInteger index = 0; index < newMenu.count; index++) { + for (NSUInteger index = 0; index < newMenu.count; index++) { [newMenuStatus addObject:@(MenuCellStateAdd)]; } return [newMenuStatus mutableCopy]; diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index f4728839c..b782d49c6 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -146,7 +146,7 @@ - (void)setMenuCells:(NSArray *)menuCells { _oldMenuCells = _menuCells; _menuCells = menuCells; - if([self sdl_isDynamicMenuUpdateActive:self.dynamicMenuUpdatesMode]) { + if ([self sdl_isDynamicMenuUpdateActive:self.dynamicMenuUpdatesMode]) { [self sdl_startDynamicMenuUpdate]; } else { [self sdl_startNonDynamicMenuUpdate]; @@ -156,12 +156,12 @@ - (void)setMenuCells:(NSArray *)menuCells { #pragma mark - Build Deletes, Keeps, Adds - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKeptCells newKeptCells:(NSArray *)newKeptCells atIndex:(NSUInteger)startIndex { - if(oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) { + if (oldKeptCells.count == 0 || startIndex >= oldKeptCells.count) { self.inProgressUpdate = nil; return; } - if(oldKeptCells[startIndex].subCells.count > 0) { + if (oldKeptCells[startIndex].subCells.count > 0) { SDLDynamicMenuUpdateRunScore *tempScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:oldKeptCells[startIndex].subCells updatedMenuCells:newKeptCells[startIndex].subCells]; NSArray *deleteMenuStatus = tempScore.oldStatus; NSArray *addMenuStatus = tempScore.updatedStatus; @@ -192,8 +192,8 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,0,2,0] => [A,B,C,D] = [B,D] - for(NSUInteger index = 0; index < oldMenuItems.count; index++) { - if(oldMenuItems[index].integerValue == MenuCellStateDelete) { + for (NSUInteger index = 0; index < oldMenuItems.count; index++) { + if (oldMenuItems[index].integerValue == MenuCellStateDelete) { [deleteCells addObject:oldList[index]]; } } @@ -204,8 +204,8 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep NSMutableArray *addCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,1,2,1] => [A,B,C,D] = [B,D] - for(NSUInteger index = 0; index < newMenuItems.count; index++) { - if(newMenuItems[index].integerValue == MenuCellStateAdd) { + for (NSUInteger index = 0; index < newMenuItems.count; index++) { + if (newMenuItems[index].integerValue == MenuCellStateAdd) { [addCells addObject:statusList[index]]; } } @@ -215,8 +215,8 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep - (NSArray *)sdl_filterKeepMenuItemsWithOldMenuItems:(NSArray *)oldMenuItems basedOnStatusList:(NSArray *)statusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - for(NSUInteger index = 0; index < oldMenuItems.count; index++) { - if(oldMenuItems[index].integerValue == MenuCellStateKeep) { + for (NSUInteger index = 0; index < oldMenuItems.count; index++) { + if (oldMenuItems[index].integerValue == MenuCellStateKeep) { [keepMenuCells addObject:statusList[index]]; } } @@ -225,8 +225,8 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep - (NSArray *)sdl_filterKeepMenuItemsWithNewMenuItems:(NSArray *)newMenuItems basedOnStatusList:(NSArray *)statusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - for(NSUInteger index = 0; index < newMenuItems.count; index++) { - if(newMenuItems[index].integerValue == MenuCellStateKeep) { + for (NSUInteger index = 0; index < newMenuItems.count; index++) { + if (newMenuItems[index].integerValue == MenuCellStateKeep) { [keepMenuCells addObject:statusList[index]]; } } @@ -235,7 +235,7 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep - (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCells:(NSArray *)newCells { if (oldCells.count == 0) { return; } - for(NSUInteger i = 0; i < newCells.count; i++) { + for (NSUInteger i = 0; i < newCells.count; i++) { newCells[i].cellId = oldCells[i].cellId; } } @@ -365,7 +365,7 @@ - (void)sdl_sendDeleteCurrentMenu:(nullable NSArray *)deleteMenuC */ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSArray *)menu withCompletionHandler:(SDLMenuUpdateCompletionHandler)completionHandler { if (self.menuCells.count == 0 || updatedMenu.count == 0) { - SDLLogD(@"No main menu to send"); + SDLLogD(@"There are no cells to update."); completionHandler(nil); return; } @@ -375,11 +375,11 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSA if ([self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells].count > 0 || ![self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameCommandIcon]) { // Send artwork-less menu - mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO usingIndexOf:menu]; + mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO usingIndexesFrom:menu]; subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:NO]; } else { // Send full artwork menu - mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:YES usingIndexOf:menu]; + mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:YES usingIndexesFrom:menu]; subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:YES]; } @@ -397,8 +397,7 @@ - (void)sdl_sendUpdatedMenu:(NSArray *)updatedMenu usingMenu:(NSA completionHandler([NSError sdl_menuManager_failedToUpdateWithDictionary:errors]); return; } - - //weakSelf.oldMenuCells = weakSelf.menuCells; // ASK about this what does oldMenuCells become now? Dont do this yet we need to delete // add subcells first + [weakSelf.connectionManager sendRequests:subMenuCommands progressHandler:^(__kindof SDLRPCRequest * _Nonnull request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error, float percentComplete) { if (error != nil) { errors[request] = error; @@ -425,7 +424,11 @@ - (BOOL)sdl_isDynamicMenuUpdateActive:(SDLDynamicMenuUpdatesMode)dynamicMenuUpda case SDLDynamicMenuUpdatesModeForceOff: return NO; case SDLDynamicMenuUpdatesModeOnWithCompatibility: - return ![self.displayCapabilities.displayName isEqualToEnum:SDLDisplayTypeGen38Inch]; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + return ![self.displayCapabilities.displayType isEqualToEnum:SDLDisplayTypeGen38Inch]; +#pragma clang diagnostic pop + } } @@ -489,17 +492,17 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U @param cells that will be added to the menu, this array must contain only cells that are not already in the menu. @param shouldHaveArtwork artwork bool - @param the new menu array, this array should contain all the values the develeoper has set to be included in the new menu. This is used for placing the newly added cells in the correct locaiton. + @param menu the new menu array, this array should contain all the values the develeoper has set to be included in the new menu. This is used for placing the newly added cells in the correct locaiton. e.g. If the new menu array is [A, B, C, D] but only [C, D] are new we need to pass [A, B , C , D] so C and D can be added to index 2 and 3 respectively. @return list of SDLRPCRequest addCommands */ -- (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexOf:(NSArray *)menu { +- (NSArray *)sdl_mainMenuCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork usingIndexesFrom:(NSArray *)menu { NSMutableArray *mutableCommands = [NSMutableArray array]; - for(NSUInteger menuInteger = 0; menuInteger < menu.count; menuInteger++) { - for(NSUInteger updateCellsIndex = 0; updateCellsIndex < cells.count; updateCellsIndex++) { - if([menu[menuInteger] isEqual:cells[updateCellsIndex]]) { - if(cells[updateCellsIndex].subCells.count > 0) { + for (NSUInteger menuInteger = 0; menuInteger < menu.count; menuInteger++) { + for (NSUInteger updateCellsIndex = 0; updateCellsIndex < cells.count; updateCellsIndex++) { + if ([menu[menuInteger] isEqual:cells[updateCellsIndex]]) { + if (cells[updateCellsIndex].subCells.count > 0) { [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[updateCellsIndex] withArtwork:shouldHaveArtwork position:(UInt16)menuInteger]]; } else { [mutableCommands addObject:[self sdl_commandForMenuCell:cells[updateCellsIndex] withArtwork:shouldHaveArtwork position:(UInt16)menuInteger]]; @@ -525,8 +528,8 @@ - (void)sdl_updateIdsOnMenuCells:(NSArray *)menuCells parentId:(U - (NSArray *)sdl_allCommandsForCells:(NSArray *)cells withArtwork:(BOOL)shouldHaveArtwork { NSMutableArray *mutableCommands = [NSMutableArray array]; - for(NSUInteger cellIndex = 0; cellIndex < cells.count; cellIndex++) { - if(cells[cellIndex].subCells.count > 0) { + for (NSUInteger cellIndex = 0; cellIndex < cells.count; cellIndex++) { + if (cells[cellIndex].subCells.count > 0) { [mutableCommands addObject:[self sdl_subMenuCommandForMenuCell:cells[cellIndex] withArtwork:shouldHaveArtwork position:(UInt16)cellIndex]]; [mutableCommands addObjectsFromArray:[self sdl_allCommandsForCells:cells[cellIndex].subCells withArtwork:shouldHaveArtwork]]; } else { diff --git a/SmartDeviceLink/SDLScreenManager.h b/SmartDeviceLink/SDLScreenManager.h index 576cbd145..1bdb67db4 100644 --- a/SmartDeviceLink/SDLScreenManager.h +++ b/SmartDeviceLink/SDLScreenManager.h @@ -121,8 +121,13 @@ typedef void(^SDLPreloadChoiceCompletionHandler)(NSError *__nullable error); @property (copy, nonatomic) NSArray *menu; /** - The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to SDLDynamicMenuUpdatesModeForceOn, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI. If set to SDLDynamicMenuUpdatesModeForceOff, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus. We reccomend using either SDLDynamicMenuUpdatesModeOnWithCompatibility or SDLDynamicMenuUpdatesModeForceOn. SDLDynamicMenuUpdatesModeOnWithCompatibility makes sure you have a head unit that supports dynamic updates. If the head unit does not support dynamic updates, dynamic updates will be set to off automatically. +Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units. +The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to `SDLDynamicMenuUpdatesModeForceOn`, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI. + +If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus. + + We recommend using either `SDLDynamicMenuUpdatesModeOnWithCompatibility` or `SDLDynamicMenuUpdatesModeForceOn`. `SDLDynamicMenuUpdatesModeOnWithCompatibility` turns dynamic updates off for head units that we know have poor compatibility with dynamic updates (e.g. they have bugs that cause menu items to not be placed correctly). */ @property (assign, nonatomic) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; From 8b13335650193d9196bf16cb6c90c6dd720c6465 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Fri, 14 Jun 2019 14:33:31 -0400 Subject: [PATCH 150/179] Fix missing parameter name --- SmartDeviceLink/SDLManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h index 58a234923..10ff76def 100644 --- a/SmartDeviceLink/SDLManager.h +++ b/SmartDeviceLink/SDLManager.h @@ -181,7 +181,7 @@ typedef void (^SDLManagerReadyBlock)(BOOL success, NSError *_Nullable error); #pragma mark - RPC Subscriptions -typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *); +typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *message); /** * Subscribe to callbacks about a particular RPC request, notification, or response with a block callback. From 10362efe9a871d6e7becb683083c7003c4ad394a Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Mon, 17 Jun 2019 09:28:46 -0400 Subject: [PATCH 151/179] Fix documentation --- SmartDeviceLink/SDLManager.h | 6 ++---- SmartDeviceLink/SDLSystemCapabilityManager.h | 2 +- SmartDeviceLink/SDLSystemCapabilityManager.m | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/SmartDeviceLink/SDLManager.h b/SmartDeviceLink/SDLManager.h index 10ff76def..9764f3f3a 100644 --- a/SmartDeviceLink/SDLManager.h +++ b/SmartDeviceLink/SDLManager.h @@ -197,13 +197,11 @@ typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *message); * * The selector supports the following parameters: * - * 1. One parameter e.g. `- (void)registerAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response;` - * 2. Two parameters e.g. `- (void)registerAppInterfaceResponse:(SDLRegisterAppInterfaceResponse *)response error:(nullable NSError *)error;` + * 1. Zero parameters e.g. `- (void)registerAppInterfaceResponse` + * 2. One parameter e.g. `- (void)registerAppInterfaceResponse:(NSNotification *)notification;` * * Note that using this method to get a response instead of the `sendRequest:withResponseHandler:` method of getting a response, you will not be notifed of any `SDLGenericResponse` errors where the head unit doesn't understand the request. * - * The error will be called if `response.success` is `NO` and will be filled with the info field. - * * @param rpcName The name of the RPC request, response, or notification to subscribe to. * @param observer The object that will have its selector called every time an RPC of the name and type specified is received. * @param selector The selector on `observer` that will be called every time an RPC of the name and type specified is received. diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h index 38030365a..2a86d77c8 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.h +++ b/SmartDeviceLink/SDLSystemCapabilityManager.h @@ -224,7 +224,7 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability); @param block The block to be called when the capability is updated @return An object that can be used to unsubscribe the block using unsubscribeFromCapabilityType:withObserver: by passing it in the observer callback, or nil if subscriptions aren't available on this head unit */ -- (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block; +- (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type withBlock:(SDLCapabilityUpdateHandler)block; /** * Subscribe to a particular capability type with a selector callback. The selector supports the following parameters: diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m index 82d7c8c82..ceeea6c3c 100644 --- a/SmartDeviceLink/SDLSystemCapabilityManager.m +++ b/SmartDeviceLink/SDLSystemCapabilityManager.m @@ -365,7 +365,7 @@ - (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newC #pragma mark - Subscriptions -- (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type usingBlock:(SDLCapabilityUpdateHandler)block { +- (nullable id)subscribeToCapabilityType:(SDLSystemCapabilityType)type withBlock:(SDLCapabilityUpdateHandler)block { if (!self.supportsSubscriptions) { return nil; } SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] block:block]; From 167bce8d5005bc66cffcdcda73eeb134e4674530 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 17 Jun 2019 10:21:30 -0400 Subject: [PATCH 152/179] Added missing apostrophe --- SmartDeviceLink-iOS.podspec | 2 +- SmartDeviceLink.podspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec index c105670e0..75382d935 100644 --- a/SmartDeviceLink-iOS.podspec +++ b/SmartDeviceLink-iOS.podspec @@ -205,7 +205,7 @@ ss.public_header_files = [ 'SmartDeviceLink/SDLMediaServiceManifest.h', 'SmartDeviceLink/SDLMediaType.h', 'SmartDeviceLink/SDLMenuCell.h', -'SmartDeviceLink/SDLMenuManagerConstants.h, +'SmartDeviceLink/SDLMenuManagerConstants.h', 'SmartDeviceLink/SDLMenuParams.h', 'SmartDeviceLink/SDLMetadataTags.h', 'SmartDeviceLink/SDLMetadataType.h', diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec index c75c42a83..0394e5347 100644 --- a/SmartDeviceLink.podspec +++ b/SmartDeviceLink.podspec @@ -206,7 +206,7 @@ sdefault.public_header_files = [ 'SmartDeviceLink/SDLMediaServiceManifest.h', 'SmartDeviceLink/SDLMediaType.h', 'SmartDeviceLink/SDLMenuCell.h', -'SmartDeviceLink/SDLMenuManagerConstants.h, +'SmartDeviceLink/SDLMenuManagerConstants.h', 'SmartDeviceLink/SDLMenuParams.h', 'SmartDeviceLink/SDLMetadataTags.h', 'SmartDeviceLink/SDLMetadataType.h', From 07f49b6fa9f52f1e77a0c7054390f7d8620f2603 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Mon, 17 Jun 2019 16:23:23 -0400 Subject: [PATCH 153/179] Fix `runScore` being a property and several method / variable names --- SmartDeviceLink/SDLMenuManager.m | 57 ++++++++++++++++---------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index b782d49c6..4698c093b 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -58,7 +58,7 @@ @interface SDLMenuManager() @property (assign, nonatomic) UInt32 lastMenuId; @property (copy, nonatomic) NSArray *oldMenuCells; -@property (copy, nonatomic, nullable) SDLDynamicMenuUpdateRunScore *runScore; + @end UInt32 const ParentIdNotFound = UINT32_MAX; @@ -105,7 +105,6 @@ - (void)stop { _hasQueuedUpdate = NO; _waitingOnHMIUpdate = NO; _waitingUpdateMenuCells = @[]; - _runScore = nil; } #pragma mark - Setters @@ -166,11 +165,11 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep NSArray *deleteMenuStatus = tempScore.oldStatus; NSArray *addMenuStatus = tempScore.updatedStatus; - NSArray *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:deleteMenuStatus basedOnStatusList:oldKeptCells[startIndex].subCells]; - NSArray *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:addMenuStatus basedOnStatusList:newKeptCells[startIndex].subCells]; + NSArray *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:oldKeptCells[startIndex].subCells basedOnStatusList:deleteMenuStatus]; + NSArray *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:newKeptCells[startIndex].subCells basedOnStatusList:addMenuStatus]; - NSArray *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems: deleteMenuStatus basedOnStatusList:oldKeptCells[startIndex].subCells]; - NSArray *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems: addMenuStatus basedOnStatusList:newKeptCells[startIndex].subCells]; + NSArray *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems:oldKeptCells[startIndex].subCells basedOnStatusList:deleteMenuStatus]; + NSArray *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems:newKeptCells[startIndex].subCells basedOnStatusList:addMenuStatus]; [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:newKeptCells[startIndex].cellId]; [self transferCellIDFromOldCells:oldKeeps toKeptCells:newKeeps]; @@ -188,46 +187,46 @@ - (void)sdl_startSubMenuUpdatesWithOldKeptCells:(NSArray *)oldKep } } -- (NSArray *)sdl_filterDeleteMenuItemsWithOldMenuItems:(NSArray *)oldMenuItems basedOnStatusList:(NSArray *)oldList { +- (NSArray *)sdl_filterDeleteMenuItemsWithOldMenuItems:(NSArray *)oldMenuCells basedOnStatusList:(NSArray *)oldStatusList { NSMutableArray *deleteCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,0,2,0] => [A,B,C,D] = [B,D] - for (NSUInteger index = 0; index < oldMenuItems.count; index++) { - if (oldMenuItems[index].integerValue == MenuCellStateDelete) { - [deleteCells addObject:oldList[index]]; + for (NSUInteger index = 0; index < oldStatusList.count; index++) { + if (oldStatusList[index].integerValue == MenuCellStateDelete) { + [deleteCells addObject:oldMenuCells[index]]; } } return [deleteCells copy]; } -- (NSArray *)sdl_filterAddMenuItemsWithNewMenuItems:(NSArray *)newMenuItems basedOnStatusList:(NSArray *)statusList { +- (NSArray *)sdl_filterAddMenuItemsWithNewMenuItems:(NSArray *)newMenuCells basedOnStatusList:(NSArray *)newStatusList { NSMutableArray *addCells = [[NSMutableArray alloc] init]; // The index of the status should corrleate 1-1 with the number of items in the menu // [2,1,2,1] => [A,B,C,D] = [B,D] - for (NSUInteger index = 0; index < newMenuItems.count; index++) { - if (newMenuItems[index].integerValue == MenuCellStateAdd) { - [addCells addObject:statusList[index]]; + for (NSUInteger index = 0; index < newStatusList.count; index++) { + if (newStatusList[index].integerValue == MenuCellStateAdd) { + [addCells addObject:newMenuCells[index]]; } } return [addCells copy]; } -- (NSArray *)sdl_filterKeepMenuItemsWithOldMenuItems:(NSArray *)oldMenuItems basedOnStatusList:(NSArray *)statusList { +- (NSArray *)sdl_filterKeepMenuItemsWithOldMenuItems:(NSArray *)oldMenuCells basedOnStatusList:(NSArray *)keepStatusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - for (NSUInteger index = 0; index < oldMenuItems.count; index++) { - if (oldMenuItems[index].integerValue == MenuCellStateKeep) { - [keepMenuCells addObject:statusList[index]]; + for (NSUInteger index = 0; index < keepStatusList.count; index++) { + if (keepStatusList[index].integerValue == MenuCellStateKeep) { + [keepMenuCells addObject:oldMenuCells[index]]; } } return [keepMenuCells copy]; } -- (NSArray *)sdl_filterKeepMenuItemsWithNewMenuItems:(NSArray *)newMenuItems basedOnStatusList:(NSArray *)statusList { +- (NSArray *)sdl_filterKeepMenuItemsWithNewMenuItems:(NSArray *)newMenuCells basedOnStatusList:(NSArray *)keepStatusList { NSMutableArray *keepMenuCells = [[NSMutableArray alloc] init]; - for (NSUInteger index = 0; index < newMenuItems.count; index++) { - if (newMenuItems[index].integerValue == MenuCellStateKeep) { - [keepMenuCells addObject:statusList[index]]; + for (NSUInteger index = 0; index < keepStatusList.count; index++) { + if (keepStatusList[index].integerValue == MenuCellStateKeep) { + [keepMenuCells addObject:newMenuCells[index]]; } } return [keepMenuCells copy]; @@ -243,16 +242,16 @@ - (void)transferCellIDFromOldCells:(NSArray *)oldCells toKeptCell #pragma mark - Updating System - (void)sdl_startDynamicMenuUpdate { - _runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; + SDLDynamicMenuUpdateRunScore *runScore = [SDLDynamicMenuUpdateAlgorithm compareOldMenuCells:self.oldMenuCells updatedMenuCells:self.menuCells]; - NSArray *deleteMenuStatus = self.runScore.oldStatus; - NSArray *addMenuStatus = self.runScore.updatedStatus; + NSArray *deleteMenuStatus = runScore.oldStatus; + NSArray *addMenuStatus = runScore.updatedStatus; - NSArray *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:deleteMenuStatus basedOnStatusList:self.oldMenuCells]; - NSArray *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:addMenuStatus basedOnStatusList:self.menuCells]; + NSArray *cellsToDelete = [self sdl_filterDeleteMenuItemsWithOldMenuItems:self.oldMenuCells basedOnStatusList:deleteMenuStatus]; + NSArray *cellsToAdd = [self sdl_filterAddMenuItemsWithNewMenuItems:self.menuCells basedOnStatusList:addMenuStatus]; // These arrays should ONLY contain KEEPS. These will be used for SubMenu compares - NSArray *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems:deleteMenuStatus basedOnStatusList:self.oldMenuCells]; - NSArray *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems:addMenuStatus basedOnStatusList:self.menuCells]; + NSArray *oldKeeps = [self sdl_filterKeepMenuItemsWithOldMenuItems:self.oldMenuCells basedOnStatusList:deleteMenuStatus]; + NSArray *newKeeps = [self sdl_filterKeepMenuItemsWithNewMenuItems:self.menuCells basedOnStatusList:addMenuStatus]; // Cells that will be added need new ids [self sdl_updateIdsOnMenuCells:cellsToAdd parentId:ParentIdNotFound]; From 5608ac034488e60f48aa4fe56a09301609f245ba Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 18 Jun 2019 09:11:30 -0400 Subject: [PATCH 154/179] Fix test --- SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m index 4fc9a6547..2354e8f29 100644 --- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m +++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m @@ -398,7 +398,7 @@ @interface SDLSystemCapabilityManager () __block id blockObserver = nil; beforeEach(^{ - blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapability * _Nonnull systemCapability) { + blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall withBlock:^(SDLSystemCapability * _Nonnull systemCapability) { blockObserverTriggeredCount++; }]; @@ -439,7 +439,7 @@ @interface SDLSystemCapabilityManager () __block id blockObserver = nil; beforeEach(^{ - blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall usingBlock:^(SDLSystemCapability * _Nonnull systemCapability) { + blockObserver = [testSystemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypePhoneCall withBlock:^(SDLSystemCapability * _Nonnull systemCapability) { blockObserverTriggeredCount++; }]; From 6f91e9d2bfaf6bd7f966c4a036d1a439d37c7857 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 18 Jun 2019 11:34:41 -0400 Subject: [PATCH 155/179] Fixes #1308 * Only fail to queue a choice preload in the shutdown state * If the handler doesn't exist, don't crash --- SmartDeviceLink/SDLChoiceSetManager.m | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLChoiceSetManager.m b/SmartDeviceLink/SDLChoiceSetManager.m index 5562b1515..037878fc5 100644 --- a/SmartDeviceLink/SDLChoiceSetManager.m +++ b/SmartDeviceLink/SDLChoiceSetManager.m @@ -183,9 +183,11 @@ - (void)didEnterStateStartupError { #pragma mark Upload / Delete - (void)preloadChoices:(NSArray *)choices withCompletionHandler:(nullable SDLPreloadChoiceCompletionHandler)handler { - if (![self.currentState isEqualToString:SDLChoiceManagerStateReady]) { - NSError *error = [NSError sdl_choiceSetManager_incorrectState:self.currentState]; - handler(error); + if ([self.currentState isEqualToString:SDLChoiceManagerStateShutdown]) { + if (handler != nil) { + NSError *error = [NSError sdl_choiceSetManager_incorrectState:self.currentState]; + handler(error); + } return; } From e4bd95949c86ad163f939b77cf535a7c8fec3c28 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 19 Jun 2019 16:14:18 -0400 Subject: [PATCH 156/179] quick fix so setting the menu for the first time adds the cells with artwork, updates unit tests --- SmartDeviceLink/SDLMenuManager.m | 19 ++++++++-- .../DevAPISpecs/SDLMenuManagerSpec.m | 36 ++++++++++++------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 4698c093b..de980b377 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -261,6 +261,7 @@ - (void)sdl_startDynamicMenuUpdate { // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:cellsToAdd]; + NSArray *cellWithArtWork = [self sdl_findAllCellsWithArtwork:cellsToAdd]; if (artworksToBeUploaded.count > 0) { [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { if (error != nil) { @@ -269,7 +270,8 @@ - (void)sdl_startDynamicMenuUpdate { SDLLogD(@"Menu artworks uploaded"); // Update cells with artworks once they're uploaded __weak typeof(self) weakself = self; - [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) { + weakself.inProgressUpdate = nil; + [self sdl_updateMenuWithCellsToDelete:cellWithArtWork cellsToAdd:cellWithArtWork completionHandler:^(NSError * _Nullable error) { [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0]; }]; }]; @@ -294,13 +296,24 @@ - (void)sdl_startNonDynamicMenuUpdate { SDLLogD(@"Menu artworks uploaded"); // Update cells with artworks once they're uploaded - [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; + [self sdl_updateMenuWithCellsToDelete:self.menuCells cellsToAdd:self.menuCells completionHandler:nil]; }]; } // Update cells without artworks [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; } +- (NSArray *)sdl_findAllCellsWithArtwork:(NSArray *)cells { + NSMutableArray *cellWithArtWork = [[NSMutableArray alloc] init]; + + for (SDLMenuCell *cell in cells) { + if(cell.icon != nil) { + [cellWithArtWork addObject:cell]; + } + } + return [cellWithArtWork copy]; +} + - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells completionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { if (self.currentHMILevel == nil || [self.currentHMILevel isEqualToEnum:SDLHMILevelNone] @@ -310,13 +323,13 @@ - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells ce return; } + __weak typeof(self) weakself = self; if (self.inProgressUpdate != nil) { // There's an in progress update, we need to put this on hold self.hasQueuedUpdate = YES; return; } - __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { [weakself sdl_sendUpdatedMenu:addCells usingMenu:weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { weakself.inProgressUpdate = nil; diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index 998952bcb..8d7bee191 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -319,7 +319,6 @@ @interface SDLMenuManager() [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork - NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -336,6 +335,7 @@ @interface SDLMenuManager() [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[submenuCell, submenuImageCell, textOnlyCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -350,9 +350,13 @@ @interface SDLMenuManager() NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + NSPredicate *deletesubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLDeleteSubMenu class]]; + NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deletesubmenuPredicate]; + expect(deletes).to(haveCount(1)); - expect(adds).to(haveCount(9)); - expect(submenu).to(haveCount(4)); + expect(adds).to(haveCount(6)); + expect(submenu).to(haveCount(3)); + expect(subDeletes).to(haveCount(1)); }); it(@"should send dynamic deletes first then dynamic adds when removing one submenu cell", ^{ @@ -361,6 +365,7 @@ @interface SDLMenuManager() [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -378,10 +383,10 @@ @interface SDLMenuManager() NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; - expect(deletes).to(haveCount(0)); - expect(subDeletes).to(haveCount(1)); - expect(adds).to(haveCount(10)); - expect(submenu).to(haveCount(4)); + expect(deletes).to(haveCount(1)); + expect(subDeletes).to(haveCount(2)); + expect(adds).to(haveCount(7)); + expect(submenu).to(haveCount(3)); }); it(@"should send dynamic deletes first then dynamic adds when adding one new cell", ^{ @@ -390,6 +395,7 @@ @interface SDLMenuManager() [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell, textOnlyCell2]; @@ -405,9 +411,14 @@ @interface SDLMenuManager() NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; - expect(deletes).to(haveCount(0)); - expect(adds).to(haveCount(11)); - expect(submenu).to(haveCount(4)); + NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]]; + NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate]; + + + expect(deletes).to(haveCount(1)); + expect(adds).to(haveCount(8)); + expect(submenu).to(haveCount(3)); + expect(subDeletes).to(haveCount(1)); }); it(@"should send dynamic deletes first then dynamic adds when cells stay the same", ^{ @@ -416,6 +427,7 @@ @interface SDLMenuManager() [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; @@ -425,8 +437,8 @@ @interface SDLMenuManager() NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; - expect(deletes).to(haveCount(0)); - expect(adds).to(haveCount(6)); + expect(deletes).to(haveCount(1)); + expect(adds).to(haveCount(4)); }); }); From 37a3d668cde2dc5f1bd24d0c6ce47dc5492f1dac Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 19 Jun 2019 16:19:00 -0400 Subject: [PATCH 157/179] fixing unneeded change --- SmartDeviceLink/SDLMenuManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index de980b377..a1a5b17bc 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -296,7 +296,7 @@ - (void)sdl_startNonDynamicMenuUpdate { SDLLogD(@"Menu artworks uploaded"); // Update cells with artworks once they're uploaded - [self sdl_updateMenuWithCellsToDelete:self.menuCells cellsToAdd:self.menuCells completionHandler:nil]; + [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; }]; } // Update cells without artworks From 0329267a5f00032124a83e4a98b67128ff8b15f0 Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Wed, 19 Jun 2019 16:20:17 -0400 Subject: [PATCH 158/179] undoing a line move --- SmartDeviceLink/SDLMenuManager.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index a1a5b17bc..cb5ae8737 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -323,13 +323,12 @@ - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells ce return; } - __weak typeof(self) weakself = self; if (self.inProgressUpdate != nil) { // There's an in progress update, we need to put this on hold self.hasQueuedUpdate = YES; return; } - + __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { [weakself sdl_sendUpdatedMenu:addCells usingMenu:weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { weakself.inProgressUpdate = nil; From 06dc401800e088a37d1e5b81e2cc53f2e00158ab Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Thu, 20 Jun 2019 08:56:14 -0400 Subject: [PATCH 159/179] since old cells is empty at this point and this is using the old method to add and remove cells , we must remove all cells and re add all cells after artwork uploads --- SmartDeviceLink/SDLMenuManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index cb5ae8737..205cde182 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -296,7 +296,7 @@ - (void)sdl_startNonDynamicMenuUpdate { SDLLogD(@"Menu artworks uploaded"); // Update cells with artworks once they're uploaded - [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; + [self sdl_updateMenuWithCellsToDelete:self.menuCells cellsToAdd:self.menuCells completionHandler:nil]; }]; } // Update cells without artworks From 3c4b6dd24e12e4153f8dd6e4674ae62fcb10f3db Mon Sep 17 00:00:00 2001 From: Takamitsu Yoshii Date: Fri, 21 Jun 2019 12:45:25 +0900 Subject: [PATCH 160/179] make SDLSecondaryTransportManager have strong reference to primaryProtocol to ensure to cleanup correctly --- SmartDeviceLink/SDLSecondaryTransportManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLSecondaryTransportManager.m b/SmartDeviceLink/SDLSecondaryTransportManager.m index 6f3b95273..a8c6d6a11 100644 --- a/SmartDeviceLink/SDLSecondaryTransportManager.m +++ b/SmartDeviceLink/SDLSecondaryTransportManager.m @@ -67,7 +67,7 @@ @interface SDLSecondaryTransportManager () @property (copy, nonatomic) dispatch_queue_t stateMachineQueue; // Instance of the protocol that runs on primary transport. -@property (weak, nonatomic) SDLProtocol *primaryProtocol; +@property (strong, nonatomic) SDLProtocol *primaryProtocol; // A class to catch Start Service ACK and Transport Config Update frames. @property (strong, nonatomic) SDLSecondaryTransportPrimaryProtocolHandler *primaryProtocolHandler; From d9dee5de63bceb7a4cf769757cb16be62274c70b Mon Sep 17 00:00:00 2001 From: Justin Gluck Date: Mon, 24 Jun 2019 09:35:10 -0400 Subject: [PATCH 161/179] Send cells after image have been uploaded if no images just send cells. modified some tests to match code changes --- SmartDeviceLink/SDLMenuManager.m | 35 +++----- .../DevAPISpecs/SDLMenuManagerSpec.m | 80 ++++++++----------- 2 files changed, 45 insertions(+), 70 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 205cde182..11b7db2bf 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -261,7 +261,6 @@ - (void)sdl_startDynamicMenuUpdate { // Upload the artworks NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:cellsToAdd]; - NSArray *cellWithArtWork = [self sdl_findAllCellsWithArtwork:cellsToAdd]; if (artworksToBeUploaded.count > 0) { [self.fileManager uploadArtworks:artworksToBeUploaded completionHandler:^(NSArray * _Nonnull artworkNames, NSError * _Nullable error) { if (error != nil) { @@ -270,17 +269,17 @@ - (void)sdl_startDynamicMenuUpdate { SDLLogD(@"Menu artworks uploaded"); // Update cells with artworks once they're uploaded __weak typeof(self) weakself = self; - weakself.inProgressUpdate = nil; - [self sdl_updateMenuWithCellsToDelete:cellWithArtWork cellsToAdd:cellWithArtWork completionHandler:^(NSError * _Nullable error) { + [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) { [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0]; }]; }]; + } else { + // Cells have no artwork to load + __weak typeof(self) weakself = self; + [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) { + [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0]; + }]; } - // Update cells without artworks - __weak typeof(self) weakself = self; - [self sdl_updateMenuWithCellsToDelete:cellsToDelete cellsToAdd:cellsToAdd completionHandler:^(NSError * _Nullable error) { - [weakself sdl_startSubMenuUpdatesWithOldKeptCells:oldKeeps newKeptCells:newKeeps atIndex:0]; - }]; } - (void)sdl_startNonDynamicMenuUpdate { @@ -295,23 +294,12 @@ - (void)sdl_startNonDynamicMenuUpdate { } SDLLogD(@"Menu artworks uploaded"); - // Update cells with artworks once they're uploaded - [self sdl_updateMenuWithCellsToDelete:self.menuCells cellsToAdd:self.menuCells completionHandler:nil]; + [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; }]; + } else { + // Cells have no artwork to load + [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; } - // Update cells without artworks - [self sdl_updateMenuWithCellsToDelete:self.oldMenuCells cellsToAdd:self.menuCells completionHandler:nil]; -} - -- (NSArray *)sdl_findAllCellsWithArtwork:(NSArray *)cells { - NSMutableArray *cellWithArtWork = [[NSMutableArray alloc] init]; - - for (SDLMenuCell *cell in cells) { - if(cell.icon != nil) { - [cellWithArtWork addObject:cell]; - } - } - return [cellWithArtWork copy]; } - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells cellsToAdd:(NSArray *)addCells completionHandler:(nullable SDLMenuUpdateCompletionHandler)completionHandler { @@ -331,6 +319,7 @@ - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells ce __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { [weakself sdl_sendUpdatedMenu:addCells usingMenu:weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { + weakself.inProgressUpdate = nil; if (completionHandler != nil) { diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index 8d7bee191..2b96e74b0 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -241,6 +241,7 @@ @interface SDLMenuManager() }); it(@"should properly update with subcells", ^{ + OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]); testManager.menuCells = @[submenuCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -278,12 +279,14 @@ @interface SDLMenuManager() }); }); + // No longer a valid unit test context(@"when the image is not on the head unit", ^{ beforeEach(^{ - OCMStub([mockFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO); + testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOff; + OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]); }); - it(@"should immediately attempt to update without the image", ^{ + it(@"should wait till image is on head unit and attempt to update without the image", ^{ testManager.menuCells = @[textAndImageCell, submenuImageCell]; NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddCommand class]]; @@ -314,10 +317,8 @@ @interface SDLMenuManager() [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textAndImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -325,16 +326,14 @@ @interface SDLMenuManager() NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; - expect(deletes).to(haveCount(2)); - expect(adds).to(haveCount(3)); + expect(deletes).to(haveCount(1)); + expect(adds).to(haveCount(2)); }); it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ testManager.menuCells = @[textOnlyCell, submenuCell, submenuImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[submenuCell, submenuImageCell, textOnlyCell]; @@ -350,21 +349,14 @@ @interface SDLMenuManager() NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; - NSPredicate *deletesubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLDeleteSubMenu class]]; - NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deletesubmenuPredicate]; - expect(deletes).to(haveCount(1)); - expect(adds).to(haveCount(6)); - expect(submenu).to(haveCount(3)); - expect(subDeletes).to(haveCount(1)); + expect(adds).to(haveCount(5)); + expect(submenu).to(haveCount(2)); }); it(@"should send dynamic deletes first then dynamic adds when removing one submenu cell", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell]; @@ -383,20 +375,16 @@ @interface SDLMenuManager() NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; - expect(deletes).to(haveCount(1)); - expect(subDeletes).to(haveCount(2)); - expect(adds).to(haveCount(7)); - expect(submenu).to(haveCount(3)); + expect(deletes).to(haveCount(0)); + expect(subDeletes).to(haveCount(1)); + expect(adds).to(haveCount(5)); + expect(submenu).to(haveCount(2)); }); it(@"should send dynamic deletes first then dynamic adds when adding one new cell", ^{ testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Without Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // With Artwork [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell, textOnlyCell2]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; @@ -411,25 +399,19 @@ @interface SDLMenuManager() NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; - NSPredicate *deleteSubCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteSubMenu class]]; - NSArray *subDeletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteSubCommandPredicate]; - - - expect(deletes).to(haveCount(1)); - expect(adds).to(haveCount(8)); - expect(submenu).to(haveCount(3)); - expect(subDeletes).to(haveCount(1)); + expect(deletes).to(haveCount(0)); + expect(adds).to(haveCount(6)); + expect(submenu).to(haveCount(2)); }); it(@"should send dynamic deletes first then dynamic adds when cells stay the same", ^{ testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -437,23 +419,25 @@ @interface SDLMenuManager() NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; - expect(deletes).to(haveCount(1)); - expect(adds).to(haveCount(4)); + expect(deletes).to(haveCount(0)); + expect(adds).to(haveCount(3)); }); }); describe(@"updating when a menu already exists with dynamic updates off", ^{ beforeEach(^{ - testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOff; + testManager.dynamicMenuUpdatesMode = SDLDynamicMenuUpdatesModeForceOff; + OCMStub([mockFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]); }); it(@"should send deletes first", ^{ testManager.menuCells = @[textOnlyCell]; - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Adds - [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; // Submenu + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; testManager.menuCells = @[textAndImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -472,6 +456,7 @@ @interface SDLMenuManager() testManager.menuCells = @[textAndImageCell, textOnlyCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; @@ -545,6 +530,7 @@ @interface SDLMenuManager() testManager.menuCells = @[textOnlyCell, textOnlyCell2, textAndImageCell]; [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; From 960105d89fbbeea275c188506550295d003ef478 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 24 Jun 2019 10:11:00 -0400 Subject: [PATCH 162/179] Removed registration for EAAcessory notifications Removed unecessary registration for EAAcessory notifications --- SmartDeviceLink/SDLProxy.m | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index 3dae01670..2829eb35f 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -97,7 +97,6 @@ - (instancetype)initWithTransport:(id)transport delegate:(id Date: Mon, 24 Jun 2019 10:11:40 -0400 Subject: [PATCH 163/179] background tasks now use weakself --- SmartDeviceLink/SDLIAPTransport.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 3422ff39f..de83631c9 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -71,9 +71,10 @@ - (void)sdl_backgroundTaskStart { return; } + __weak typeof(self) weakself = self; self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithName:BackgroundTaskName expirationHandler:^{ SDLLogD(@"Background task expired"); - [self sdl_backgroundTaskEnd]; + [weakself sdl_backgroundTaskEnd]; }]; SDLLogD(@"Started a background task with id: %lu", (unsigned long)self.backgroundTaskId); @@ -124,7 +125,6 @@ - (void)sdl_startEventListening { */ - (void)sdl_stopEventListening { SDLLogV(@"SDLIAPTransport stopped listening for events"); - [[EAAccessoryManager sharedAccessoryManager] unregisterForLocalNotifications]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } From 0e14619d13828154efc3c72bce18cfb2b4a9e227 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 24 Jun 2019 10:20:11 -0400 Subject: [PATCH 164/179] Removed unnecessary import --- SmartDeviceLink/SDLProxy.m | 1 - 1 file changed, 1 deletion(-) diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index 2829eb35f..803cdc072 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -2,7 +2,6 @@ #import "SDLProxy.h" -#import #import #import From 31bf850843cfa19f8ea40d32605dd44d1d34edc9 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 24 Jun 2019 11:44:18 -0400 Subject: [PATCH 165/179] Transport dealloc does not end the background task Background task should not be destroyed when transport is destroyed --- SmartDeviceLink/SDLIAPTransport.m | 1 - 1 file changed, 1 deletion(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index de83631c9..4cee4ccdb 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -598,7 +598,6 @@ - (BOOL)createSessionWithAccessory:(EAAccessory *)accessory protocolString:(NSSt - (void)dealloc { SDLLogV(@"SDLIAPTransport dealloc"); [self disconnect]; - [self sdl_backgroundTaskEnd]; self.controlSession = nil; self.dataSession = nil; self.delegate = nil; From 55d91808e25cde8f44a313da6e7a3f14674563e6 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Mon, 24 Jun 2019 13:32:45 -0400 Subject: [PATCH 166/179] Background task now started in init of IAPTransport Background task now started in init of SDLIAPTransport --- SmartDeviceLink/SDLIAPTransport.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index 4cee4ccdb..d31541277 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -55,6 +55,11 @@ - (instancetype)init { // Get notifications if an accessory connects in future [self sdl_startEventListening]; + if (UIApplication.sharedApplication.applicationState != UIApplicationStateActive) { + SDLLogV(@"Application not in foreground on transport init. Starting a background task"); + [self sdl_backgroundTaskStart]; + } + // Wait for setup to complete before scanning for accessories return self; @@ -63,7 +68,7 @@ - (instancetype)init { #pragma mark - Background Task /** - * Starts a background task that allows the app to search for accessories and while the app is in the background. + * Starts a background task that allows the app to search for accessories while the app is in the background. */ - (void)sdl_backgroundTaskStart { if (self.backgroundTaskId != UIBackgroundTaskInvalid) { @@ -77,7 +82,7 @@ - (void)sdl_backgroundTaskStart { [weakself sdl_backgroundTaskEnd]; }]; - SDLLogD(@"Started a background task with id: %lu", (unsigned long)self.backgroundTaskId); + SDLLogD(@"Background task started with id: %lu", (unsigned long)self.backgroundTaskId); } /** From 2d1a81293030747f9f1cea12f499b6cde25d7f67 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 25 Jun 2019 09:40:32 -0400 Subject: [PATCH 167/179] Moved the background task to the LifecycleManager Moved the background task from the iAPTransport class to the LifecycleManager class --- SmartDeviceLink/SDLIAPTransport.m | 86 --------------------------- SmartDeviceLink/SDLLifecycleManager.m | 50 ++++++++++++++++ 2 files changed, 50 insertions(+), 86 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index d31541277..f8fd8e112 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -20,7 +20,6 @@ NS_ASSUME_NONNULL_BEGIN -NSString *const BackgroundTaskName = @"com.sdl.transport.iap.backgroundTask"; int const CreateSessionRetries = 3; @interface SDLIAPTransport () @@ -30,7 +29,6 @@ @interface SDLIAPTransport () @@ -88,6 +90,7 @@ @interface SDLLifecycleManager () Date: Tue, 25 Jun 2019 10:00:16 -0400 Subject: [PATCH 168/179] Background task killed on dealloc Background task destroyed when the lifecycle manager is dealloced --- SmartDeviceLink/SDLLifecycleManager.m | 6 ++++++ SmartDeviceLink/SDLManager.m | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index 3fd70e4da..f59cc621a 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -879,6 +879,12 @@ - (void)sdl_backgroundTaskEnd { self.backgroundTaskId = UIBackgroundTaskInvalid; } +#pragma mark - Lifecycle Destruction + +- (void)dealloc { + [self sdl_backgroundTaskEnd]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m index b198f7e52..8da294868 100644 --- a/SmartDeviceLink/SDLManager.m +++ b/SmartDeviceLink/SDLManager.m @@ -164,6 +164,12 @@ - (void)unsubscribeFromRPC:(SDLNotificationName)rpcName withObserver:(id)observe [[NSNotificationCenter defaultCenter] removeObserver:observer name:rpcName object:nil]; } +#pragma mark - Lifecycle Destruction + +- (void)dealloc { + _lifecycleManager = nil; +} + @end NS_ASSUME_NONNULL_END From 0b507d3b40436e0efdf4dd1dd287d554c3321479 Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Tue, 25 Jun 2019 15:04:09 -0400 Subject: [PATCH 169/179] Fix setting a second menu --- SmartDeviceLink/SDLMenuManager.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m index 11b7db2bf..734e1fc00 100644 --- a/SmartDeviceLink/SDLMenuManager.m +++ b/SmartDeviceLink/SDLMenuManager.m @@ -283,7 +283,6 @@ - (void)sdl_startDynamicMenuUpdate { } - (void)sdl_startNonDynamicMenuUpdate { - self.lastMenuId = MenuCellIdMin; [self sdl_updateIdsOnMenuCells:self.menuCells parentId:ParentIdNotFound]; NSArray *artworksToBeUploaded = [self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells]; @@ -319,7 +318,6 @@ - (void)sdl_updateMenuWithCellsToDelete:(NSArray *)deleteCells ce __weak typeof(self) weakself = self; [self sdl_sendDeleteCurrentMenu:deleteCells withCompletionHandler:^(NSError * _Nullable error) { [weakself sdl_sendUpdatedMenu:addCells usingMenu:weakself.menuCells withCompletionHandler:^(NSError * _Nullable error) { - weakself.inProgressUpdate = nil; if (completionHandler != nil) { From bbe955b15fc41add012dc12c88646c00207c1516 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 25 Jun 2019 15:18:43 -0400 Subject: [PATCH 170/179] Added more detail to SDL logs --- SmartDeviceLink/SDLIAPTransport.m | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/SmartDeviceLink/SDLIAPTransport.m b/SmartDeviceLink/SDLIAPTransport.m index f8fd8e112..d67b2f11e 100644 --- a/SmartDeviceLink/SDLIAPTransport.m +++ b/SmartDeviceLink/SDLIAPTransport.m @@ -15,7 +15,6 @@ #import "SDLIAPDataSession.h" #import "SDLIAPDataSessionDelegate.h" #import "SDLLogMacros.h" -#import "SDLTimer.h" #import NS_ASSUME_NONNULL_BEGIN @@ -81,7 +80,7 @@ - (void)sdl_startEventListening { */ - (void)sdl_stopEventListening { SDLLogV(@"SDLIAPTransport stopped listening for events"); - [[NSNotificationCenter defaultCenter] removeObserver:self]; + [[EAAccessoryManager sharedAccessoryManager] unregisterForLocalNotifications]; } #pragma mark EAAccessory Notifications @@ -133,7 +132,7 @@ - (BOOL)sdl_isDataSessionActive:(nullable SDLIAPDataSession *)dataSession newAcc */ - (void)sdl_accessoryDisconnected:(NSNotification *)notification { EAAccessory *accessory = [notification.userInfo objectForKey:EAAccessoryKey]; - SDLLogD(@"Accessory with serial number %@ and connectionID %lu disconnecting.", accessory.serialNumber, (unsigned long)accessory.connectionID); + SDLLogD(@"Accessory with serial number: %@, and connectionID: %lu disconnecting.", accessory.serialNumber, (unsigned long)accessory.connectionID); if (self.accessoryConnectDuringActiveSession == YES) { SDLLogD(@"Switching transports from Bluetooth to USB. Will reconnect over Bluetooth after disconnecting the USB session."); @@ -249,7 +248,7 @@ - (void)sdl_connect:(nullable EAAccessory *)accessory { * @param accessory The accessory to try to establish a session with, or nil to scan all connected accessories. */ - (void)sdl_establishSessionWithAccessory:(nullable EAAccessory *)accessory { - SDLLogD(@"Attempting to connect accessory: %@", accessory.name); + SDLLogD(@"Attempting to connect accessory named: %@, with connectionID: %lu", accessory.name, (unsigned long)accessory.connectionID); if (self.retryCounter < CreateSessionRetries) { self.retryCounter++; From 0c1f81706dccab0be6dffc5edc94293c68f6e175 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 25 Jun 2019 16:11:05 -0400 Subject: [PATCH 171/179] Update SmartDeviceLink/SDLLifecycleManager.m Co-Authored-By: Joel Fischer --- SmartDeviceLink/SDLLifecycleManager.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index f59cc621a..dbe9d36d4 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -90,7 +90,7 @@ @interface SDLLifecycleManager () Date: Tue, 25 Jun 2019 16:50:27 -0400 Subject: [PATCH 172/179] Moved background task logic to own class --- SmartDeviceLink/SDLBackgroundTaskManager.h | 22 +++++++ SmartDeviceLink/SDLBackgroundTaskManager.m | 73 ++++++++++++++++++++++ SmartDeviceLink/SDLLifecycleManager.m | 66 +++++-------------- 3 files changed, 110 insertions(+), 51 deletions(-) create mode 100644 SmartDeviceLink/SDLBackgroundTaskManager.h create mode 100644 SmartDeviceLink/SDLBackgroundTaskManager.m diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.h b/SmartDeviceLink/SDLBackgroundTaskManager.h new file mode 100644 index 000000000..2dc5ee9f6 --- /dev/null +++ b/SmartDeviceLink/SDLBackgroundTaskManager.h @@ -0,0 +1,22 @@ +// +// SDLBackgroundTaskManager.h +// SmartDeviceLink +// +// Created by Nicole on 6/25/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLBackgroundTaskManager : NSObject + +- (instancetype)initWithBackgroundTaskName:(NSString *)backgroundTaskName; +- (void)startBackgroundTask; +- (void)endBackgroundTask; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.m b/SmartDeviceLink/SDLBackgroundTaskManager.m new file mode 100644 index 000000000..63917fd66 --- /dev/null +++ b/SmartDeviceLink/SDLBackgroundTaskManager.m @@ -0,0 +1,73 @@ +// +// SDLBackgroundTaskManager.m +// SmartDeviceLink +// +// Created by Nicole on 6/25/19. +// Copyright © 2019 smartdevicelink. All rights reserved. +// + +#import "SDLBackgroundTaskManager.h" + +#import "SDLLogMacros.h" + + +NS_ASSUME_NONNULL_BEGIN + +@interface SDLBackgroundTaskManager () +@property (nonatomic, assign) NSString *backgroundTaskName; +@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; +@end + +@implementation SDLBackgroundTaskManager + +- (instancetype)initWithBackgroundTaskName:(NSString *)backgroundTaskName { + SDLLogV(@"SDLBackgroundTaskManager init with name %@", backgroundTaskName); + self = [super init]; + if (!self) { + return nil; + } + + _backgroundTaskName = backgroundTaskName; + + return self; +} + +/** + * Starts a background task that allows the app to establish a session while app is backgrounded. If the app is not currently backgrounded, the background task will remain dormant until the app moves to the background. + */ +- (void)startBackgroundTask { + if (self.backgroundTaskId != UIBackgroundTaskInvalid) { + SDLLogV(@"The %@ background task is already running.", self.backgroundTaskName); + return; + } + + __weak typeof(self) weakself = self; + self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithName:self.backgroundTaskName expirationHandler:^{ + SDLLogD(@"The %@ background task expired", self.backgroundTaskName); + [weakself endBackgroundTask]; + }]; + + SDLLogD(@"The %@ background task started with id: %lu", self.backgroundTaskName, (unsigned long)self.backgroundTaskId); +} + +/** + * Cleans up a background task when it is stopped. This should be called when: + * + * 1. The app has established a session + * 2. The system has called the `expirationHandler` for the background task. The system may kill the app if the background task is not ended. + * + */ +- (void)endBackgroundTask { + if (self.backgroundTaskId == UIBackgroundTaskInvalid) { + SDLLogV(@"Background task already ended. Returning..."); + return; + } + + SDLLogD(@"Ending background task with id: %lu", (unsigned long)self.backgroundTaskId); + [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskId]; + self.backgroundTaskId = UIBackgroundTaskInvalid; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index f59cc621a..26c8be540 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -12,6 +12,7 @@ #import "NSMapTable+Subscripting.h" #import "SDLAsynchronousRPCRequestOperation.h" +#import "SDLBackgroundTaskManager.h" #import "SDLChangeRegistration.h" #import "SDLChoiceSetManager.h" #import "SDLConfiguration.h" @@ -57,7 +58,6 @@ #import "SDLUnregisterAppInterface.h" #import "SDLVersion.h" - NS_ASSUME_NONNULL_BEGIN SDLLifecycleState *const SDLLifecycleStateStopped = @"Stopped"; @@ -72,7 +72,7 @@ SDLLifecycleState *const SDLLifecycleStateUnregistering = @"Unregistering"; SDLLifecycleState *const SDLLifecycleStateReady = @"Ready"; -NSString *const BackgroundTaskIAPTransportName = @"com.sdl.transport.iap.backgroundTask"; +NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask"; #pragma mark - SDLManager Private Interface @@ -90,7 +90,7 @@ @interface SDLLifecycleManager () Date: Tue, 25 Jun 2019 16:50:39 -0400 Subject: [PATCH 173/179] Removed dealloc from SDLManager --- SmartDeviceLink/SDLManager.m | 6 ------ 1 file changed, 6 deletions(-) diff --git a/SmartDeviceLink/SDLManager.m b/SmartDeviceLink/SDLManager.m index 8da294868..b198f7e52 100644 --- a/SmartDeviceLink/SDLManager.m +++ b/SmartDeviceLink/SDLManager.m @@ -164,12 +164,6 @@ - (void)unsubscribeFromRPC:(SDLNotificationName)rpcName withObserver:(id)observe [[NSNotificationCenter defaultCenter] removeObserver:observer name:rpcName object:nil]; } -#pragma mark - Lifecycle Destruction - -- (void)dealloc { - _lifecycleManager = nil; -} - @end NS_ASSUME_NONNULL_END From 75d3b6edc1a5fdd09f3f8afb1b6ee251ff7ee4e0 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 25 Jun 2019 16:50:52 -0400 Subject: [PATCH 174/179] Added class --- SmartDeviceLink-iOS.xcodeproj/project.pbxproj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj index 0760bf2c0..6c7379d26 100644 --- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj +++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj @@ -1238,6 +1238,8 @@ 756C62772289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C62752289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m */; }; 880245A420F79C3400ED195B /* SDLFileManagerConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; 880245A520F79C3400ED195B /* SDLFileManagerConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 880245A320F79C3400ED195B /* SDLFileManagerConfiguration.m */; }; + 8803DCEF22C2B84B00FBB7CE /* SDLBackgroundTaskManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8803DCED22C2B84B00FBB7CE /* SDLBackgroundTaskManager.h */; }; + 8803DCF022C2B84B00FBB7CE /* SDLBackgroundTaskManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 8803DCEE22C2B84B00FBB7CE /* SDLBackgroundTaskManager.m */; }; 880D267A220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */; }; 880D267D220DE5DF00B3F496 /* SDLWeatherServiceManifest.h in Headers */ = {isa = PBXBuildFile; fileRef = 880D267B220DE5DF00B3F496 /* SDLWeatherServiceManifest.h */; settings = {ATTRIBUTES = (Public, ); }; }; 880D267E220DE5DF00B3F496 /* SDLWeatherServiceManifest.m in Sources */ = {isa = PBXBuildFile; fileRef = 880D267C220DE5DF00B3F496 /* SDLWeatherServiceManifest.m */; }; @@ -2892,6 +2894,8 @@ 756C62752289F11F008B57A2 /* SDLDynamicMenuUpdateRunScore.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLDynamicMenuUpdateRunScore.m; sourceTree = ""; }; 880245A220F79C3400ED195B /* SDLFileManagerConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLFileManagerConfiguration.h; sourceTree = ""; }; 880245A320F79C3400ED195B /* SDLFileManagerConfiguration.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLFileManagerConfiguration.m; sourceTree = ""; }; + 8803DCED22C2B84B00FBB7CE /* SDLBackgroundTaskManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLBackgroundTaskManager.h; sourceTree = ""; }; + 8803DCEE22C2B84B00FBB7CE /* SDLBackgroundTaskManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLBackgroundTaskManager.m; sourceTree = ""; }; 880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherServiceDataSpec.m; sourceTree = ""; }; 880D267B220DE5DF00B3F496 /* SDLWeatherServiceManifest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLWeatherServiceManifest.h; sourceTree = ""; }; 880D267C220DE5DF00B3F496 /* SDLWeatherServiceManifest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLWeatherServiceManifest.m; sourceTree = ""; }; @@ -4791,6 +4795,8 @@ 5D5934F61A85189500687FB9 /* Utilities */ = { isa = PBXGroup; children = ( + 8803DCED22C2B84B00FBB7CE /* SDLBackgroundTaskManager.h */, + 8803DCEE22C2B84B00FBB7CE /* SDLBackgroundTaskManager.m */, 97E26DEA1E807AD70074A3C7 /* SDLMutableDataQueue.h */, 97E26DEB1E807AD70074A3C7 /* SDLMutableDataQueue.m */, E9C32B831AB20B2900F283AF /* @categories */, @@ -6426,6 +6432,7 @@ 5D61FC511A84238C00846EE7 /* SDLButtonCapabilities.h in Headers */, 5D61FDE91A84238C00846EE7 /* SDLUnsubscribeButtonResponse.h in Headers */, 5D61FCD51A84238C00846EE7 /* SDLImageType.h in Headers */, + 8803DCEF22C2B84B00FBB7CE /* SDLBackgroundTaskManager.h in Headers */, 5D61FC2F1A84238C00846EE7 /* SDLAddCommandResponse.h in Headers */, 5D0C2A0020D9479B008B56CD /* SDLStreamingVideoLifecycleManager.h in Headers */, 5D61FD631A84238C00846EE7 /* SDLResetGlobalProperties.h in Headers */, @@ -7204,6 +7211,7 @@ 5D61FC5E1A84238C00846EE7 /* SDLChangeRegistrationResponse.m in Sources */, 5D8204231BCEA89A00D0A41B /* SDLFileManager.m in Sources */, 1EB59CC0202DA26000343A61 /* SDLSeatControlData.m in Sources */, + 8803DCF022C2B84B00FBB7CE /* SDLBackgroundTaskManager.m in Sources */, 5D61FC7D1A84238C00846EE7 /* SDLDeleteInteractionChoiceSetResponse.m in Sources */, DAC572661D10C5640004288B /* CGPoint_Util.m in Sources */, 5D00AC681F140F0A004000D9 /* SDLSystemCapabilityType.m in Sources */, From c0b04575cf6d5fb669459dfea975ce24ed102f99 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Tue, 25 Jun 2019 17:17:58 -0400 Subject: [PATCH 175/179] renamed var --- SmartDeviceLink/SDLBackgroundTaskManager.m | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.m b/SmartDeviceLink/SDLBackgroundTaskManager.m index 63917fd66..df77ade5f 100644 --- a/SmartDeviceLink/SDLBackgroundTaskManager.m +++ b/SmartDeviceLink/SDLBackgroundTaskManager.m @@ -14,8 +14,9 @@ NS_ASSUME_NONNULL_BEGIN @interface SDLBackgroundTaskManager () -@property (nonatomic, assign) NSString *backgroundTaskName; -@property (nonatomic, assign) UIBackgroundTaskIdentifier backgroundTaskId; +@property (copy, nonatomic) NSString *backgroundTaskName; +@property (assign, nonatomic) UIBackgroundTaskIdentifier currentBackgroundTaskId; + @end @implementation SDLBackgroundTaskManager @@ -36,18 +37,18 @@ - (instancetype)initWithBackgroundTaskName:(NSString *)backgroundTaskName { * Starts a background task that allows the app to establish a session while app is backgrounded. If the app is not currently backgrounded, the background task will remain dormant until the app moves to the background. */ - (void)startBackgroundTask { - if (self.backgroundTaskId != UIBackgroundTaskInvalid) { + if (self.currentBackgroundTaskId != UIBackgroundTaskInvalid) { SDLLogV(@"The %@ background task is already running.", self.backgroundTaskName); return; } __weak typeof(self) weakself = self; - self.backgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithName:self.backgroundTaskName expirationHandler:^{ + self.currentBackgroundTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithName:self.backgroundTaskName expirationHandler:^{ SDLLogD(@"The %@ background task expired", self.backgroundTaskName); [weakself endBackgroundTask]; }]; - SDLLogD(@"The %@ background task started with id: %lu", self.backgroundTaskName, (unsigned long)self.backgroundTaskId); + SDLLogD(@"The %@ background task started with id: %lu", self.backgroundTaskName, (unsigned long)self.currentBackgroundTaskId); } /** @@ -58,14 +59,14 @@ - (void)startBackgroundTask { * */ - (void)endBackgroundTask { - if (self.backgroundTaskId == UIBackgroundTaskInvalid) { + if (self.currentBackgroundTaskId == UIBackgroundTaskInvalid) { SDLLogV(@"Background task already ended. Returning..."); return; } - SDLLogD(@"Ending background task with id: %lu", (unsigned long)self.backgroundTaskId); - [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskId]; - self.backgroundTaskId = UIBackgroundTaskInvalid; + SDLLogD(@"Ending background task with id: %lu", (unsigned long)self.currentBackgroundTaskId); + [[UIApplication sharedApplication] endBackgroundTask:self.currentBackgroundTaskId]; + self.currentBackgroundTaskId = UIBackgroundTaskInvalid; } @end From 67fab4fa703382c48fe0d0b66b38383db43f4694 Mon Sep 17 00:00:00 2001 From: Takamitsu Yoshii Date: Wed, 26 Jun 2019 12:07:09 +0900 Subject: [PATCH 176/179] add nil check of eaSession at SDLIAPDataSession#startSession --- SmartDeviceLink/SDLIAPDataSession.m | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/SmartDeviceLink/SDLIAPDataSession.m b/SmartDeviceLink/SDLIAPDataSession.m index b6ec6e9dc..5bf61e304 100644 --- a/SmartDeviceLink/SDLIAPDataSession.m +++ b/SmartDeviceLink/SDLIAPDataSession.m @@ -63,9 +63,11 @@ - (void)startSession { [self.delegate dataSessionShouldRetry]; } - self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil]; - [self.ioStreamThread setName:IOStreamThreadName]; - [self.ioStreamThread start]; + if (self.eaSession != nil) { + self.ioStreamThread = [[NSThread alloc] initWithTarget:self selector:@selector(sdl_accessoryEventLoop) object:nil]; + [self.ioStreamThread setName:IOStreamThreadName]; + [self.ioStreamThread start]; + } } } From 8a3f94e37f59d364d30434f9b9c7760c9b2e8066 Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 26 Jun 2019 09:32:01 -0400 Subject: [PATCH 177/179] Moved documentation to Background Task header file --- SmartDeviceLink/SDLBackgroundTaskManager.h | 19 +++++++++++++++++++ SmartDeviceLink/SDLBackgroundTaskManager.m | 10 ---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.h b/SmartDeviceLink/SDLBackgroundTaskManager.h index 2dc5ee9f6..876f02a09 100644 --- a/SmartDeviceLink/SDLBackgroundTaskManager.h +++ b/SmartDeviceLink/SDLBackgroundTaskManager.h @@ -13,8 +13,27 @@ NS_ASSUME_NONNULL_BEGIN @interface SDLBackgroundTaskManager : NSObject +- (instancetype)init NS_UNAVAILABLE; + +/** + * Convenience init for starting a background task with a specific name + * + * @param backgroundTaskName The name for the background task + * @return A SDLBackgroundTaskManager object + */ - (instancetype)initWithBackgroundTaskName:(NSString *)backgroundTaskName; + +/** + * Starts a background task that allows the app to establish a session while app is backgrounded. If the app is not currently backgrounded, the background task will remain dormant until the app moves to the background. + */ - (void)startBackgroundTask; + +/** + * Cleans up a background task when it is stopped. This should be called when: + * + * 1. The app has established a session + * 2. The system has called the `expirationHandler` for the background task. The system may kill the app if the background task is not ended. + */ - (void)endBackgroundTask; @end diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.m b/SmartDeviceLink/SDLBackgroundTaskManager.m index df77ade5f..688b91101 100644 --- a/SmartDeviceLink/SDLBackgroundTaskManager.m +++ b/SmartDeviceLink/SDLBackgroundTaskManager.m @@ -33,9 +33,6 @@ - (instancetype)initWithBackgroundTaskName:(NSString *)backgroundTaskName { return self; } -/** - * Starts a background task that allows the app to establish a session while app is backgrounded. If the app is not currently backgrounded, the background task will remain dormant until the app moves to the background. - */ - (void)startBackgroundTask { if (self.currentBackgroundTaskId != UIBackgroundTaskInvalid) { SDLLogV(@"The %@ background task is already running.", self.backgroundTaskName); @@ -51,13 +48,6 @@ - (void)startBackgroundTask { SDLLogD(@"The %@ background task started with id: %lu", self.backgroundTaskName, (unsigned long)self.currentBackgroundTaskId); } -/** - * Cleans up a background task when it is stopped. This should be called when: - * - * 1. The app has established a session - * 2. The system has called the `expirationHandler` for the background task. The system may kill the app if the background task is not ended. - * - */ - (void)endBackgroundTask { if (self.currentBackgroundTaskId == UIBackgroundTaskInvalid) { SDLLogV(@"Background task already ended. Returning..."); From b8098be842a631cdab67e45e7112eccc41c9bcba Mon Sep 17 00:00:00 2001 From: NicoleYarroch Date: Wed, 26 Jun 2019 10:24:33 -0400 Subject: [PATCH 178/179] Moved dealloc to BackgroundTaskManager * cleaned up some documentation --- SmartDeviceLink/SDLBackgroundTaskManager.h | 9 ++++++--- SmartDeviceLink/SDLBackgroundTaskManager.m | 4 ++++ SmartDeviceLink/SDLLifecycleManager.m | 10 ++-------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.h b/SmartDeviceLink/SDLBackgroundTaskManager.h index 876f02a09..0732b6fda 100644 --- a/SmartDeviceLink/SDLBackgroundTaskManager.h +++ b/SmartDeviceLink/SDLBackgroundTaskManager.h @@ -11,12 +11,15 @@ NS_ASSUME_NONNULL_BEGIN +/** + * Class for managing a background task. + */ @interface SDLBackgroundTaskManager : NSObject - (instancetype)init NS_UNAVAILABLE; /** - * Convenience init for starting a background task with a specific name + * Convenience init for starting a background task with a specific name. * * @param backgroundTaskName The name for the background task * @return A SDLBackgroundTaskManager object @@ -31,8 +34,8 @@ NS_ASSUME_NONNULL_BEGIN /** * Cleans up a background task when it is stopped. This should be called when: * - * 1. The app has established a session - * 2. The system has called the `expirationHandler` for the background task. The system may kill the app if the background task is not ended. + * 1. The app has established a session. + * 2. The system has called the `expirationHandler` for the background task. The system may kill the app if the background task is not ended when `expirationHandler` is called. */ - (void)endBackgroundTask; diff --git a/SmartDeviceLink/SDLBackgroundTaskManager.m b/SmartDeviceLink/SDLBackgroundTaskManager.m index 688b91101..2109a40cd 100644 --- a/SmartDeviceLink/SDLBackgroundTaskManager.m +++ b/SmartDeviceLink/SDLBackgroundTaskManager.m @@ -59,6 +59,10 @@ - (void)endBackgroundTask { self.currentBackgroundTaskId = UIBackgroundTaskInvalid; } +- (void)dealloc { + [self endBackgroundTask]; +} + @end NS_ASSUME_NONNULL_END diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m index 26c8be540..908f5c43f 100644 --- a/SmartDeviceLink/SDLLifecycleManager.m +++ b/SmartDeviceLink/SDLLifecycleManager.m @@ -213,7 +213,7 @@ - (SDLState *)lifecycleState { } - (void)didEnterStateStarted { - // start a background task so a session can be established even when the app is backgrounded. + // Start a background task so a session can be established even when the app is backgrounded. [self.backgroundTaskManager startBackgroundTask]; // Start up the internal proxy object @@ -233,7 +233,7 @@ - (void)didEnterStateStarted { self.proxy = [SDLProxy iapProxyWithListener:self.notificationDispatcher secondaryTransportManager:self.secondaryTransportManager]; } -# pragma clang diagnostic pop + #pragma clang diagnostic pop } - (void)didEnterStateStopped { @@ -843,12 +843,6 @@ - (void)videoServiceProtocolDidUpdateFromOldProtocol:(nullable SDLProtocol *)old } } -#pragma mark - Lifecycle Destruction - -- (void)dealloc { - [self.backgroundTaskManager endBackgroundTask]; -} - @end NS_ASSUME_NONNULL_END From 76d6cd10f715c0c4ca2df0e20df67727a8f5e3fe Mon Sep 17 00:00:00 2001 From: Joel Fischer Date: Thu, 27 Jun 2019 10:05:27 -0400 Subject: [PATCH 179/179] Update for v6.3.0 --- CHANGELOG.md | 169 +++++---- .../SmartDeviceLink-Example-ObjC-Info.plist | 2 +- .../SmartDeviceLink-Example-Swift-Info.plist | 2 +- SmartDeviceLink-iOS.podspec | 2 +- SmartDeviceLink.podspec | 2 +- SmartDeviceLink/Info.plist | 2 +- SmartDeviceLink/SDLProxy.m | 2 +- SmartDeviceLinkSwift/Info.plist | 2 +- docs/Classes.html | 344 ++++++++---------- docs/Classes/SDLAudioFile.html | 171 +++++++++ docs/Classes/SDLAudioStreamManager.html | 40 +- docs/Classes/SDLManager.html | 97 +++++ docs/Classes/SDLRPCMessage.html | 99 ++--- docs/Classes/SDLRPCStruct.html | 28 +- docs/Classes/SDLScreenManager.html | 26 ++ docs/Classes/SDLStreamingMediaManager.html | 4 +- docs/Classes/SDLSystemCapabilityManager.html | 140 ++++++- docs/Enums.html | 53 ++- docs/Enums/MenuCellState.html | 71 ++++ docs/Enums/SDLChoiceSetManagerError.html | 19 + docs/Enums/SDLDynamicMenuUpdatesMode.html | 77 ++++ docs/Protocols.html | 20 +- .../SDLAudioStreamManagerDelegate.html | 54 +++ docs/Type Definitions.html | 43 +++ docs/index.html | 10 + docs/search.json | 2 +- docs/undocumented.json | 113 ++++-- 27 files changed, 1185 insertions(+), 409 deletions(-) create mode 100644 docs/Classes/SDLAudioFile.html create mode 100644 docs/Enums/MenuCellState.html create mode 100644 docs/Enums/SDLDynamicMenuUpdatesMode.html diff --git a/CHANGELOG.md b/CHANGELOG.md index f141cf03d..3bcfbf9b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,18 +1,49 @@ -# 6.2.3 +# Changelog +## 6.3.0 +### Versions +* Supports [SDL RPC Spec 5.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/5.1.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0). + +### Enhancements +* Support dynamic adding / deleting of menu items when they need to be replaced instead of a full delete / add (https://www.github.com/smartdevicelink/sdl_ios/issues/1144). +* The library can now be used via the [Accio Package Manager](https://github.com/JamitLabs/Accio) (https://www.github.com/smartdevicelink/sdl_ios/issues/1229). +* Update to Swift 5.0 (https://www.github.com/smartdevicelink/sdl_ios/issues/1245). +* Add RPC subscription methods to `SDLManager` for ease of use (https://www.github.com/smartdevicelink/sdl_ios/issues/1257). +* Support subscribing to SystemCapabilities with the SystemCapabilityManager (https://www.github.com/smartdevicelink/sdl_ios/issues/1271). +* Support pushing raw PCM audio buffers into the `SDLAudioStreamManager` (https://www.github.com/smartdevicelink/sdl_ios/issues/1275). + +### Bug Fixes +* Fix soft button manager entering an infinite loop if artwork fails to upload (https://www.github.com/smartdevicelink/sdl_ios/issues/1177). +* Deprecate RPC superclass initializers as they are not for public use (https://www.github.com/smartdevicelink/sdl_ios/issues/1204). +* Fixed the audio stream manager shutting down when the device app was in the background. It now stays active when the app is in the background (https://www.github.com/smartdevicelink/sdl_ios/issues/1224). +* Fixed Alert RPC documentation (https://www.github.com/smartdevicelink/sdl_ios/issues/1233). +* Fix soft button multiple transitions failing (https://www.github.com/smartdevicelink/sdl_ios/issues/1234). +* Fixed numerous IAP transport issues with a near full rewrite of the related classes (https://www.github.com/smartdevicelink/sdl_ios/issues/1239, https://www.github.com/smartdevicelink/sdl_ios/issues/1263, https://www.github.com/smartdevicelink/sdl_ios/issues/1316, https://www.github.com/smartdevicelink/sdl_ios/issues/1321). +* Fixed `SDLManager` delegate methods not getting called in certain circumstances (https://www.github.com/smartdevicelink/sdl_ios/issues/1243, https://www.github.com/smartdevicelink/sdl_ios/issues/1264). +* Fixed `SDLManager.stop` crashes in certain circumstances (https://www.github.com/smartdevicelink/sdl_ios/issues/1268). +* Fixed inaccessible `SDLAudioStreamManager` API (https://www.github.com/smartdevicelink/sdl_ios/issues/1283). +* Fix setting `SDLChoiceSet``vrHelpItems` outside of the initializer not properly setting their position indexes (https://www.github.com/smartdevicelink/sdl_ios/issues/1291). + +### Example Apps +* Fixed `resetConnection` causing a crash (https://www.github.com/smartdevicelink/sdl_ios/issues/1237). + +### Dependencies +* Updated BiSON dependency to v1.2.0 to fix potential buffer overruns (https://www.github.com/smartdevicelink/sdl_ios/issues/1280, https://www.github.com/smartdevicelink/sdl_ios/issues/1285). + +## 6.2.3 ### Versions * Supports [SDL RPC Spec 5.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/5.1.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0). ### Bug Fixes * Fix all lockscreen related crashes when SDL is setup before the main window exists (https://www.github.com/smartdevicelink/sdl_ios/issues/1258). -# 6.2.2 +## 6.2.2 ### Versions * Supports [SDL RPC Spec 5.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/5.1.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0). ### Bug Fixes * Add an explicit exception if SDL is setup before the app's window. The app's window **must** be setup before SDL is started (https://www.github.com/smartdevicelink/sdl_ios/issues/1255). -# 6.2.1 +## 6.2.1 ### Versions * Supports [SDL RPC Spec 5.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/5.1.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0). @@ -28,7 +59,7 @@ * The example apps will now auto-reconnect if disconnected physically from the head unit (https://www.github.com/smartdevicelink/sdl_ios/issues/1237). * Update the example swift app to Swift 5 (https://www.github.com/smartdevicelink/sdl_ios/issues/1172, https://www.github.com/smartdevicelink/sdl_ios/issues/1243, https://www.github.com/smartdevicelink/sdl_ios/issues/1245). -# 6.2.0 +## 6.2.0 ### Versions * Supports [SDL RPC Spec 5.1.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/5.1.0) and [SDL Protocol Spec 5.2.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.2.0). @@ -61,27 +92,27 @@ * Fixed head units that don't support choice set `menuName` required parameter causing issues. Proper errors will now be thrown. (https://github.com/smartdevicelink/sdl_ios/issues/1220) * Fixed app attempting a reconnect after being unregistered for a `PROTOCOL_VIOLATION`. (https://github.com/smartdevicelink/sdl_ios/issues/1223) -# 6.1.2 +## 6.1.2 ### Bug Fixes * Fix external accessories never reconnecting if connected over both Bluetooth and USB when one transport is disconnected (https://github.com/smartdevicelink/sdl_ios/issues/1113). -# 6.1.1 +## 6.1.1 ### Bug Fixes * Fix possible crash when checking text fields in the screen manager (https://github.com/smartdevicelink/sdl_ios/issues/1122). * Fix possible crash when checking language field of `RegisterAppInterfaceResponse` in `SDLLifecycleManager` (https://github.com/smartdevicelink/sdl_ios/issues/1127). -# 6.1.0 (Since RC 2) +## 6.1.0 (Since RC 2) ### Versions * Supports [SDL RPC Spec 5.0.0](https://github.com/smartdevicelink/rpc_spec/releases/tag/5.0.0) and [SDL Protocol Spec 5.1.0](https://github.com/smartdevicelink/protocol_spec/releases/tag/5.1.0). ### Changes * None -# 6.1.0 Release Candidate 2 +## 6.1.0 Release Candidate 2 ### Bug Fixes * If a RegisterAppInterface or SetDisplayLayout fail, don't set displayCapabilities to nil in the screen manager [#1108](https://github.com/smartdevicelink/sdl_ios/issues/1108). -# 6.1.0 Release Candidate 1 +## 6.1.0 Release Candidate 1 ### Enhancements * `PlayPause` button name has been added for subscription [#246](https://github.com/smartdevicelink/sdl_ios/issues/246). * Added the ability to play an audio file (such as a jingle) through `TTSChunk`, which may be used in an `Alert` or `Speak` RPC, for example [SDL-0014] [#524](https://github.com/smartdevicelink/sdl_ios/issues/524). @@ -114,27 +145,27 @@ * Fix setting CarWindow `rootViewController` not on main thread [#1101](https://github.com/smartdevicelink/sdl_ios/issues/1101). * Add audio transcode files to default log module map [#1103](https://github.com/smartdevicelink/sdl_ios/issues/1103). -# 6.0.2 +## 6.0.2 ### Bug Fixes * Video streaming apps put into a phone background state can now properly stop the video streaming when it leaves a streamable HMI state. [#1047](https://github.com/smartdevicelink/sdl_ios/issues/1047) -# 6.0.1 +## 6.0.1 ### Bug Fixes * Fixed a crash that could occur in development circumstances if the head unit returns "-1" for an enum * Fixed manually sent Show RPCs causing issues when changing layouts. -# 6.0.0 (Changes since RC1) +## 6.0.0 (Changes since RC1) * None -# 6.0.0 Release Candidate 2 (Changes since RC1) +## 6.0.0 Release Candidate 2 (Changes since RC1) ### Bug Fixes * Fixes generated file names being too long for some SDL implementations. [#976](https://github.com/smartdevicelink/sdl_ios/issues/976) * Unauthorized apps will no longer spin in a reconnection loop. [#977](https://github.com/smartdevicelink/sdl_ios/issues/977) * Fixes needing to clean every time one switches building the example apps. [#982](https://github.com/smartdevicelink/sdl_ios/issues/982) * Speeds up video streaming resets when app goes from background -> foreground on the phone. [#979](https://github.com/smartdevicelink/sdl_ios/issues/979) -# 6.0.0 Release Candidate 1 +## 6.0.0 Release Candidate 1 ### Breaking Changes * Remove `SDLProxy`, `SDLProtocol`, `SDLTransport` and related classes and protocols. [SDL-0016] [#454](https://github.com/smartdevicelink/sdl_ios/issues/454) [SDL-0017] [#525](https://github.com/smartdevicelink/sdl_ios/issues/525) [SDL-0019] [#603](https://github.com/smartdevicelink/sdl_ios/issues/603) @@ -160,7 +191,7 @@ * Fix SDLShow initializer crashes. [#966](https://github.com/smartdevicelink/sdl_ios/issues/966) * Fix mediaTrack field on ScreenManager. [#968](https://github.com/smartdevicelink/sdl_ios/issues/968) -# 5.2.0 +## 5.2.0 ### Enhancements * Add a screen manager which currently handles text, graphics, and soft buttons [SDL-0134] [#862](https://github.com/smartdevicelink/sdl_ios/issues/862) * Add soft button object and states, which allow for declaratively designing soft buttons with multiple states @@ -186,11 +217,11 @@ * Work around a module `ListFiles` bug on previous SDL Core versions [#827](https://github.com/smartdevicelink/sdl_ios/issues/827) * CarWindow will no longer crash on iOS 9 [#904](https://github.com/smartdevicelink/sdl_ios/issues/904) -# 5.1.1 +## 5.1.1 ### Bug Fixes * Fixed import statement, allows for Cocoapods release -# 5.1.0 +## 5.1.0 ### Enhancements * Log unsuccessful RPC responses automatically [#811](https://github.com/smartdevicelink/sdl_ios/issues/811). * IAP Transport reconnection optimizations [#816](https://github.com/smartdevicelink/sdl_ios/issues/816). @@ -212,19 +243,19 @@ ### Other * Remove an unused testing library from the Cartfile [#823](https://github.com/smartdevicelink/sdl_ios/issues/823). -# 5.0.0 +## 5.0.0 No changes since RC3 -# 5.0.0 Release Candidate 3 (changes since RC 2) +## 5.0.0 Release Candidate 3 (changes since RC 2) ### Bug Fixes * Fix a possible crash if the List Files request from the FileManager fails due to disconnection or unregistration. -# 5.0.0 Release Candidate 2 (changes since RC 1) +## 5.0.0 Release Candidate 2 (changes since RC 1) ### Bug Fixes * Fixed podspec * Focus manager will only activate on iOS 9+, it uses APIs only available on iOS 9+ -# 5.0.0 Release Notes +## 5.0.0 Release Notes ### Breaking Changes * `SDLProxy.streamingMediaManager` is now removed. If you wish to use a streaming media manager, you must use `SDLManager.streamingMediaManager`. The streaming media manager has been entirely redesigned and now takes into account both phone and head unit app lifecycles [SDL-0033](https://github.com/smartdevicelink/sdl_ios/issues/583). There is now a streaming media configuration added to `SDLConfiguration`. * `SDLJingle` constants have been removed [#7](https://github.com/smartdevicelink/sdl_ios/issues/7). @@ -271,20 +302,20 @@ No changes since RC3 * `SDLOnLockScreenStatus` does not use constants for property keys [#497](https://github.com/smartdevicelink/sdl_ios/issues/497). * Removed deprecated methods [#679](https://github.com/smartdevicelink/sdl_ios/issues/679). -# 4.7.4 Release Notes +## 4.7.4 Release Notes ### Bug Fixes * Fix for connecting video streaming on Core 4.4.0 (to be released) and above. -# 4.7.3 Release Notes +## 4.7.3 Release Notes ### Bug Fixes * Performance fixes for streaming video. * Fixes for background connection on IAP transports. -# 4.7.2 Release Notes +## 4.7.2 Release Notes ### Bug Fixes * Fixes some head units not connecting properly due to the start service payload length not being set properly. -# 4.7.1 Release Notes +## 4.7.1 Release Notes ### Breaking Changes * This bumps up the minimum supported version to 7.0 due to Xcode 9 changes. The upcoming v5.0.0 will raise the minimum version to 8.0. @@ -295,12 +326,12 @@ No changes since RC3 * Any tests must now be run on Xcode 9. * The travis config file has been updated to run on Xcode 9. -# 4.7.0 Release Notes (since RC 1) +## 4.7.0 Release Notes (since RC 1) ### Bug Fixes * Fixed payloads being created with nil data causing a crash [#715](https://github.com/smartdevicelink/sdl_ios/issues/715). * Fixed documentation warnings. -# 4.7.0 Release Candidate 1 +## 4.7.0 Release Candidate 1 ### Enhancements * This library implements RPC Spec v4.5.0, Protocol Spec v5.0.0. * Added App type enum: `PROJECTION`, for an app that uses video streaming for its interface yet is not a navigation app [SDL-0031](https://github.com/smartdevicelink/sdl_evolution/blob/master/proposals/0031-mobile-projection.md). @@ -325,28 +356,28 @@ No changes since RC3 ### Other * Added a note to the documentation regarding file name length maximums [#640](https://github.com/smartdevicelink/sdl_ios/issues/640). -# 4.6.1 Release Notes +## 4.6.1 Release Notes ### Bug Fixes * Fixes a bug where an app would crash if connected while the app is foregrounded and the vehicle is already in motion. ### Example App * Now compiles correctly. -# 4.6.0 Release Notes (since RC 2) +## 4.6.0 Release Notes (since RC 2) ### Example App * Added a command to send a `GetVehicleData`. ### Known Issues * On DEBUG builds of an app, if a connected Sync Gen 3 head unit goes through a normal shut down sequence (key out, door open), the app will crash. This will not occur on RELEASE builds. -# 4.6.0 Release Candidate 2 Release Notes (since RC 1) +## 4.6.0 Release Candidate 2 Release Notes (since RC 1) ### Bug Fixes * Altered the connection timeframe from 0-10 seconds to 1.5-9.5 seconds to improve connection reliability. (SDL-0067) ### Example App * Fixes a bug causing a crash upon unexpected IAP disconnection and reconnection. -# 4.6.0 Release Candidate 1 Release Notes +## 4.6.0 Release Candidate 1 Release Notes ### Bug Fixes * Fix setting lifecycle configuration `appType` to `nil`. * If an array would return `NSNull`, return an empty array instead. @@ -362,7 +393,7 @@ No changes since RC3 ### Known Issues * When an app is connected over USB, the USB is disconnected, then reconnected, the app will crash. -# 4.5.5 Release Notes +## 4.5.5 Release Notes ### Bug Fixes * Added a check for if `SDLManager` is already started and prevent starting it again. * Prevent infinite loops in IAP transport. @@ -370,7 +401,7 @@ No changes since RC3 ### Example App * Fixed incorrectly setting button state on disconnect. -# 4.5.4 Release Notes +## 4.5.4 Release Notes ### Bug Fixes * Streaming video will not crash if data is unexpectedly NULL. * SDL now compiles on Xcode 8.3. @@ -378,12 +409,12 @@ No changes since RC3 * Internal state machines now throw more descriptive exceptions. -# 4.5.3 Release Notes +## 4.5.3 Release Notes ### Bug Fixes * `SDLManager`'s `delegate` method `hmiLevel:didChangeToLevel:` now only triggers when the HMI level changes, instead of whenever an `onHMIStatus` is received. * Fixed a few crashes in `SDLStreamingMediaManager` for navigation video streaming. -# 4.5.2 Release Notes +## 4.5.2 Release Notes ### Bug Fixes * Fixed unhandled Register App Interface Response warnings causing the manager to disconnect. * Fixed `SDLManager stop` not actually stopping SDL. @@ -393,16 +424,16 @@ No changes since RC3 ### Example Project * Connect / Disconnect button appearance fixed. -# 4.5.1 Release Notes +## 4.5.1 Release Notes ### Bug Fixes * Fixed large file transfers not properly setting their offset. * Check for nil before attempting to send an RPC request. -# 4.5.0 Release Notes (Since Beta 2) +## 4.5.0 Release Notes (Since Beta 2) ### Bug Fixes * Fixed an issue attempting to upload an app icon when the head unit does not support images. -# 4.5.0 Beta 2 Release Notes +## 4.5.0 Beta 2 Release Notes ### Bug Fixes * Fixed an issue with printing incorrect Frame Data when logging. * Fixed an issue with SDLLocationDetails' properties being incorrectly stored. @@ -410,14 +441,14 @@ No changes since RC3 * Fixed an issue with a SDLPerformInteraction initializer causing an infinite loop. * Fixed an issue with uploading a nil SDLFile would cause an infinite loop. -# 4.5.0 Beta 1 Release Notes +## 4.5.0 Beta 1 Release Notes ### Bug Fixes * Altered how Security libraries get the app id so they can start downloads faster. * Fixed a number of RPC initializers to have correct number sizes. * Fixed a video session crash in rare instances when the compression session was NULL. * Fixed waypoint RPCs missing response and notification dispatchers and incorrect spelling on some classes (the old classes are deprecated). -# 4.4.1 Release Notes +## 4.4.1 Release Notes ### Bug Fixes * Subscribing to waypoints should now work (new feature & RPC in v4.4.0). @@ -425,7 +456,7 @@ No changes since RC3 * Fixes a few failing tests that were overlooked. * `SDLUploadFileOperation`s now use the built-in cancel mechanism instead of its own internal flag. -# 4.4.0 Release Notes +## 4.4.0 Release Notes ### Features * [SDL-0003] Adds SendLocation and associated data types. * [SDL-0004] Adds Waypointing as a feature for Last Mile Navigation. @@ -437,7 +468,7 @@ No changes since RC3 ### Tests * Fixes an issue where tests would fail to compile. -# 4.3.0 Release Notes (Since RC 6 + Highlights) +## 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. @@ -463,15 +494,15 @@ No changes since RC3 ### 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) +## 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) +## 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) +## 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. @@ -482,14 +513,14 @@ No changes since RC3 * 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) +## 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) +## 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. @@ -499,7 +530,7 @@ No changes since RC3 ### 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) +## 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. @@ -516,14 +547,14 @@ No changes since RC3 * Fixed UI buttons not updating upon connecting. * Added a soft button. -# 4.3.0 Beta 4 Release Notes (Since Beta 3) +## 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) +## 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. @@ -561,7 +592,7 @@ No changes since RC3 * Fixed some instance variables not having generics. * Updated code to match v4.2.3. -# 4.3.0 Beta 2 Release Notes (Since Beta 1) +## 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. @@ -572,7 +603,7 @@ No changes since RC3 ### 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) +## 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. @@ -585,7 +616,7 @@ No changes since RC3 * SDLLockScreenManager should use less RAM. * Fixed test failures. -# 4.3.0 Alpha 1 Release Notes +## 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. @@ -600,7 +631,7 @@ No changes since RC3 * 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 +## 4.2.4 Release Notes ### Bug Fixes * Fixed Touch Manager not always firing single touches. @@ -608,19 +639,19 @@ No changes since RC3 * Updated testing frameworks to support Xcode 8. * Updated example app to support Xcode 8. -# 4.2.3 Release Notes +## 4.2.3 Release Notes ### Bug Fixes * Fixed HTTPS URL schemes not properly uploading data (#432, #438). -# 4.2.2 Release Notes +## 4.2.2 Release Notes ### Bug Fixes * Fixed HTTP URL schemes not being properly altered to HTTPS to account for App Transport Security (#432, #436). -# 4.2.1 Release Notes +## 4.2.1 Release Notes ### Bug Fixes * Fixed SDLStreamingMediaManager encryption status not being set properly (#433, #434). -# 4.2.0 Release Notes (since Beta 1) +## 4.2.0 Release Notes (since Beta 1) ### Enhancements * The Streaming Media Manager will now provide a CVPixelBufferPool with default settings so that you don't have to create one yourself. * Modified Streaming Media Manager `videoSessionAuthenticated` to be `videoSessionEncrypted` and modify the value based on the Start Session ACK encryption flag. @@ -631,7 +662,7 @@ No changes since RC3 ### Other * Documentation updates. -# 4.2.0 Beta 1 Release Notes +## 4.2.0 Beta 1 Release Notes ### Enhancements * Add an AppInfo struct to RegisterAppInterface automatically with some application details, so that the head unit may automatically launch some apps via IAP if supported (#398, #431). * Add a touch manager to the streaming media manager. The touch manager will watch for touch events and generate gesture recognizer-like callbacks (#402, #423). @@ -642,18 +673,18 @@ No changes since RC3 * Store sessionIds and service metadata together in the protocol code (#350). * Fixed a streaming media manager enum casing issue by deprecating the incorrect cased enum and adding a correctly cased one (#383, #411). -# 4.1.5 Release Notes +## 4.1.5 Release Notes ### Bug Fixes * Since Apple is disallowing virtually all HTTP requests in Jan. 2017, SDLURLSession will now take all HTTP requests and attempt them over HTTPS. Some cars off the line still have HTTP URLs hardcoded into them, therefore this is a necessary precaution. -# 4.1.4 Release Notes +## 4.1.4 Release Notes ### Bug Fixes * Fixed exception causing app to crash when SDL Core disconnects in TCP debug mode. Warning: The app may enter an undefined connection state as there is currently no retry strategy in TCP debug mode. ### Other * Update test frameworks -# 4.1.3 Release Notes +## 4.1.3 Release Notes ### Enhancements * Fix unit tests attempting to be built against Xcode 7.1 instead of Xcode 7.3. (#413) * Auto-upload Carthage archives on tag Travis builds. (#413) @@ -666,14 +697,14 @@ No changes since RC3 ### Other * Shift project and code files into the root directory, removing the SmartDeviceLink-iOS directory. (#404) -# 4.1.2 Release Notes +## 4.1.2 Release Notes ### Bugfixes * Enable additional static analyzer rules for Xcode 7.3, fix an associated nullability issue. ### Other * New .gitignore rule to help carthage submodule users. -# 4.1.1 Release Notes +## 4.1.1 Release Notes ### Bug Fixes * Fixed passing in wrong type, causing SDL Protocol v1 to fail. * Fix `SDLRPCStruct` subclasses generating an incorrect description when logged. @@ -682,7 +713,7 @@ No changes since RC3 * Some repository files are now linked into the Xcode project. * Updated testing dependencies for Xcode 7.3 compatibility. -# 4.1.0 Release Notes +## 4.1.0 Release Notes ### Enhancements * The `LAUNCH_APP` system request was implemented. * The proxy now tracks application state and relays that information to the Head Unit on v4 and above. @@ -701,7 +732,7 @@ No changes since RC3 ### Deprecations * Methods relating to sending heartbeat have been deprecated. This should not affect your app in any way. These lower-level classes will be removed in future versions. -# 4.0.3 Release Notes +## 4.0.3 Release Notes ### Enhancements * Implement HTTP System Requests for policy updates @@ -714,7 +745,7 @@ No changes since RC3 * Moved templates and CONTRIBUTING to .github * Enable code coverage by default when testing -# 4.0.2 Release Notes +## 4.0.2 Release Notes ### Bug Fixes * Debug logging is a bit better designed and is faster, and file logging happens on a separate queue. @@ -731,12 +762,12 @@ No changes since RC3 * Travis CI builds are fixed * Pull-Request and Issue templates have been added -# 4.0.1 Release notes +## 4.0.1 Release notes ### Bug Fixes * Fixed some implicit `self` captures with blocks. -# 4.0.0 Release Notes (pre-release) +## 4.0.0 Release Notes (pre-release) ## Final Release (2015-10-5) * Example app plist updated with required [ATS](https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/) keys. diff --git a/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist b/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist index d5b5c33a3..db70c2cae 100644 --- a/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist +++ b/Example Apps/Example ObjC/SmartDeviceLink-Example-ObjC-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 6.2.3 + 6.3.0 CFBundleSignature ???? CFBundleVersion diff --git a/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist b/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist index 31e903f97..d3ab6c871 100644 --- a/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist +++ b/Example Apps/Example Swift/SmartDeviceLink-Example-Swift-Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 6.2.3 + 6.3.0 CFBundleSignature ???? CFBundleVersion diff --git a/SmartDeviceLink-iOS.podspec b/SmartDeviceLink-iOS.podspec index 75382d935..0b91c7649 100644 --- a/SmartDeviceLink-iOS.podspec +++ b/SmartDeviceLink-iOS.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SmartDeviceLink-iOS" -s.version = "6.2.3" +s.version = "6.3.0" s.summary = "Connect your app with cars!" s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS" s.license = { :type => "New BSD", :file => "LICENSE" } diff --git a/SmartDeviceLink.podspec b/SmartDeviceLink.podspec index 0394e5347..17fa2cfc8 100644 --- a/SmartDeviceLink.podspec +++ b/SmartDeviceLink.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SmartDeviceLink" -s.version = "6.2.3" +s.version = "6.3.0" s.summary = "Connect your app with cars!" s.homepage = "https://github.com/smartdevicelink/SmartDeviceLink-iOS" s.license = { :type => "New BSD", :file => "LICENSE" } diff --git a/SmartDeviceLink/Info.plist b/SmartDeviceLink/Info.plist index a140cf4b0..8761e930d 100644 --- a/SmartDeviceLink/Info.plist +++ b/SmartDeviceLink/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 6.2.3 + 6.3.0 CFBundleSignature ???? CFBundleVersion diff --git a/SmartDeviceLink/SDLProxy.m b/SmartDeviceLink/SDLProxy.m index 803cdc072..6ab2006c8 100644 --- a/SmartDeviceLink/SDLProxy.m +++ b/SmartDeviceLink/SDLProxy.m @@ -50,7 +50,7 @@ typedef void (^URLSessionTaskCompletionHandler)(NSData *data, NSURLResponse *response, NSError *error); typedef void (^URLSessionDownloadTaskCompletionHandler)(NSURL *location, NSURLResponse *response, NSError *error); -NSString *const SDLProxyVersion = @"6.2.3"; +NSString *const SDLProxyVersion = @"6.3.0"; const float StartSessionTime = 10.0; const float NotifyProxyClosedDelay = (float)0.1; const int PoliciesCorrelationId = 65535; diff --git a/SmartDeviceLinkSwift/Info.plist b/SmartDeviceLinkSwift/Info.plist index ed1455724..93c3f315c 100644 --- a/SmartDeviceLinkSwift/Info.plist +++ b/SmartDeviceLinkSwift/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 6.2.3 + 6.3.0 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/docs/Classes.html b/docs/Classes.html index 642fe7a4a..f8498c085 100644 --- a/docs/Classes.html +++ b/docs/Classes.html @@ -21,6 +21,7 @@

Section Contents

  • SDLArtwork
  • SDLAudioControlCapabilities
  • SDLAudioControlData
  • +
  • SDLAudioFile
  • SDLAudioPassThruCapabilities
  • SDLAudioStreamManager
  • SDLBeltStatus
  • @@ -1103,6 +1104,70 @@

    Swift

    +

    + SDLAudioFile +

    + +

    Undocumented

    + + See more + + +

    Objective-C

    +
    @interface SDLAudioFile : NSObject
    +
    +/**
    + If initialized with a file URL, the file URL it came from
    + */
    +@property (nullable, copy, nonatomic, readonly) NSURL *inputFileURL;
    +
    +/**
    + If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file
    + */
    +@property (nullable, copy, nonatomic, readonly) NSURL *outputFileURL;
    +
    +/**
    + In seconds. UINT32_MAX if unknown.
    + */
    +@property (assign, nonatomic) UInt32 estimatedDuration;
    +
    +/**
    + The PCM audio data to be transferred and played
    + */
    +@property (copy, nonatomic, readonly) NSData *data;
    +
    +/**
    + The size of the PCM audio data in bytes
    + */
    +@property (assign, nonatomic, readonly) unsigned long long fileSize;
    +
    +/**
    + Initialize an audio file to be queued and played
    +
    + @param inputURL The file that exists on the device to be transcoded and queued
    + @param outputURL The target URL that the transcoded file will be output to
    + @param duration The duration of the file
    + @return The audio file object
    + */
    +- (instancetype)initWithInputFileURL:(NSURL *)inputURL outputFileURL:(NSURL *)outputURL estimatedDuration:(UInt32)duration;
    +
    +/**
    + Initialize a buffer of PCM audio data to be queued and played
    +
    + @param data The PCM audio data buffer
    + @return The audio file object
    + */
    +- (instancetype)initWithData:(NSData *)data;
    +
    +@end
    + + +

    Swift

    +
    class SDLAudioFile : NSObject
    + + + +

    SDLAudioPassThruCapabilities

    @@ -1149,7 +1214,7 @@

    Objective-C

    /** The queue of audio files that will be played in sequence */ -@property (copy, nonatomic, readonly) NSArray<SDLAudioFile *> *queue; +@property (copy, nonatomic, readonly) NSArray<SDLAudioFile *> *queue; /** Init should only occur with dependencies. use `initWithManager:` @@ -1177,6 +1242,22 @@

    Objective-C

    */
    - (void)pushWithFileURL:(NSURL *)fileURL; +/** + Push a new audio buffer onto the queue. Call `playNextWhenReady` to start playing the pushed audio buffer. + + This data must be of the required PCM format. See SDLSystemCapabilityManager.pcmStreamCapability and SDLAudioPassThruCapability.h. + + This is *an example* of a PCM format used by some head units: + - audioType: PCM + - samplingRate: 16kHZ + - bitsPerSample: 16 bits + + There is generally only one channel to the data. + + @param data The audio buffer to be pushed onto the queue + */ +- (void)pushWithData:(NSData *)data; + /** Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed. @@ -4418,6 +4499,44 @@

    Objective-C

    */
    - (void)sendSequentialRequests:(NSArray<SDLRPCRequest *> *)requests progressHandler:(nullable SDLMultipleSequentialRequestProgressHandler)progressHandler completionHandler:(nullable SDLMultipleRequestCompletionHandler)completionHandler NS_SWIFT_NAME(sendSequential(requests:progressHandler:completionHandler:)); + +#pragma mark - RPC Subscriptions + +typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *message); + +/** + * Subscribe to callbacks about a particular RPC request, notification, or response with a block callback. + * + * @param rpcName The name of the RPC request, response, or notification to subscribe to. + * @param block The block that will be called every time an RPC of the name and type specified is received. + * @return An object that can be passed to `unsubscribeFromRPC:ofType:withObserver:` to unsubscribe the block. + */ +- (id)subscribeToRPC:(SDLNotificationName)rpcName withBlock:(SDLRPCUpdatedBlock)block NS_SWIFT_NAME(subscribe(to:block:)); + +/** + * Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback. + * + * The selector supports the following parameters: + * + * 1. Zero parameters e.g. `- (void)registerAppInterfaceResponse` + * 2. One parameter e.g. `- (void)registerAppInterfaceResponse:(NSNotification *)notification;` + * + * Note that using this method to get a response instead of the `sendRequest:withResponseHandler:` method of getting a response, you will not be notifed of any `SDLGenericResponse` errors where the head unit doesn't understand the request. + * + * @param rpcName The name of the RPC request, response, or notification to subscribe to. + * @param observer The object that will have its selector called every time an RPC of the name and type specified is received. + * @param selector The selector on `observer` that will be called every time an RPC of the name and type specified is received. + */ +- (void)subscribeToRPC:(SDLNotificationName)rpcName withObserver:(id)observer selector:(SEL)selector NS_SWIFT_NAME(subscribe(to:observer:selector:)); + +/** + * Unsubscribe to callbacks about a particular RPC request, notification, or response. + * + * @param rpcName The name of the RPC request, response, or notification to unsubscribe from. + * @param observer The object representing a block callback or selector callback to be unsubscribed + */ +- (void)unsubscribeFromRPC:(SDLNotificationName)rpcName withObserver:(id)observer NS_SWIFT_NAME(unsubscribe(from:observer:)); + @end @@ -6178,11 +6297,7 @@

    Objective-C

    -
    @interface SDLRPCMessage : SDLRPCStruct <NSCopying> {
    -    NSMutableDictionary<NSString *, id> *function;
    -    NSMutableDictionary<NSString *, id> *parameters;
    -    NSString *messageType;
    -}
    +  
    @interface SDLRPCMessage : SDLRPCStruct <NSCopying>
     
     /**
      *  Convenience init
    @@ -6190,29 +6305,21 @@ 

    Objective-C

    * @param name The name of the message * @return A SDLRPCMessage object */
    -- (instancetype)initWithName:(NSString *)name; - -/** - * Convenience init - * - * @param dict A dictionary with the format @{messageType: @{parameters}} - * @return A SDLRPCMessage object - */ -- (instancetype)initWithDictionary:(NSDictionary<NSString *, id> *)dict; +- (instancetype)initWithName:(NSString *)name __deprecated_msg("This is not intended to be a public facing API"); /** * Returns the function name. * * @return The function name */ -- (nullable NSString *)getFunctionName; +- (nullable NSString *)getFunctionName __deprecated_msg("Call the .name property instead"); /** * Sets the function name. * * @param functionName The function name */ -- (void)setFunctionName:(nullable NSString *)functionName; +- (void)setFunctionName:(nullable NSString *)functionName __deprecated_msg("This is not intended to be a public facing API"); /** * Returns the value associated with the provided key. If the key does not exist, null is returned. @@ -6220,7 +6327,7 @@

    Objective-C

    * @param functionName The key name * @return The value associated with the function name */
    -- (nullable NSObject *)getParameters:(NSString *)functionName; +- (nullable NSObject *)getParameters:(NSString *)functionName __deprecated_msg("Call the .parameters property instead"); /** * Sets a key-value pair using the function name as the key. @@ -6228,7 +6335,7 @@

    Objective-C

    * @param functionName The name for the key * @param value The value associated with the function name */
    -- (void)setParameters:(NSString *)functionName value:(nullable NSObject *)value; +- (void)setParameters:(NSString *)functionName value:(nullable NSObject *)value __deprecated_msg("This is not intended to be a public facing API"); /** * The data in the message @@ -6240,6 +6347,11 @@

    Objective-C

    */
    @property (strong, nonatomic, readonly) NSString *name; +/** + The JSON-RPC parameters + */ +@property (strong, nonatomic, readonly) NSMutableDictionary<NSString *, id> *parameters; + /** * The type of data in the message */ @@ -6406,9 +6518,9 @@

    Objective-C

    -
    @interface SDLRPCStruct : NSObject <NSCopying> {
    -    NSMutableDictionary<NSString *, id> *store;
    -}
    +  
    @interface SDLRPCStruct : NSObject <NSCopying>
    +
    +@property (strong, nonatomic, readonly) NSMutableDictionary<NSString *, id> *store;
     
     /**
      *  Convenience init
    @@ -6416,14 +6528,7 @@ 

    Objective-C

    * @param dict A dictionary * @return A SDLRPCStruct object */
    -- (instancetype)initWithDictionary:(NSDictionary<NSString *, id> *)dict; - -/** - * Init - * - * @return A SDLRPCStruct object - */ -- (instancetype)init; +- (instancetype)initWithDictionary:(NSDictionary<NSString *, id> *)dict __deprecated_msg("This is not intended for public use"); /** * Converts struct to JSON formatted data @@ -6431,7 +6536,7 @@

    Objective-C

    * @param version The protocol version * @return JSON formatted data */
    -- (NSDictionary<NSString *, id> *)serializeAsDictionary:(Byte)version; +- (NSDictionary<NSString *, id> *)serializeAsDictionary:(Byte)version __deprecated_msg("This is not intended for public use"); @end
    @@ -6779,6 +6884,17 @@

    Objective-C

    */ @property (copy, nonatomic) NSArray<SDLMenuCell *> *menu; +/** +Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units. + +The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to `SDLDynamicMenuUpdatesModeForceOn`, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI. + +If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus. + + We recommend using either `SDLDynamicMenuUpdatesModeOnWithCompatibility` or `SDLDynamicMenuUpdatesModeForceOn`. `SDLDynamicMenuUpdatesModeOnWithCompatibility` turns dynamic updates off for head units that we know have poor compatibility with dynamic updates (e.g. they have bugs that cause menu items to not be placed correctly). + */ +@property (assign, nonatomic) SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode; + /** The current list of voice commands available for the user to speak and be recognized by the IVI's voice recognition engine. */ @@ -8197,7 +8313,9 @@

    Objective-C

    - (BOOL)sendVideoData:(CVImageBufferRef)imageBuffer presentationTimestamp:(CMTime)presentationTimestamp; /** - * This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback + * This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback. + * + * NOTE: See the `.audioManager` (SDLAudioStreamManager) `pushWithData:` method for a more modern API. * * @param audioData The data in PCM audio format, to be played * @@ -8479,171 +8597,13 @@

    SDLSystemCapabilityManager

    -

    Undocumented

    +

    A manager that handles updating and subscribing to SDL capabilities.

    See more

    Objective-C

    -
    @interface SDLSystemCapabilityManager : NSObject
    -
    -/**
    - * @see SDLDisplayCapabilities
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLDisplayCapabilities *displayCapabilities;
    -
    -/**
    - * @see SDLHMICapabilities
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLHMICapabilities *hmiCapabilities;
    -
    -/**
    - * If returned, the platform supports on-screen SoftButtons
    - *
    - * @see SDLSoftButtonCapabilities
    - *
    - * Optional, Array of length 1 - 100, of SDLSoftButtonCapabilities
    - */
    -@property (nullable, copy, nonatomic, readonly) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
    -
    -/**
    - * @see SDLButtonCapabilities
    - *
    - * Optional, Array of length 1 - 100, of SDLButtonCapabilities
    - */
    -@property (nullable, copy, nonatomic, readonly) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
    -
    -/**
    - * If returned, the platform supports custom on-screen Presets
    - *
    - * @see SDLPresetBankCapabilities
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLPresetBankCapabilities *presetBankCapabilities;
    -
    -/**
    - * @see SDLHMIZoneCapabilities
    - *
    - * Optional, Array of length 1 - 100, of SDLHMIZoneCapabilities
    - */
    -@property (nullable, copy, nonatomic, readonly) NSArray<SDLHMIZoneCapabilities> *hmiZoneCapabilities;
    -
    -/**
    - * @see SDLSpeechCapabilities
    - *
    - * Optional, Array of length 1 - 100, of SDLSpeechCapabilities
    - */
    -@property (nullable, copy, nonatomic, readonly) NSArray<SDLSpeechCapabilities> *speechCapabilities;
    -
    -/**
    - * @see SDLPrerecordedSpeech
    - *
    - * Optional, Array of length 1 - 100, of SDLPrerecordedSpeech
    - */
    -@property (nullable, copy, nonatomic, readonly) NSArray<SDLPrerecordedSpeech> *prerecordedSpeechCapabilities;
    -
    -/**
    - * @see SDLVRCapabilities
    - *
    - * True if the head unit supports voice recognition; false if not.
    - */
    -@property (nonatomic, assign, readonly) BOOL vrCapability;
    -
    -/**
    - * @see SDLAudioPassThruCapabilities
    - *
    - * Optional, Array of length 1 - 100, of SDLAudioPassThruCapabilities
    - */
    -@property (nullable, copy, nonatomic, readonly) NSArray<SDLAudioPassThruCapabilities *> *audioPassThruCapabilities;
    -
    -/**
    - * @see SDLAudioPassThruCapabilities
    - *
    - * Optional, Array of length 1 - 100, of SDLAudioPassThruCapabilities
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLAudioPassThruCapabilities *pcmStreamCapability;
    -
    -/**
    - * If returned, the platform supports app services
    - *
    - * @see SDLAppServicesCapabilities
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLAppServicesCapabilities *appServicesCapabilities;
    -
    -/**
    - * If returned, the platform supports navigation
    - *
    - * @see SDLNavigationCapability
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLNavigationCapability *navigationCapability;
    -
    -/**
    - * If returned, the platform supports making phone calls
    - *
    - * @see SDLPhoneCapability
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLPhoneCapability *phoneCapability;
    -
    -/**
    - * If returned, the platform supports video streaming
    - *
    - * @see SDLVideoStreamingCapability
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLVideoStreamingCapability *videoStreamingCapability;
    -
    -/**
    - * If returned, the platform supports remote control capabilities
    - *
    - * @see SDLRemoteControlCapabilities
    - *
    - * Optional
    - */
    -@property (nullable, strong, nonatomic, readonly) SDLRemoteControlCapabilities *remoteControlCapability;
    -
    -/**
    - *  Init is unavailable. Dependencies must be injected using initWithConnectionManager:
    - *
    - *  @return nil
    - */
    -- (instancetype)init NS_UNAVAILABLE;
    -
    -/**
    - *  Creates a new system capability manager with a specified connection manager
    - *
    - *  @param manager A connection manager to use to forward on RPCs
    - *
    - *  @return An instance of SDLSystemCapabilityManager
    - */
    -- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)manager NS_DESIGNATED_INITIALIZER;
    -
    -/**
    - *  Stops the manager. This method is used internally.
    - */
    -- (void)stop;
    -
    -/**
    - *  Retrieves a capability type from the remote system. This function must be called in order to retrieve the values for `navigationCapability`, `phoneCapability`, `videoStreamingCapability`, `remoteControlCapability`, and `appServicesCapabilities`. If you do not call this method first, those values will be nil. After calling this method, assuming there is no error in the handler, you may retrieve the capability you requested from the manager within the handler.
    - *
    - *  @param type The type of capability to retrieve
    - *  @param handler The handler to be called when the retrieval is complete
    - */
    -- (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SDLUpdateCapabilityHandler)handler;
    -
    -
    -@end
    +
    @interface SDLSystemCapabilityManager : NSObject

    Swift

    diff --git a/docs/Classes/SDLAudioFile.html b/docs/Classes/SDLAudioFile.html new file mode 100644 index 000000000..c9b151dbe --- /dev/null +++ b/docs/Classes/SDLAudioFile.html @@ -0,0 +1,171 @@ +

    SDLAudioFile Class Reference

    + +

    Section Contents

    + + + +

    Overview

    + +

    Undocumented

    + + +
    +

    + inputFileURL +

    + +

    If initialized with a file URL, the file URL it came from

    + + + +

    Objective-C

    +
    @property (readonly, copy, nonatomic, nullable) NSURL *inputFileURL;
    + + +

    Swift

    +
    var inputFileURL: URL? { get }
    + + + + +

    + outputFileURL +

    + +

    If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file

    + + + +

    Objective-C

    +
    @property (readonly, copy, nonatomic, nullable) NSURL *outputFileURL;
    + + +

    Swift

    +
    var outputFileURL: URL? { get }
    + + + + +

    + estimatedDuration +

    + +

    In seconds. UINT32_MAX if unknown.

    + + + +

    Objective-C

    +
    @property (assign, readwrite, nonatomic) UInt32 estimatedDuration;
    + + +

    Swift

    +
    var estimatedDuration: UInt32 { get set }
    + + + + +

    + data +

    + +

    The PCM audio data to be transferred and played

    + + + +

    Objective-C

    +
    @property (readonly, copy, nonatomic) NSData *_Nonnull data;
    + + +

    Swift

    +
    var data: Data { get }
    + + + + +

    + fileSize +

    + +

    The size of the PCM audio data in bytes

    + + + +

    Objective-C

    +
    @property (readonly, assign, nonatomic) unsigned long long fileSize;
    + + +

    Swift

    +
    var fileSize: UInt64 { get }
    + + + + +

    + -initWithInputFileURL:outputFileURL:estimatedDuration: +

    + +

    Initialize an audio file to be queued and played

    + + + +

    Objective-C

    +
    - (nonnull instancetype)initWithInputFileURL:(nonnull NSURL *)inputURL
    +                               outputFileURL:(nonnull NSURL *)outputURL
    +                           estimatedDuration:(UInt32)duration;
    + + +

    Swift

    +
    init(inputFileURL inputURL: URL, outputFileURL outputURL: URL, estimatedDuration duration: UInt32)
    + + + +

    Parameters

    +
    +
    inputURL
    +

    The file that exists on the device to be transcoded and queued

    +
    outputURL
    +

    The target URL that the transcoded file will be output to

    +
    duration
    +

    The duration of the file

    +
    +
    +

    Return Value

    +

    The audio file object

    +
    + +

    + -initWithData: +

    + +

    Initialize a buffer of PCM audio data to be queued and played

    + + + +

    Objective-C

    +
    - (nonnull instancetype)initWithData:(nonnull NSData *)data;
    + + +

    Swift

    +
    init(data: Data)
    + + + +

    Parameters

    +
    +
    data
    +

    The PCM audio data buffer

    +
    +
    +

    Return Value

    +

    The audio file object

    +
    + +
    diff --git a/docs/Classes/SDLAudioStreamManager.html b/docs/Classes/SDLAudioStreamManager.html index 4e27b955c..7ccd87607 100644 --- a/docs/Classes/SDLAudioStreamManager.html +++ b/docs/Classes/SDLAudioStreamManager.html @@ -9,6 +9,7 @@

    Section Contents

  • -init
  • -initWithManager:
  • -pushWithFileURL:
  • +
  • -pushWithData:
  • -playNextWhenReady
  • -stop
  • @@ -62,11 +63,11 @@

    Objective-C

    -
    @property (readonly, copy, nonatomic) NSArray<SDLAudioFile *> *_Nonnull queue;
    +
    @property (readonly, copy, nonatomic) NSArray<SDLAudioFile *> *_Nonnull queue;

    Swift

    -
    var queue: [SDLAudioFile] { get }
    +
    var queue: [SDLAudioFile] { get }
    @@ -148,6 +149,41 @@

    Parameters

    File URL to convert

    +

    + -pushWithData: +

    + +

    Push a new audio buffer onto the queue. Call playNextWhenReady to start playing the pushed audio buffer.

    + +

    This data must be of the required PCM format. See SDLSystemCapabilityManager.pcmStreamCapability and SDLAudioPassThruCapability.h.

    + +

    This is an example of a PCM format used by some head units:

    + +
      +
    • audioType: PCM
    • +
    • samplingRate: 16kHZ
    • +
    • bitsPerSample: 16 bits
    • +
    + +

    There is generally only one channel to the data.

    + + + +

    Objective-C

    +
    - (void)pushWithData:(nonnull NSData *)data;
    + + +

    Swift

    +
    func push(with data: Data)
    + + + +

    Parameters

    +
    +
    data
    +

    The audio buffer to be pushed onto the queue

    +
    +

    -playNextWhenReady

    diff --git a/docs/Classes/SDLManager.html b/docs/Classes/SDLManager.html index a13ab7752..971756bf0 100644 --- a/docs/Classes/SDLManager.html +++ b/docs/Classes/SDLManager.html @@ -25,6 +25,9 @@

    Section Contents

  • -sendRequest:withResponseHandler:
  • -sendRequests:progressHandler:completionHandler:
  • -sendSequentialRequests:progressHandler:completionHandler:
  • +
  • -subscribeToRPC:withBlock:
  • +
  • -subscribeToRPC:withObserver:selector:
  • +
  • -unsubscribeFromRPC:withObserver:
  • Overview

    @@ -494,4 +497,98 @@

    Parameters

    A handler to call when all requests have been responded to

    +

    + -subscribeToRPC:withBlock: +

    + +

    Subscribe to callbacks about a particular RPC request, notification, or response with a block callback.

    + + + +

    Objective-C

    +
    - (nonnull id)subscribeToRPC:(nonnull SDLNotificationName)rpcName
    +                   withBlock:(nonnull SDLRPCUpdatedBlock)block;
    + + +

    Swift

    +
    func subscribe(to rpcName: NSNotification.Name, block: @escaping SDLRPCUpdatedBlock) -> Any
    + + + +

    Parameters

    +
    +
    rpcName
    +

    The name of the RPC request, response, or notification to subscribe to.

    +
    block
    +

    The block that will be called every time an RPC of the name and type specified is received.

    +
    +
    +

    Return Value

    +

    An object that can be passed to unsubscribeFromRPC:ofType:withObserver: to unsubscribe the block.

    +
    + +

    + -subscribeToRPC:withObserver:selector: +

    + +

    Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback.

    + +

    The selector supports the following parameters:

    + +
      +
    1. Zero parameters e.g. - (void)registerAppInterfaceResponse
    2. +
    3. One parameter e.g. - (void)registerAppInterfaceResponse:(NSNotification *)notification;
    4. +
    + +

    Note that using this method to get a response instead of the sendRequest:withResponseHandler: method of getting a response, you will not be notifed of any SDLGenericResponse errors where the head unit doesn’t understand the request.

    + + + +

    Objective-C

    +
    - (void)subscribeToRPC:(nonnull SDLNotificationName)rpcName
    +          withObserver:(nonnull id)observer
    +              selector:(nonnull SEL)selector;
    + + +

    Swift

    +
    func subscribe(to rpcName: NSNotification.Name, observer: Any, selector: Selector)
    + + + +

    Parameters

    +
    +
    rpcName
    +

    The name of the RPC request, response, or notification to subscribe to.

    +
    observer
    +

    The object that will have its selector called every time an RPC of the name and type specified is received.

    +
    selector
    +

    The selector on observer that will be called every time an RPC of the name and type specified is received.

    +
    + +

    + -unsubscribeFromRPC:withObserver: +

    + +

    Unsubscribe to callbacks about a particular RPC request, notification, or response.

    + + + +

    Objective-C

    +
    - (void)unsubscribeFromRPC:(nonnull SDLNotificationName)rpcName
    +              withObserver:(nonnull id)observer;
    + + +

    Swift

    +
    func unsubscribe(from rpcName: NSNotification.Name, observer: Any)
    + + + +

    Parameters

    +
    +
    rpcName
    +

    The name of the RPC request, response, or notification to unsubscribe from.

    +
    observer
    +

    The object representing a block callback or selector callback to be unsubscribed

    +
    + diff --git a/docs/Classes/SDLRPCMessage.html b/docs/Classes/SDLRPCMessage.html index 595c35d60..bc1866e74 100644 --- a/docs/Classes/SDLRPCMessage.html +++ b/docs/Classes/SDLRPCMessage.html @@ -3,17 +3,14 @@

    SDLRPCMessage Class Reference

    Section Contents

    @@ -23,51 +20,6 @@

    Overview

    -

    - function -

    - -

    Undocumented

    - - - -

    Objective-C

    -
    NSMutableDictionary<NSString *, id> *function
    - - - - - -

    - parameters -

    - -

    Undocumented

    - - - -

    Objective-C

    -
    NSMutableDictionary<NSString *, id> *parameters
    - - - - - -

    - messageType -

    - -

    Undocumented

    - - - -

    Objective-C

    -
    NSString *messageType
    - - - - -

    -initWithName:

    @@ -95,34 +47,6 @@

    Return Value

    A SDLRPCMessage object

    -

    - -initWithDictionary: -

    - -

    Convenience init

    - - - -

    Objective-C

    -
    - (nonnull instancetype)initWithDictionary:
    -    (nonnull NSDictionary<NSString *, id> *)dict;
    - - -

    Swift

    -
    init(dictionary dict: [String : Any])
    - - - -

    Parameters

    -
    -
    dict
    -

    A dictionary with the format @{messageType: @{parameters}}

    -
    -
    -

    Return Value

    -

    A SDLRPCMessage object

    -
    -

    -getFunctionName

    @@ -257,6 +181,25 @@

    Swift

    +

    + parameters +

    + +

    The JSON-RPC parameters

    + + + +

    Objective-C

    +
    @property (readonly, strong, nonatomic)
    +    NSMutableDictionary<NSString *, id> *_Nonnull parameters;
    + + +

    Swift

    +
    var parameters: NSMutableDictionary { get }
    + + + +

    messageType

    @@ -266,7 +209,7 @@

    Objective-C

    -
    @property (readonly, strong, nonatomic) NSString *_Nonnull messageType;
    +
    @property (readonly, strong, nonatomic) NSString *_Nonnull messageType;

    Swift

    diff --git a/docs/Classes/SDLRPCStruct.html b/docs/Classes/SDLRPCStruct.html index 3a0d903ec..6c00dbb22 100644 --- a/docs/Classes/SDLRPCStruct.html +++ b/docs/Classes/SDLRPCStruct.html @@ -5,7 +5,6 @@

    Section Contents

    @@ -24,9 +23,12 @@

    Objective-C

    -
    NSMutableDictionary<NSString *, id> *store
    +
    @property (strong, nonatomic, readonly) NSMutableDictionary<NSString *, id> *store
    +

    Swift

    +
    var store: NSMutableDictionary { get }
    + @@ -53,28 +55,6 @@

    Parameters

    dict

    A dictionary

    -
    -

    Return Value

    -

    A SDLRPCStruct object

    -
    - -

    - -init -

    - -

    Init

    - - - -

    Objective-C

    -
    - (nonnull instancetype)init;
    - - -

    Swift

    -
    init()
    - - -

    Return Value

    A SDLRPCStruct object

    diff --git a/docs/Classes/SDLScreenManager.html b/docs/Classes/SDLScreenManager.html index 1f3310f2b..cd981f30a 100644 --- a/docs/Classes/SDLScreenManager.html +++ b/docs/Classes/SDLScreenManager.html @@ -17,6 +17,7 @@

    Section Contents

  • textField4Type
  • softButtonObjects
  • menu
  • +
  • dynamicMenuUpdatesMode
  • voiceCommands
  • keyboardConfiguration
  • preloadedChoices
  • @@ -293,6 +294,31 @@

    Swift

    +

    + dynamicMenuUpdatesMode +

    + +

    Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units.

    + +

    The current status for dynamic menu updates. A dynamic menu update allows for smarter building of menu changes. If this status is set to SDLDynamicMenuUpdatesModeForceOn, menu updates will only create add commands for new items and delete commands for items no longer appearing in the menu. This helps reduce possible RPCs failures as there will be significantly less commands sent to the HMI.

    + +

    If set to SDLDynamicMenuUpdatesModeForceOff, menu updates will work the legacy way. This means when a new menu is set the entire old menu is deleted and add commands are created for every item regarldess if the item appears in both the old and new menu. This method is RPCs heavy and may cause some failures when creating and updating large menus.

    + +

    We recommend using either SDLDynamicMenuUpdatesModeOnWithCompatibility or SDLDynamicMenuUpdatesModeForceOn. SDLDynamicMenuUpdatesModeOnWithCompatibility turns dynamic updates off for head units that we know have poor compatibility with dynamic updates (e.g. they have bugs that cause menu items to not be placed correctly).

    + + + +

    Objective-C

    +
    @property (assign, readwrite, nonatomic)
    +    SDLDynamicMenuUpdatesMode dynamicMenuUpdatesMode;
    + + +

    Swift

    +
    var dynamicMenuUpdatesMode: SDLDynamicMenuUpdatesMode { get set }
    + + + +

    voiceCommands

    diff --git a/docs/Classes/SDLStreamingMediaManager.html b/docs/Classes/SDLStreamingMediaManager.html index c162d8fd7..c77b0b81b 100644 --- a/docs/Classes/SDLStreamingMediaManager.html +++ b/docs/Classes/SDLStreamingMediaManager.html @@ -543,7 +543,9 @@

    -sendAudioData:

    -

    This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback

    +

    This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.

    + +

    NOTE: See the .audioManager (SDLAudioStreamManager) pushWithData: method for a more modern API.

    diff --git a/docs/Classes/SDLSystemCapabilityManager.html b/docs/Classes/SDLSystemCapabilityManager.html index eb94938cb..4f066ba13 100644 --- a/docs/Classes/SDLSystemCapabilityManager.html +++ b/docs/Classes/SDLSystemCapabilityManager.html @@ -3,6 +3,7 @@

    SDLSystemCapabilityManager Class Reference

    Section Contents

    Overview

    -

    Undocumented

    +

    A manager that handles updating and subscribing to SDL capabilities.

    +

    + supportsSubscriptions +

    + +

    YES if subscriptions are available on the connected head unit. If NO, calls to subscribeToCapabilityType:withBlock and subscribeToCapabilityType:withObserver:selector will fail.

    + + + +

    Objective-C

    +
    @property (readonly, assign, nonatomic) BOOL supportsSubscriptions;
    + + +

    Swift

    +
    var supportsSubscriptions: Bool { get }
    + + + +

    displayCapabilities

    @@ -481,6 +504,24 @@

    Return Value

    An instance of SDLSystemCapabilityManager

    +

    + -start +

    + +

    Starts the manager. This method is used internally.

    + + + +

    Objective-C

    +
    - (void)start;
    + + +

    Swift

    +
    func start()
    + + + +

    -stop

    @@ -525,4 +566,101 @@

    Parameters

    The handler to be called when the retrieval is complete

    +

    + -subscribeToCapabilityType:withBlock: +

    + +

    Subscribe to a particular capability type using a block callback

    + + + +

    Objective-C

    +
    - (nullable id<NSObject>)
    +    subscribeToCapabilityType:(nonnull SDLSystemCapabilityType)type
    +                    withBlock:(nonnull SDLCapabilityUpdateHandler)block;
    + + +

    Swift

    +
    func subscribe(toCapabilityType type: SDLSystemCapabilityType, with block: @escaping SDLCapabilityUpdateHandler) -> NSObjectProtocol?
    + + + +

    Parameters

    +
    +
    type
    +

    The type of capability to subscribe to

    +
    block
    +

    The block to be called when the capability is updated

    +
    +
    +

    Return Value

    +

    An object that can be used to unsubscribe the block using unsubscribeFromCapabilityType:withObserver: by passing it in the observer callback, or nil if subscriptions aren’t available on this head unit

    +
    + +

    + -subscribeToCapabilityType:withObserver:selector: +

    + +

    Subscribe to a particular capability type with a selector callback. The selector supports the following parameters:

    + +
      +
    1. No parameters e.g. - (void)phoneCapabilityUpdated;
    2. +
    3. One SDLSystemCapability * parameter e.g. - (void)phoneCapabilityUpdated:(SDLSystemCapability *)capability
    4. +
    + +

    This method will be called immediately with the current value and called every time the value is updated on RPC v5.1.0+ systems (supportsSubscriptions == YES). If this method is called on a sub-v5.1.0 system (supportsSubscriptions == NO), the method will return NO and the selector will never be called.

    + + + +

    Objective-C

    +
    - (BOOL)subscribeToCapabilityType:(nonnull SDLSystemCapabilityType)type
    +                     withObserver:(nonnull id)observer
    +                         selector:(nonnull SEL)selector;
    + + +

    Swift

    +
    func subscribe(toCapabilityType type: SDLSystemCapabilityType, withObserver observer: Any, selector: Selector) -> Bool
    + + + +

    Parameters

    +
    +
    type
    +

    The type of the system capability to subscribe to

    +
    observer
    +

    The object that will have selector called whenever the capability is updated

    +
    selector
    +

    The selector on observer that will be called whenever the capability is updated

    +
    +
    +

    Return Value

    +

    Whether or not the subscription succeeded. NO if the connected system doesn’t support capability subscriptions, or if the selector doesn’t support the correct parameters (see above)

    +
    + +

    + -unsubscribeFromCapabilityType:withObserver: +

    + +

    Unsubscribe from a particular capability type. If it was subscribed with a block, the return value should be passed to the observer to unsubscribe the block. If it was subscribed with a selector, the observer object should be passed to unsubscribe the object selector.

    + + + +

    Objective-C

    +
    - (void)unsubscribeFromCapabilityType:(nonnull SDLSystemCapabilityType)type
    +                         withObserver:(nonnull id)observer;
    + + +

    Swift

    +
    func unsubscribe(fromCapabilityType type: SDLSystemCapabilityType, withObserver observer: Any)
    + + + +

    Parameters

    +
    +
    type
    +

    The type of the system capability to unsubscribe from

    +
    observer
    +

    The object that will be unsubscribed. If a block was subscribed, the return value should be passed. If a selector was subscribed, the observer object should be passed.

    +
    +
    diff --git a/docs/Enums.html b/docs/Enums.html index 6db1f98d3..1fddcb2cb 100644 --- a/docs/Enums.html +++ b/docs/Enums.html @@ -18,6 +18,8 @@

    Section Contents

  • SDLLogFlag
  • SDLLogLevel
  • SDLLogFormatType
  • +
  • SDLDynamicMenuUpdatesMode
  • +
  • MenuCellState
  • SDLPermissionGroupType
  • SDLPermissionGroupStatus
  • SDLRPCMessageType
  • @@ -218,7 +220,8 @@

    Objective-C

    SDLChoiceSetManagerErrorPendingPresentationDeleted = -1, SDLChoiceSetManagerErrorDeletionFailed = -2, SDLChoiceSetManagerErrorUploadFailed = -3, - SDLChoiceSetManagerErrorFailedToCreateMenuItems = -4 + SDLChoiceSetManagerErrorFailedToCreateMenuItems = -4, + SDLChoiceSetManagerErrorInvalidState = -5 }
    @@ -367,6 +370,54 @@

    Swift

    +

    + SDLDynamicMenuUpdatesMode +

    + +

    Dynamic Menu Manager Mode

    + +
      +
    • SDLDynamicMenuUpdatesModeForceOn: Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues.
    • +
    • SDLDynamicMenuUpdatesModeForceOn: This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units.
    • +
    • SDLDynamicMenuUpdatesModeForceOff: This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus.
    • +
    + + See more + + +

    Objective-C

    +
    enum SDLDynamicMenuUpdatesMode {}
    + + +

    Swift

    +
    enum SDLDynamicMenuUpdatesMode : UInt
    + + + + +

    + MenuCellState +

    + +

    Undocumented

    + + See more + + +

    Objective-C

    +
    NS_ENUM(NSUInteger, MenuCellState) {
    +    MenuCellStateDelete = 0,
    +    MenuCellStateAdd,
    +    MenuCellStateKeep
    +}
    + + +

    Swift

    +
    enum MenuCellState : UInt
    + + + +

    SDLPermissionGroupType

    diff --git a/docs/Enums/MenuCellState.html b/docs/Enums/MenuCellState.html new file mode 100644 index 000000000..07402562e --- /dev/null +++ b/docs/Enums/MenuCellState.html @@ -0,0 +1,71 @@ +

    MenuCellState Enumeration Reference

    + +

    Section Contents

    + + + +

    Overview

    + +

    Undocumented

    + + +
    +

    + MenuCellStateDelete +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    MenuCellStateDelete = 0
    + + +

    Swift

    +
    case delete = 0
    + + + + +

    + MenuCellStateAdd +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    MenuCellStateAdd
    + + +

    Swift

    +
    case add = 1
    + + + + +

    + MenuCellStateKeep +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    MenuCellStateKeep
    + + +

    Swift

    +
    case keep = 2
    + + + + +
    diff --git a/docs/Enums/SDLChoiceSetManagerError.html b/docs/Enums/SDLChoiceSetManagerError.html index 1b59bb4fb..9fc53824f 100644 --- a/docs/Enums/SDLChoiceSetManagerError.html +++ b/docs/Enums/SDLChoiceSetManagerError.html @@ -7,6 +7,7 @@

    Section Contents

  • SDLChoiceSetManagerErrorDeletionFailed
  • SDLChoiceSetManagerErrorUploadFailed
  • SDLChoiceSetManagerErrorFailedToCreateMenuItems
  • +
  • SDLChoiceSetManagerErrorInvalidState
  • Overview

    @@ -87,4 +88,22 @@

    Swift

    +

    + SDLChoiceSetManagerErrorInvalidState +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    SDLChoiceSetManagerErrorInvalidState = -5
    + + +

    Swift

    +
    case invalidState = -5
    + + + + diff --git a/docs/Enums/SDLDynamicMenuUpdatesMode.html b/docs/Enums/SDLDynamicMenuUpdatesMode.html new file mode 100644 index 000000000..d6343065c --- /dev/null +++ b/docs/Enums/SDLDynamicMenuUpdatesMode.html @@ -0,0 +1,77 @@ +

    SDLDynamicMenuUpdatesMode Enumeration Reference

    + +

    Section Contents

    + + + +

    Overview

    + +

    Dynamic Menu Manager Mode

    + +
      +
    • SDLDynamicMenuUpdatesModeForceOn: Forces on compatibility mode. This will force the menu manager to delete and re-add each menu item for every menu update. This mode is generally not advised due to performance issues.
    • +
    • SDLDynamicMenuUpdatesModeForceOn: This mode forces the menu manager to always dynamically update menu items for each menu update. This will provide the best performance but may cause ordering issues on some SYNC Gen 3 head units.
    • +
    • SDLDynamicMenuUpdatesModeForceOff: This mode checks whether the phone is connected to a SYNC Gen 3 head unit, which has known menu ordering issues. If it is, it will always delete and re-add every menu item, if not, it will dynamically update the menus.
    • +
    + + +
    +

    + SDLDynamicMenuUpdatesModeForceOn +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    SDLDynamicMenuUpdatesModeForceOn = 0
    + + +

    Swift

    +
    case forceOn = 0
    + + + + +

    + SDLDynamicMenuUpdatesModeForceOff +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    SDLDynamicMenuUpdatesModeForceOff
    + + +

    Swift

    +
    case forceOff = 1
    + + + + +

    + SDLDynamicMenuUpdatesModeOnWithCompatibility +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    SDLDynamicMenuUpdatesModeOnWithCompatibility
    + + +

    Swift

    +
    case onWithCompatibility = 2
    + + + + +
    diff --git a/docs/Protocols.html b/docs/Protocols.html index 736adbf69..4810a6f6a 100644 --- a/docs/Protocols.html +++ b/docs/Protocols.html @@ -122,12 +122,30 @@

    Objective-C

    /** Called when a file from the SDLAudioStreamManager could not play - @param audioManager A reference to the audio stream manager + @param audioManager A reference to the audio stream manager @param fileURL The URL that failed @param error The error that occurred */ - (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForFile:(NSURL *)fileURL error:(NSError *)error; +@optional + +/** + Called when a data buffer from the SDLAudioStreamManager finishes playing + + @param audioManager A reference to the audio stream manager + @param successfully Whether or not the data buffer played successfully + */ +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager dataBufferDidFinishPlayingSuccessfully:(BOOL)successfully; + +/** + Called when a data buffer from the SDLAudioStreamManager could not play + + @param audioManager A reference to the audio stream manager + @param error The error that occurred + */ +- (void)audioStreamManager:(SDLAudioStreamManager *)audioManager errorDidOccurForDataBuffer:(NSError *)error; + @end
    diff --git a/docs/Protocols/SDLAudioStreamManagerDelegate.html b/docs/Protocols/SDLAudioStreamManagerDelegate.html index 7d322fbd1..6167c2529 100644 --- a/docs/Protocols/SDLAudioStreamManagerDelegate.html +++ b/docs/Protocols/SDLAudioStreamManagerDelegate.html @@ -5,6 +5,8 @@

    Section Contents

    Overview

    @@ -71,4 +73,56 @@

    Parameters

    The error that occurred

    +

    + -audioStreamManager:dataBufferDidFinishPlayingSuccessfully: +

    + +

    Called when a data buffer from the SDLAudioStreamManager finishes playing

    + + + +

    Objective-C

    +
    - (void)audioStreamManager:(nonnull SDLAudioStreamManager *)audioManager
    +    dataBufferDidFinishPlayingSuccessfully:(BOOL)successfully;
    + + +

    Swift

    +
    optional func audioStreamManager(_ audioManager: SDLAudioStreamManager, dataBufferDidFinishPlayingSuccessfully successfully: Bool)
    + + + +

    Parameters

    +
    +
    audioManager
    +

    A reference to the audio stream manager

    +
    successfully
    +

    Whether or not the data buffer played successfully

    +
    + +

    + -audioStreamManager:errorDidOccurForDataBuffer: +

    + +

    Called when a data buffer from the SDLAudioStreamManager could not play

    + + + +

    Objective-C

    +
    - (void)audioStreamManager:(nonnull SDLAudioStreamManager *)audioManager
    +    errorDidOccurForDataBuffer:(nonnull NSError *)error;
    + + +

    Swift

    +
    optional func audioStreamManager(_ audioManager: SDLAudioStreamManager, errorDidOccurForDataBuffer error: Error)
    + + + +

    Parameters

    +
    +
    audioManager
    +

    A reference to the audio stream manager

    +
    error
    +

    The error that occurred

    +
    + diff --git a/docs/Type Definitions.html b/docs/Type Definitions.html index 42e8e44f9..a72dd7e72 100644 --- a/docs/Type Definitions.html +++ b/docs/Type Definitions.html @@ -67,6 +67,7 @@

    Section Contents

  • SDLLogFilterBlock
  • SDLMaintenanceModeStatus
  • SDLManagerReadyBlock
  • +
  • SDLRPCUpdatedBlock
  • SDLMassageCushion
  • SDLMassageMode
  • SDLMassageZone
  • @@ -115,6 +116,7 @@

    Section Contents

  • SDLSupportedSeat
  • SDLSystemAction
  • SDLUpdateCapabilityHandler
  • +
  • SDLCapabilityUpdateHandler
  • SDLSystemCapabilityType
  • SDLSystemContext
  • SDLTBTState
  • @@ -1504,6 +1506,24 @@

    Swift

    +

    + SDLRPCUpdatedBlock +

    + +

    Undocumented

    + + + +

    Objective-C

    +
    typedef void (^SDLRPCUpdatedBlock) (__kindof SDLRPCMessage *message)
    + + +

    Swift

    +
    typealias SDLRPCUpdatedBlock = (SDLRPCMessage) -> Void
    + + + +

    SDLMassageCushion

    @@ -2486,6 +2506,29 @@

    Parameters

    The system capability manager

    +

    + SDLCapabilityUpdateHandler +

    + +

    An observer block for whenever a subscription is called.

    + + + +

    Objective-C

    +
    typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *_Nonnull)
    + + +

    Swift

    +
    typealias SDLCapabilityUpdateHandler = (SDLSystemCapability) -> Void
    + + + +

    Parameters

    +
    +
    capability
    +

    The capability that was updated.

    +
    +

    SDLSystemCapabilityType

    diff --git a/docs/index.html b/docs/index.html index 8da8467dc..953e7f084 100644 --- a/docs/index.html +++ b/docs/index.html @@ -40,6 +40,8 @@ url: Classes/SDLAudioControlCapabilities.html - name: SDLAudioControlData url: Classes/SDLAudioControlData.html + - name: SDLAudioFile + url: Classes/SDLAudioFile.html - name: SDLAudioPassThruCapabilities url: Classes/SDLAudioPassThruCapabilities.html - name: SDLAudioStreamManager @@ -2856,6 +2858,8 @@ url: Constants.html#/c:@SmartDeviceLinkVersionString - name: Enumerations sub_nav: + - name: MenuCellState + url: Enums/MenuCellState.html - name: SDLArtworkImageFormat url: Enums/SDLArtworkImageFormat.html - name: SDLAudioStreamManagerError @@ -2866,6 +2870,8 @@ url: Enums/SDLChoiceSetLayout.html - name: SDLChoiceSetManagerError url: Enums/SDLChoiceSetManagerError.html + - name: SDLDynamicMenuUpdatesMode + url: Enums/SDLDynamicMenuUpdatesMode.html - name: SDLFileManagerError url: Enums/SDLFileManagerError.html - name: SDLLogBytesDirection @@ -2954,6 +2960,8 @@ url: Type Definitions.html#/c:SDLButtonName.h@T@SDLButtonName - name: SDLButtonPressMode url: Type Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode + - name: SDLCapabilityUpdateHandler + url: Type Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateHandler - name: SDLCarModeStatus url: Type Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus - name: SDLCharacterSet @@ -3118,6 +3126,8 @@ url: Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler - name: SDLRPCFunctionName url: Type Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName + - name: SDLRPCUpdatedBlock + url: Type Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock - name: SDLRadioBand url: Type Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand - name: SDLRadioState diff --git a/docs/search.json b/docs/search.json index f7b9e8674..00470b67e 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Type Definitions/SDLTouchIdentifier/.html#/c:@EA@SDLTouchIdentifier@SDLTouchIdentifierFirstFinger":{"name":"SDLTouchIdentifierFirstFinger","abstract":"

    Undocumented

    "},"Type Definitions/SDLTouchIdentifier/.html#/c:@EA@SDLTouchIdentifier@SDLTouchIdentifierSecondFinger":{"name":"SDLTouchIdentifierSecondFinger","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus":{"name":"SDLAmbientLightStatus","abstract":"

    Reflects the status of the ambient light sensor for headlamps

    "},"Type Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType":{"name":"SDLAppHMIType","abstract":"

    Enumeration listing possible app hmi types.

    "},"Type Definitions.html#/c:SDLAppInterfaceUnregisteredReason.h@T@SDLAppInterfaceUnregisteredReason":{"name":"SDLAppInterfaceUnregisteredReason","abstract":"

    Indicates reason why app interface was unregistered. The application is being disconnected by SDL.

    "},"Type Definitions.html#/c:SDLAppServiceType.h@T@SDLAppServiceType":{"name":"SDLAppServiceType","abstract":"

    Enumeration listing possible app service types.

    "},"Type Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator":{"name":"SDLAudioStreamingIndicator","abstract":"

    Enumeration listing possible indicators of audio streaming changes

    "},"Type Definitions.html#/c:SDLAudioStreamingState.h@T@SDLAudioStreamingState":{"name":"SDLAudioStreamingState","abstract":"

    Describes whether or not streaming audio is currently audible to the user. Though provided in every OnHMIStatus notification, this information is only relevant for applications that declare themselves as media apps in RegisterAppInterface

    "},"Type Definitions.html#/c:SDLAudioType.h@T@SDLAudioType":{"name":"SDLAudioType","abstract":"

    Describes different audio type options for PerformAudioPassThru

    "},"Type Definitions.html#/c:SDLBitsPerSample.h@T@SDLBitsPerSample":{"name":"SDLBitsPerSample","abstract":"

    Describes different bit depth options for PerformAudioPassThru

    "},"Type Definitions.html#/c:SDLButtonEventMode.h@T@SDLButtonEventMode":{"name":"SDLButtonEventMode","abstract":"

    Indicates whether the button was depressed or released. A BUTTONUP event will always be preceded by a BUTTONDOWN event.

    "},"Type Definitions.html#/c:SDLButtonName.h@T@SDLButtonName":{"name":"SDLButtonName","abstract":"

    Defines logical buttons which, on a given SDL unit, would correspond to either physical or soft (touchscreen) buttons. These logical buttons present a standard functional abstraction which the developer can rely upon, independent of the SDL unit. For example, the developer can rely upon the OK button having the same meaning to the user across SDL platforms.

    "},"Type Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode":{"name":"SDLButtonPressMode","abstract":"

    Indicates whether this is a LONG or SHORT button press

    "},"Type Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus":{"name":"SDLCarModeStatus","abstract":"

    Describes the carmode the vehicle is in. Used in ClusterModeStatus

    "},"Type Definitions.html#/c:SDLCharacterSet.h@T@SDLCharacterSet":{"name":"SDLCharacterSet","abstract":"

    Character sets supported by SDL. Used to describe text field capabilities.

    "},"Type Definitions.html#/c:SDLCompassDirection.h@T@SDLCompassDirection":{"name":"SDLCompassDirection","abstract":"

    The list of potential compass directions. Used in GPS data

    "},"Type Definitions.html#/c:SDLComponentVolumeStatus.h@T@SDLComponentVolumeStatus":{"name":"SDLComponentVolumeStatus","abstract":"

    The volume status of a vehicle component. Used in SingleTireStatus and VehicleData Fuel Level

    "},"Type Definitions.html#/c:SDLDefrostZone.h@T@SDLDefrostZone":{"name":"SDLDefrostZone","abstract":"

    Enumeration listing possible defrost zones. Used in ClimateControlCapabilities and Data.

    "},"Type Definitions.html#/c:SDLDeliveryMode.h@T@SDLDeliveryMode":{"name":"SDLDeliveryMode","abstract":"

    Specifies the mode in which the sendLocation request is sent. Used in SendLocation.

    "},"Type Definitions.html#/c:SDLDeviceLevelStatus.h@T@SDLDeviceLevelStatus":{"name":"SDLDeviceLevelStatus","abstract":"

    Reflects the reported battery status of the connected device, if reported. Used in DeviceStatus.

    "},"Type Definitions.html#/c:SDLDimension.h@T@SDLDimension":{"name":"SDLDimension","abstract":"

    The supported dimensions of the GPS. Used in GPSData

    "},"Type Definitions.html#/c:SDLDirection.h@T@SDLDirection":{"name":"SDLDirection","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLDisplayMode.h@T@SDLDisplayMode":{"name":"SDLDisplayMode","abstract":"

    Identifies the various display types used by SDL.

    "},"Type Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType":{"name":"SDLDisplayType","abstract":"

    Identifies the various display types used by SDL. Used in DisplayCapabilities.

    "},"Type Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit":{"name":"SDLDistanceUnit","abstract":"

    Wiper Status

    "},"Type Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState":{"name":"SDLDriverDistractionState","abstract":"

    Enumeration that describes possible states of driver distraction. Used in OnDriverDistraction.

    "},"Type Definitions.html#/c:SDLECallConfirmationStatus.h@T@SDLECallConfirmationStatus":{"name":"SDLECallConfirmationStatus","abstract":"

    Reflects the status of the eCall Notification. Used in ECallInfo

    "},"Type Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus":{"name":"SDLElectronicParkBrakeStatus","abstract":"

    Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.

    "},"Type Definitions.html#/c:SDLEmergencyEventType.h@T@SDLEmergencyEventType":{"name":"SDLEmergencyEventType","abstract":"

    Reflects the emergency event status of the vehicle. Used in EmergencyEvent

    "},"Type Definitions.html#/c:SDLEnum.h@T@SDLEnum":{"name":"SDLEnum","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler":{"name":"SDLFileManagerStartupCompletionHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileName":{"name":"SDLFileName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler":{"name":"SDLFileManagerUploadCompletionHandler","abstract":"

    A completion handler called after a response from Core to a upload request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler":{"name":"SDLFileManagerMultiUploadCompletionHandler","abstract":"

    A completion handler called after a set of upload requests has completed.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler":{"name":"SDLFileManagerMultiUploadProgressHandler","abstract":"

    In a multiple request send, a handler called after each response from Core to a upload request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler":{"name":"SDLFileManagerDeleteCompletionHandler","abstract":"

    A completion handler called after a response from Core to a delete request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler":{"name":"SDLFileManagerMultiDeleteCompletionHandler","abstract":"

    A completion handler called after a set of delete requests has completed.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler":{"name":"SDLFileManagerListFilesCompletionHandler","abstract":"

    A completion handler called after response from Core to a list files request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler":{"name":"SDLFileManagerUploadArtworkCompletionHandler","abstract":"

    A completion handler called after a response from Core to a artwork upload request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler":{"name":"SDLFileManagerMultiUploadArtworkCompletionHandler","abstract":"

    A completion handler called after a set of upload artwork requests has completed.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler":{"name":"SDLFileManagerMultiUploadArtworkProgressHandler","abstract":"

    In a multiple request send, a handler called after each response from Core to an artwork upload request.

    "},"Type Definitions.html#/c:SDLFileType.h@T@SDLFileType":{"name":"SDLFileType","abstract":"

    Enumeration listing possible file types. Used in SDLFile, PutFile, ImageField, OnSystemRequest

    "},"Type Definitions.html#/c:SDLFuelCutoffStatus.h@T@SDLFuelCutoffStatus":{"name":"SDLFuelCutoffStatus","abstract":"

    Reflects the status of the Restraints Control Module fuel pump cutoff. The fuel pump is cut off typically after the vehicle has had a collision. Used in EmergencyEvent.

    "},"Type Definitions.html#/c:SDLFuelType.h@T@SDLFuelType":{"name":"SDLFuelType","abstract":"

    Enumeration listing possible fuel types.

    "},"Type Definitions.html#/c:SDLGlobalProperty.h@T@SDLGlobalProperty":{"name":"SDLGlobalProperty","abstract":"

    Properties of a user-initiated VR interaction (i.e. interactions started by the user pressing the PTT button). Used in RPCs related to ResetGlobalProperties

    "},"Type Definitions.html#/c:SDLHMILevel.h@T@SDLHMILevel":{"name":"SDLHMILevel","abstract":"

    Specifies current level of the HMI. An HMI level indicates the degree of user interaction possible through the HMI (e.g. TTS only, display only, VR, etc.). The HMI level varies for an application based on the type of display (i.e. Nav or non-Nav) and the user directing focus to other applications (e.g. phone, other mobile applications, etc.). Used in OnHMIStatus

    "},"Type Definitions.html#/c:SDLHMIZoneCapabilities.h@T@SDLHMIZoneCapabilities":{"name":"SDLHMIZoneCapabilities","abstract":"

    Specifies HMI Zones in the vehicle. Used in RegisterAppInterfaceResponse

    "},"Type Definitions.html#/c:SDLHybridAppPreference.h@T@SDLHybridAppPreference":{"name":"SDLHybridAppPreference","abstract":"

    Enumeration for the user’s preference of which app type to use when both are available.

    "},"Type Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus":{"name":"SDLIgnitionStableStatus","abstract":"

    Reflects the ignition switch stability. Used in BodyInformation

    "},"Type Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus":{"name":"SDLIgnitionStatus","abstract":"

    Reflects the status of ignition. Used in BodyInformation.

    "},"Type Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName":{"name":"SDLImageFieldName","abstract":"

    The name that identifies the filed. Used in DisplayCapabilities.

    "},"Type Definitions.html#/c:SDLImageType.h@T@SDLImageType":{"name":"SDLImageType","abstract":"

    Contains information about the type of image. Used in Image.

    "},"Type Definitions.html#/c:SDLInteractionMode.h@T@SDLInteractionMode":{"name":"SDLInteractionMode","abstract":"

    For application-initiated interactions (SDLPerformInteraction), this specifies the mode by which the user is prompted and by which the user’s selection is indicated. Used in PerformInteraction.

    "},"Type Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutocompleteCompletionHandler":{"name":"SDLKeyboardAutocompleteCompletionHandler","abstract":"

    This handler is called when you wish to update your autocomplete text in response to the user’s input

    "},"Type Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler":{"name":"SDLKeyboardCharacterSetCompletionHandler","abstract":"

    This handler is called when you wish to update your keyboard’s limitedCharacterSet in response to the user’s input

    "},"Type Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent":{"name":"SDLKeyboardEvent","abstract":"

    Enumeration listing possible keyboard events. Used in OnKeyboardInput.

    "},"Type Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout":{"name":"SDLKeyboardLayout","abstract":"

    Enumeration listing possible keyboard layouts. Used in KeyboardProperties.

    "},"Type Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode":{"name":"SDLKeypressMode","abstract":"

    Enumeration listing possible keyboard events.

    "},"Type Definitions.html#/c:SDLLanguage.h@T@SDLLanguage":{"name":"SDLLanguage","abstract":"

    Specifies the language to be used for TTS, VR, displayed messages/menus. Used in ChangeRegistration and RegisterAppInterface.

    "},"Type Definitions.html#/c:SDLLayoutMode.h@T@SDLLayoutMode":{"name":"SDLLayoutMode","abstract":"

    For touchscreen interactions, the mode of how the choices are presented. Used in PerformInteraction.

    "},"Type Definitions.html#/c:SDLLightName.h@T@SDLLightName":{"name":"SDLLightName","abstract":"

    The name that identifies the Light

    "},"Type Definitions.html#/c:SDLLightStatus.h@T@SDLLightStatus":{"name":"SDLLightStatus","abstract":"

    Reflects the status of Light.

    "},"Type Definitions.html#/c:SDLLockScreenStatus.h@T@SDLLockScreenStatus":{"name":"SDLLockScreenStatus","abstract":"

    Describes what the status of the lock screen should be

    "},"Type Definitions.html#/c:SDLLogConstants.h@T@SDLLogFilterBlock":{"name":"SDLLogFilterBlock","abstract":"

    A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.

    "},"Type Definitions.html#/c:SDLMaintenanceModeStatus.h@T@SDLMaintenanceModeStatus":{"name":"SDLMaintenanceModeStatus","abstract":"

    Describes the maintenence mode. Used in nothing.

    "},"Type Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock":{"name":"SDLManagerReadyBlock","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLMassageCushion.h@T@SDLMassageCushion":{"name":"SDLMassageCushion","abstract":"

    The List possible cushions of a multi-contour massage seat.

    "},"Type Definitions.html#/c:SDLMassageMode.h@T@SDLMassageMode":{"name":"SDLMassageMode","abstract":"

    The List possible modes of a massage zone.

    "},"Type Definitions.html#/c:SDLMassageZone.h@T@SDLMassageZone":{"name":"SDLMassageZone","abstract":"

    List possible zones of a multi-contour massage seat.

    "},"Type Definitions.html#/c:SDLMediaClockFormat.h@T@SDLMediaClockFormat":{"name":"SDLMediaClockFormat","abstract":"

    Indicates the format of the time displayed on the connected SDL unit.

    "},"Type Definitions.html#/c:SDLMediaType.h@T@SDLMediaType":{"name":"SDLMediaType","abstract":"

    Enumeration listing possible media types.

    "},"Type Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler":{"name":"SDLMenuCellSelectionHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLMetadataType.h@T@SDLMetadataType":{"name":"SDLMetadataType","abstract":"

    Text Field metadata types. Used in Show.

    "},"Type Definitions.html#/c:SDLModuleType.h@T@SDLModuleType":{"name":"SDLModuleType","abstract":"

    The type of remote control data. Used in ButtonPress, GetInteriorVehicleData, and ModuleData

    "},"Type Definitions.html#/c:SDLNavigationAction.h@T@SDLNavigationAction":{"name":"SDLNavigationAction","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNavigationJunction.h@T@SDLNavigationJunction":{"name":"SDLNavigationJunction","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName":{"name":"SDLNotificationName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey":{"name":"SDLNotificationUserInfoKey","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLAudioPassThruHandler":{"name":"SDLAudioPassThruHandler","abstract":"

    A handler used on SDLPerformAudioPassThru.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler":{"name":"SDLResponseHandler","abstract":"

    A handler used on all RPC requests which fires when the response is received.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler":{"name":"SDLMultipleRequestCompletionHandler","abstract":"

    A completion handler called after a sequential or simultaneous set of requests have completed sending.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler":{"name":"SDLMultipleSequentialRequestProgressHandler","abstract":"

    A handler called after each response to a request comes in in a multiple request send.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler":{"name":"SDLMultipleAsyncRequestProgressHandler","abstract":"

    A handler called after each response to a request comes in in a multiple request send.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCButtonNotificationHandler":{"name":"SDLRPCButtonNotificationHandler","abstract":"

    A handler that may optionally be run when an SDLSubscribeButton or SDLSoftButton has a corresponding notification occur.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler":{"name":"SDLRPCCommandNotificationHandler","abstract":"

    A handler that may optionally be run when an SDLAddCommand has a corresponding notification occur.

    "},"Type Definitions.html#/c:SDLPRNDL.h@T@SDLPRNDL":{"name":"SDLPRNDL","abstract":"

    The selected gear the car is in. Used in retrieving vehicle data.

    "},"Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName":{"name":"SDLPermissionRPCName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier":{"name":"SDLPermissionObserverIdentifier","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler":{"name":"SDLPermissionsChangedHandler","abstract":"

    The PermissionObserver is a block that is passed in to some methods that will be stored and called when specified permissions change.

    "},"Type Definitions.html#/c:SDLPermissionStatus.h@T@SDLPermissionStatus":{"name":"SDLPermissionStatus","abstract":"

    Enumeration that describes possible permission states of a policy table entry. Used in nothing.

    "},"Type Definitions.html#/c:SDLPowerModeQualificationStatus.h@T@SDLPowerModeQualificationStatus":{"name":"SDLPowerModeQualificationStatus","abstract":"

    Describes the power mode qualification status. Used in ClusterModeStatus.

    "},"Type Definitions.html#/c:SDLPowerModeStatus.h@T@SDLPowerModeStatus":{"name":"SDLPowerModeStatus","abstract":"

    The status of the car’s power. Used in ClusterModeStatus.

    "},"Type Definitions.html#/c:SDLPredefinedLayout.h@T@SDLPredefinedLayout":{"name":"SDLPredefinedLayout","abstract":"

    A template layout an app uses to display information. The broad details of the layout are defined, but the details depend on the IVI system. Used in SetDisplayLayout.

    "},"Type Definitions.html#/c:SDLPrerecordedSpeech.h@T@SDLPrerecordedSpeech":{"name":"SDLPrerecordedSpeech","abstract":"

    Contains information about the speech capabilities on the SDL platform. Used in RegisterAppInterfaceResponse to indicate capability.

    "},"Type Definitions.html#/c:SDLPrimaryAudioSource.h@T@SDLPrimaryAudioSource":{"name":"SDLPrimaryAudioSource","abstract":"

    Reflects the current primary audio source of SDL (if selected). Used in DeviceStatus.

    "},"Type Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName":{"name":"SDLRPCFunctionName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand":{"name":"SDLRadioBand","abstract":"

    Radio bands, such as AM and FM, used in RadioControlData

    "},"Type Definitions.html#/c:SDLRadioState.h@T@SDLRadioState":{"name":"SDLRadioState","abstract":"

    List possible states of a remote control radio module. Used in RadioControlData.

    "},"Type Definitions.html#/c:SDLRequestType.h@T@SDLRequestType":{"name":"SDLRequestType","abstract":"

    A type of system request. Used in SystemRequest.

    "},"Type Definitions.html#/c:SDLResult.h@T@SDLResult":{"name":"SDLResult","abstract":"

    Defines the possible result codes returned by SDL to the application in a response to a requested operation. Used in RPC responses

    "},"Type Definitions.html#/c:SDLSamplingRate.h@T@SDLSamplingRate":{"name":"SDLSamplingRate","abstract":"

    Describes different sampling rates for PerformAudioPassThru and AudioPassThruCapabilities

    "},"Type Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler":{"name":"SDLScreenManagerUpdateCompletionHandler","abstract":"

    The handler run when the update has completed

    "},"Type Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler":{"name":"SDLPreloadChoiceCompletionHandler","abstract":"

    Return an error with userinfo [key: SDLChoiceCell, value: NSError] if choices failed to upload

    "},"Type Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType":{"name":"SDLSeatMemoryActionType","abstract":"

    List of possible actions on Seat Meomry

    "},"Type Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason":{"name":"SDLServiceUpdateReason","abstract":"

    Enumeration listing possible service update reasons.

    "},"Type Definitions.html#/c:SDLSoftButtonType.h@T@SDLSoftButtonType":{"name":"SDLSoftButtonType","abstract":"

    SoftButtonType (TEXT / IMAGE / BOTH). Used by SoftButton.

    "},"Type Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities":{"name":"SDLSpeechCapabilities","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName":{"name":"SDLStaticIconName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLVideoStreamManagerState":{"name":"SDLVideoStreamManagerState","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAudioStreamManagerState":{"name":"SDLAudioStreamManagerState","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAppState":{"name":"SDLAppState","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat":{"name":"SDLSupportedSeat","abstract":"

    List possible seats that is a remote controllable seat.

    "},"Type Definitions.html#/c:SDLSystemAction.h@T@SDLSystemAction":{"name":"SDLSystemAction","abstract":"

    Enumeration that describes system actions that can be triggered. Used in SoftButton.

    "},"Type Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler":{"name":"SDLUpdateCapabilityHandler","abstract":"

    A completion handler called after a request for the capability type is returned from the remote system.

    "},"Type Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType":{"name":"SDLSystemCapabilityType","abstract":"

    The type of system capability to get more information on. Used in GetSystemCapability.

    "},"Type Definitions.html#/c:SDLSystemContext.h@T@SDLSystemContext":{"name":"SDLSystemContext","abstract":"

    Indicates whether or not a user-initiated interaction is in progress, and if so, in what mode (i.e. MENU or VR). Used in OnHMIStatus

    "},"Type Definitions.html#/c:SDLTBTState.h@T@SDLTBTState":{"name":"SDLTBTState","abstract":"

    The turn-by-turn state, used in OnTBTClientState.

    "},"Type Definitions.html#/c:SDLTPMS.h@T@SDLTPMS":{"name":"SDLTPMS","abstract":"

    An enum representing values of the tire pressure monitoring system

    "},"Type Definitions.html#/c:SDLTemperatureUnit.h@T@SDLTemperatureUnit":{"name":"SDLTemperatureUnit","abstract":"

    The unit of temperature to display. Used in Temperature.

    "},"Type Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment":{"name":"SDLTextAlignment","abstract":"

    The list of possible alignments of text in a field. May only work on some display types. used in Show.

    "},"Type Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName":{"name":"SDLTextFieldName","abstract":"

    Names of the text fields that can appear on a SDL display. Used in TextFieldName.

    "},"Type Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode":{"name":"SDLTimerMode","abstract":"

    The direction of a timer. Used in nothing.

    "},"Type Definitions/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler":{"name":"SDLTouchEventHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLTouchType.h@T@SDLTouchType":{"name":"SDLTouchType","abstract":"

    The type of a touch in a projection application. Used in OnTouchEvent.

    "},"Type Definitions.html#/c:SDLTriggerSource.h@T@SDLTriggerSource":{"name":"SDLTriggerSource","abstract":"

    Indicates whether choice/command was selected via VR or via a menu selection (using SEEKRIGHT/SEEKLEFT, TUNEUP, TUNEDOWN, OK buttons). Used in PerformInteractionResponse and OnCommand.

    "},"Type Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal":{"name":"SDLTurnSignal","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode":{"name":"SDLUpdateMode","abstract":"

    Specifies what function should be performed on the media clock/counter. Used in SetMediaClockTimer.

    "},"Type Definitions.html#/c:SDLVehicleDataActiveStatus.h@T@SDLVehicleDataActiveStatus":{"name":"SDLVehicleDataActiveStatus","abstract":"

    Vehicle Data Activity Status. Used in nothing.

    "},"Type Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus":{"name":"SDLVehicleDataEventStatus","abstract":"

    Reflects the status of a vehicle data event; e.g. a seat belt event status. Used in retrieving vehicle data.

    "},"Type Definitions.html#/c:SDLVehicleDataNotificationStatus.h@T@SDLVehicleDataNotificationStatus":{"name":"SDLVehicleDataNotificationStatus","abstract":"

    Reflects the status of a vehicle data notification. Used in ECallInfo

    "},"Type Definitions.html#/c:SDLVehicleDataResultCode.h@T@SDLVehicleDataResultCode":{"name":"SDLVehicleDataResultCode","abstract":"

    Vehicle Data Result Code. Used in DIDResult.

    "},"Type Definitions.html#/c:SDLVehicleDataStatus.h@T@SDLVehicleDataStatus":{"name":"SDLVehicleDataStatus","abstract":"

    Reflects the status of a binary vehicle data item. Used in MyKey.

    "},"Type Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType":{"name":"SDLVehicleDataType","abstract":"

    Defines the vehicle data types that can be published and/or subscribed to using SDLSubscribeVehicleData. Used in VehicleDataResult

    "},"Type Definitions.html#/c:SDLVentilationMode.h@T@SDLVentilationMode":{"name":"SDLVentilationMode","abstract":"

    The ventilation mode. Used in ClimateControlCapabilities

    "},"Type Definitions.html#/c:SDLVideoStreamingCodec.h@T@SDLVideoStreamingCodec":{"name":"SDLVideoStreamingCodec","abstract":"

    Enum for each type of video streaming codec. Used in VideoStreamingFormat.

    "},"Type Definitions.html#/c:SDLVideoStreamingProtocol.h@T@SDLVideoStreamingProtocol":{"name":"SDLVideoStreamingProtocol","abstract":"

    Enum for each type of video streaming protocol, used in VideoStreamingFormat

    "},"Type Definitions.html#/c:SDLVideoStreamingState.h@T@SDLVideoStreamingState":{"name":"SDLVideoStreamingState","abstract":"

    Enum for each type of video streaming protocol, used in VideoStreamingFormat

    "},"Type Definitions.html#/c:SDLVoiceCommand.h@T@SDLVoiceCommandSelectionHandler":{"name":"SDLVoiceCommandSelectionHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLVrCapabilities.h@T@SDLVRCapabilities":{"name":"SDLVRCapabilities","abstract":"

    The VR capabilities of the connected SDL platform. Used in RegisterAppInterfaceResponse.

    "},"Type Definitions.html#/c:SDLWarningLightStatus.h@T@SDLWarningLightStatus":{"name":"SDLWarningLightStatus","abstract":"

    Reflects the status of a cluster instrument warning light. Used in TireStatus

    "},"Type Definitions.html#/c:SDLWayPointType.h@T@SDLWayPointType":{"name":"SDLWayPointType","abstract":"

    The type of a navigation waypoint. Used in GetWayPoints.

    "},"Type Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus":{"name":"SDLWiperStatus","abstract":"

    The status of the windshield wipers. Used in retrieving vehicle data.

    "},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveSingleTapForView:atPoint:":{"name":"-touchManager:didReceiveSingleTapForView:atPoint:","abstract":"

    A single tap was received

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveDoubleTapForView:atPoint:":{"name":"-touchManager:didReceiveDoubleTapForView:atPoint:","abstract":"

    A double tap was received

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidStartInView:atPoint:":{"name":"-touchManager:panningDidStartInView:atPoint:","abstract":"

    Panning started

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePanningFromPoint:toPoint:":{"name":"-touchManager:didReceivePanningFromPoint:toPoint:","abstract":"

    Panning moved between points

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidEndInView:atPoint:":{"name":"-touchManager:panningDidEndInView:atPoint:","abstract":"

    Panning ended

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningCanceledAtPoint:":{"name":"-touchManager:panningCanceledAtPoint:","abstract":"

    Panning canceled

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidStartInView:atCenterPoint:":{"name":"-touchManager:pinchDidStartInView:atCenterPoint:","abstract":"

    Pinch did start

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchAtCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchAtCenterPoint:withScale:","abstract":"

    @abstract","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchInView:atCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchInView:atCenterPoint:withScale:","abstract":"

    Pinch moved and changed scale

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidEndInView:atCenterPoint:":{"name":"-touchManager:pinchDidEndInView:atCenterPoint:","abstract":"

    Pinch did end

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchCanceledAtCenterPoint:":{"name":"-touchManager:pinchCanceledAtCenterPoint:","abstract":"

    Pinch canceled

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)preferredVideoFormatOrderFromHeadUnitPreferredOrder:":{"name":"-preferredVideoFormatOrderFromHeadUnitPreferredOrder:","abstract":"

    Implement to return a different preferred order of attempted format usage than the head unit’s preferred order. In nearly all cases, it’s best to simply return the head unit’s preferred order, or not implement this method (which does the same thing).

    ","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)resolutionFromHeadUnitPreferredResolution:":{"name":"-resolutionFromHeadUnitPreferredResolution:","abstract":"

    Implement to return a different resolution to use for video streaming than the head unit’s requested resolution. If you return a resolution that the head unit does not like, the manager will fail to start up. In nearly all cases, it’s best to simply return the head unit’s preferred order, or not implement this method (which does the same thing), and adapt your UI to the head unit’s preferred resolution instead.

    ","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(py)audioConnected":{"name":"audioConnected","abstract":"

    Whether or not the audio byte stream is currently connected

    ","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"

    Send audio data bytes over the audio byte stream

    ","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(py)appId":{"name":"appId","abstract":"

    The app id of the app

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)initializeWithAppId:completionHandler:":{"name":"-initializeWithAppId:completionHandler:","abstract":"

    Initialize the SDL security library with the app’s id and a completion handler

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)stop":{"name":"-stop","abstract":"

    Stop the security library

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)runHandshakeWithClientData:error:":{"name":"-runHandshakeWithClientData:error:","abstract":"

    Run the SSL/TLS handshake

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)encryptData:withError:":{"name":"-encryptData:withError:","abstract":"

    Encrypt data using SSL/TLS

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)decryptData:withError:":{"name":"-decryptData:withError:","abstract":"

    Decrypt data using SSL/TLS

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(cm)availableMakes":{"name":"+availableMakes","abstract":"

    The vehicle makes this security library covers

    ","parent_name":"SDLSecurityType"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerDidDisconnect":{"name":"-managerDidDisconnect","abstract":"

    Called upon a disconnection from the remote system.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)hmiLevel:didChangeToLevel:":{"name":"-hmiLevel:didChangeToLevel:","abstract":"

    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.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)audioStreamingState:didChangeToState:":{"name":"-audioStreamingState:didChangeToState:","abstract":"

    Called when the audio streaming state of this application changes on the remote system. This refers to when streaming audio is audible to the user.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)systemContext:didChangeToContext:":{"name":"-systemContext:didChangeToContext:","abstract":"

    Called when the system context of this application changes on the remote system. This refers to whether or not a user-initiated interaction is in progress, and if so, what it is.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerShouldUpdateLifecycleToLanguage:":{"name":"-managerShouldUpdateLifecycleToLanguage:","abstract":"

    Called when the lifecycle manager detected a language mismatch. In case of a language mismatch the manager should change the apps registration by updating the lifecycle configuration to the specified language. If the app can support the specified language it should return an Object of SDLLifecycleConfigurationUpdate, otherwise it should return nil to indicate that the language is not supported.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(cm)logger":{"name":"+logger","abstract":"

    A simple convenience initializer to create the object. This should not start up the logger.

    ","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)setupLogger":{"name":"-setupLogger","abstract":"

    A call to setup the logger in whatever manner it needs to do so.

    ","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)logWithLog:formattedLog:":{"name":"-logWithLog:formattedLog:","abstract":"

    Log a particular log using the model and the formatted log message to the target.

    ","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)teardownLogger":{"name":"-teardownLogger","abstract":"

    The log target should be torn down. e.g. file handles should be closed

    ","parent_name":"SDLLogTarget"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)userDidSubmitInput:withEvent:":{"name":"-userDidSubmitInput:withEvent:","abstract":"

    The keyboard session completed with some input.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidAbortWithReason:":{"name":"-keyboardDidAbortWithReason:","abstract":"

    The keyboard session aborted.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)customKeyboardConfiguration":{"name":"-customKeyboardConfiguration","abstract":"

    Implement this in order to provide a custom keyboard configuration to just this keyboard. To apply default settings to all keyboards, see SDLScreenManager.keyboardConfiguration

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateAutocompleteWithInput:completionHandler:":{"name":"-updateAutocompleteWithInput:completionHandler:","abstract":"

    Implement this if you wish to update the KeyboardProperties.autoCompleteText as the user updates their input. This is called upon a KEYPRESS event.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateCharacterSetWithInput:completionHandler:":{"name":"-updateCharacterSetWithInput:completionHandler:","abstract":"

    Implement this if you wish to update the limitedCharacterSet as the user updates their input. This is called upon a KEYPRESS event.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidSendEvent:text:":{"name":"-keyboardDidSendEvent:text:","abstract":"

    Implement this to be notified of all events occurring on the keyboard

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didSelectChoice:withSource:atRowIndex:":{"name":"-choiceSet:didSelectChoice:withSource:atRowIndex:","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didReceiveError:":{"name":"-choiceSet:didReceiveError:","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:fileDidFinishPlaying:successfully:":{"name":"-audioStreamManager:fileDidFinishPlaying:successfully:","abstract":"

    Called when a file from the SDLAudioStreamManager finishes playing

    ","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForFile:error:":{"name":"-audioStreamManager:errorDidOccurForFile:error:","abstract":"

    Called when a file from the SDLAudioStreamManager could not play

    ","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols.html#/c:objc(pl)SDLInt":{"name":"SDLInt","abstract":"

    A declaration that this NSNumber contains an NSInteger.

    "},"Protocols.html#/c:objc(pl)SDLUInt":{"name":"SDLUInt","abstract":"

    A declaration that this NSNumber contains an NSUInteger.

    "},"Protocols.html#/c:objc(pl)SDLBool":{"name":"SDLBool","abstract":"

    A declaration that this NSNumber contains a BOOL.

    "},"Protocols.html#/c:objc(pl)SDLFloat":{"name":"SDLFloat","abstract":"

    A declaration that this NSNumber contains a float.

    "},"Protocols/SDLAudioStreamManagerDelegate.html":{"name":"SDLAudioStreamManagerDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLChoiceSetDelegate.html":{"name":"SDLChoiceSetDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLKeyboardDelegate.html":{"name":"SDLKeyboardDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLLogTarget.html":{"name":"SDLLogTarget","abstract":"

    A protocol describing a place logs from SDLLogManager are logged to

    "},"Protocols/SDLManagerDelegate.html":{"name":"SDLManagerDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLSecurityType.html":{"name":"SDLSecurityType","abstract":"

    A protocol used by SDL Security libraries.

    "},"Protocols/SDLStreamingAudioManagerType.html":{"name":"SDLStreamingAudioManagerType","abstract":"

    Undocumented

    "},"Protocols/SDLStreamingMediaManagerDataSource.html":{"name":"SDLStreamingMediaManagerDataSource","abstract":"

    Undocumented

    "},"Protocols/SDLTouchManagerDelegate.html":{"name":"SDLTouchManagerDelegate","abstract":"

    Undocumented

    "},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagNone":{"name":"SDLStreamingEncryptionFlagNone","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateOnly":{"name":"SDLStreamingEncryptionFlagAuthenticateOnly","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateAndEncrypt":{"name":"SDLStreamingEncryptionFlagAuthenticateAndEncrypt","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeLayer":{"name":"SDLCarWindowRenderingTypeLayer","abstract":"

    Undocumented

    ","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewAfterScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewAfterScreenUpdates","abstract":"

    Undocumented

    ","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewBeforeScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewBeforeScreenUpdates","abstract":"

    Undocumented

    ","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeRequest":{"name":"SDLRPCMessageTypeRequest","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeResponse":{"name":"SDLRPCMessageTypeResponse","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeNotification":{"name":"SDLRPCMessageTypeNotification","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessageType"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusAllowed":{"name":"SDLPermissionGroupStatusAllowed","abstract":"

    Every RPC in the group is currently allowed.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusDisallowed":{"name":"SDLPermissionGroupStatusDisallowed","abstract":"

    Every RPC in the group is currently disallowed.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusMixed":{"name":"SDLPermissionGroupStatusMixed","abstract":"

    Some RPCs in the group are allowed and some disallowed.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusUnknown":{"name":"SDLPermissionGroupStatusUnknown","abstract":"

    The current status of the group is unknown.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAllAllowed":{"name":"SDLPermissionGroupTypeAllAllowed","abstract":"

    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.

    ","parent_name":"SDLPermissionGroupType"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAny":{"name":"SDLPermissionGroupTypeAny","abstract":"

    Be notified when any change in availability occurs among the group.

    ","parent_name":"SDLPermissionGroupType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeSimple":{"name":"SDLLogFormatTypeSimple","abstract":"

    Undocumented

    ","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDefault":{"name":"SDLLogFormatTypeDefault","abstract":"

    Undocumented

    ","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDetailed":{"name":"SDLLogFormatTypeDetailed","abstract":"

    Undocumented

    ","parent_name":"SDLLogFormatType"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDefault":{"name":"SDLLogLevelDefault","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelOff":{"name":"SDLLogLevelOff","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelError":{"name":"SDLLogLevelError","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelWarning":{"name":"SDLLogLevelWarning","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDebug":{"name":"SDLLogLevelDebug","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelVerbose":{"name":"SDLLogLevelVerbose","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagError":{"name":"SDLLogFlagError","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagWarning":{"name":"SDLLogFlagWarning","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagDebug":{"name":"SDLLogFlagDebug","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagVerbose":{"name":"SDLLogFlagVerbose","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionTransmit":{"name":"SDLLogBytesDirectionTransmit","abstract":"

    Undocumented

    ","parent_name":"SDLLogBytesDirection"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionReceive":{"name":"SDLLogBytesDirectionReceive","abstract":"

    Undocumented

    ","parent_name":"SDLLogBytesDirection"},"Enums/SDLRPCStoreError.html#/c:@E@SDLRPCStoreError@SDLRPCStoreErrorGetInvalidObject":{"name":"SDLRPCStoreErrorGetInvalidObject","abstract":"

    In dictionary stored value with unexpected type

    ","parent_name":"SDLRPCStoreError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorUnknown":{"name":"SDLTransportErrorUnknown","abstract":"

    Connection cannot be established due to a reason not listed here.

    ","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionRefused":{"name":"SDLTransportErrorConnectionRefused","abstract":"

    TCP connection is refused.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionTimedOut":{"name":"SDLTransportErrorConnectionTimedOut","abstract":"

    TCP connection cannot be established within given time.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorNetworkDown":{"name":"SDLTransportErrorNetworkDown","abstract":"

    TCP connection cannot be established since network is down.","parent_name":"SDLTransportError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorPendingPresentationDeleted":{"name":"SDLChoiceSetManagerErrorPendingPresentationDeleted","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorDeletionFailed":{"name":"SDLChoiceSetManagerErrorDeletionFailed","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorUploadFailed":{"name":"SDLChoiceSetManagerErrorUploadFailed","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorFailedToCreateMenuItems":{"name":"SDLChoiceSetManagerErrorFailedToCreateMenuItems","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorRPCsFailed":{"name":"SDLMenuManagerErrorRPCsFailed","abstract":"

    Undocumented

    ","parent_name":"SDLMenuManagerError"},"Enums/SDLSoftButtonManagerError.html#/c:@E@SDLSoftButtonManagerError@SDLSoftButtonManagerErrorPendingUpdateSuperseded":{"name":"SDLSoftButtonManagerErrorPendingUpdateSuperseded","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButtonManagerError"},"Enums/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorPendingUpdateSuperseded":{"name":"SDLTextAndGraphicManagerErrorPendingUpdateSuperseded","abstract":"

    Undocumented

    ","parent_name":"SDLTextAndGraphicManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorCannotOverwrite":{"name":"SDLFileManagerErrorCannotOverwrite","abstract":"

    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.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorNoKnownFile":{"name":"SDLFileManagerErrorNoKnownFile","abstract":"

    A file was attempted to be accessed but it does not exist.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToStart":{"name":"SDLFileManagerErrorUnableToStart","abstract":"

    The file manager attempted to start but encountered an error.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToUpload":{"name":"SDLFileManagerErrorUnableToUpload","abstract":"

    The file manager was unable to send this file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDoesNotExist":{"name":"SDLFileManagerErrorFileDoesNotExist","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerUploadCanceled":{"name":"SDLFileManagerUploadCanceled","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileUploadTasksFailed":{"name":"SDLFileManagerMultipleFileUploadTasksFailed","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileDeleteTasksFailed":{"name":"SDLFileManagerMultipleFileDeleteTasksFailed","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDataMissing":{"name":"SDLFileManagerErrorFileDataMissing","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorStaticIcon":{"name":"SDLFileManagerErrorStaticIcon","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRPCRequestFailed":{"name":"SDLManagerErrorRPCRequestFailed","abstract":"

    An RPC request failed to send.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotConnected":{"name":"SDLManagerErrorNotConnected","abstract":"

    Some action was attempted that requires a connection to the remote head unit.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotReady":{"name":"SDLManagerErrorNotReady","abstract":"

    Some action was attempted before the ready state was reached.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorUnknownRemoteError":{"name":"SDLManagerErrorUnknownRemoteError","abstract":"

    The remote system encountered an unknown error.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorManagersFailedToStart":{"name":"SDLManagerErrorManagersFailedToStart","abstract":"

    One or more of the sub-managers failed to start.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationFailed":{"name":"SDLManagerErrorRegistrationFailed","abstract":"

    Registering with the remote system failed.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationSuccessWithWarning":{"name":"SDLManagerErrorRegistrationSuccessWithWarning","abstract":"

    Registering with the remote system was successful, but had a warning.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorCancelled":{"name":"SDLManagerErrorCancelled","abstract":"

    Request operations were cancelled before they could be sent

    ","parent_name":"SDLManagerError"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutList":{"name":"SDLChoiceSetLayoutList","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetLayout"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutTiles":{"name":"SDLChoiceSetLayoutTiles","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetLayout"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNotConnected":{"name":"SDLAudioStreamManagerErrorNotConnected","abstract":"

    Undocumented

    ","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNoQueuedAudio":{"name":"SDLAudioStreamManagerErrorNoQueuedAudio","abstract":"

    Undocumented

    ","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatPNG":{"name":"SDLArtworkImageFormatPNG","abstract":"

    Undocumented

    ","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatJPG":{"name":"SDLArtworkImageFormatJPG","abstract":"

    Undocumented

    ","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html":{"name":"SDLArtworkImageFormat","abstract":"

    Undocumented

    "},"Enums/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"

    Undocumented

    "},"Enums/SDLChoiceSetLayout.html":{"name":"SDLChoiceSetLayout","abstract":"

    Undocumented

    "},"Enums/SDLManagerError.html":{"name":"SDLManagerError","abstract":"

    Errors associated with the SDLManager class.

    "},"Enums/SDLFileManagerError.html":{"name":"SDLFileManagerError","abstract":"

    Errors associated with the SDLFileManager class.

    "},"Enums/SDLTextAndGraphicManagerError.html":{"name":"SDLTextAndGraphicManagerError","abstract":"

    Errors associated with the ScreenManager class

    "},"Enums/SDLSoftButtonManagerError.html":{"name":"SDLSoftButtonManagerError","abstract":"

    Errors associated with the ScreenManager class

    "},"Enums/SDLMenuManagerError.html":{"name":"SDLMenuManagerError","abstract":"

    Errors associated with the ScreenManager class

    "},"Enums/SDLChoiceSetManagerError.html":{"name":"SDLChoiceSetManagerError","abstract":"

    Undocumented

    "},"Enums/SDLTransportError.html":{"name":"SDLTransportError","abstract":"

    Errors associated with transport.

    "},"Enums/SDLRPCStoreError.html":{"name":"SDLRPCStoreError","abstract":"

    Errors associated with store.

    "},"Enums/SDLLogBytesDirection.html":{"name":"SDLLogBytesDirection","abstract":"

    Undocumented

    "},"Enums/SDLLogFlag.html":{"name":"SDLLogFlag","abstract":"

    Flags used for SDLLogLevel to provide correct enum values. This is purely for internal use.

    "},"Enums/SDLLogLevel.html":{"name":"SDLLogLevel","abstract":"

    An enum describing a level of logging.

    "},"Enums/SDLLogFormatType.html":{"name":"SDLLogFormatType","abstract":"

    The output format of logs; how they will appear when printed out into a string.

    "},"Enums/SDLPermissionGroupType.html":{"name":"SDLPermissionGroupType","abstract":"

    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.

    "},"Enums/SDLPermissionGroupStatus.html":{"name":"SDLPermissionGroupStatus","abstract":"

    The status of the group of RPCs permissions.

    "},"Enums/SDLRPCMessageType.html":{"name":"SDLRPCMessageType","abstract":"

    The type of RPC message

    "},"Enums/SDLCarWindowRenderingType.html":{"name":"SDLCarWindowRenderingType","abstract":"

    The type of rendering that CarWindow will perform. Depending on your app, you may need to try different ones for best performance

    "},"Enums/SDLStreamingEncryptionFlag.html":{"name":"SDLStreamingEncryptionFlag","abstract":"

    A flag determining how video and audio streaming should be encrypted

    "},"Constants.html#/c:@SDLAmbientLightStatusNight":{"name":"SDLAmbientLightStatusNight","abstract":"

    Represents a night ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight1":{"name":"SDLAmbientLightStatusTwilight1","abstract":"

    Represents a twilight 1 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight2":{"name":"SDLAmbientLightStatusTwilight2","abstract":"

    Represents a twilight 2 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight3":{"name":"SDLAmbientLightStatusTwilight3","abstract":"

    Represents a twilight 3 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight4":{"name":"SDLAmbientLightStatusTwilight4","abstract":"

    Represents a twilight 4 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusDay":{"name":"SDLAmbientLightStatusDay","abstract":"

    Represents a day ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusUnknown":{"name":"SDLAmbientLightStatusUnknown","abstract":"

    Represents an unknown ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusInvalid":{"name":"SDLAmbientLightStatusInvalid","abstract":"

    Represents a invalid ambient light status

    "},"Constants.html#/c:@SDLAppHMITypeDefault":{"name":"SDLAppHMITypeDefault","abstract":"

    The App will have default rights.

    "},"Constants.html#/c:@SDLAppHMITypeCommunication":{"name":"SDLAppHMITypeCommunication","abstract":"

    Communication type of App

    "},"Constants.html#/c:@SDLAppHMITypeMedia":{"name":"SDLAppHMITypeMedia","abstract":"

    App dealing with Media

    "},"Constants.html#/c:@SDLAppHMITypeMessaging":{"name":"SDLAppHMITypeMessaging","abstract":"

    Messaging App

    "},"Constants.html#/c:@SDLAppHMITypeNavigation":{"name":"SDLAppHMITypeNavigation","abstract":"

    Navigation App

    "},"Constants.html#/c:@SDLAppHMITypeInformation":{"name":"SDLAppHMITypeInformation","abstract":"

    Information App

    "},"Constants.html#/c:@SDLAppHMITypeSocial":{"name":"SDLAppHMITypeSocial","abstract":"

    App dealing with social media

    "},"Constants.html#/c:@SDLAppHMITypeProjection":{"name":"SDLAppHMITypeProjection","abstract":"

    App dealing with Mobile Projection applications

    "},"Constants.html#/c:@SDLAppHMITypeBackgroundProcess":{"name":"SDLAppHMITypeBackgroundProcess","abstract":"

    App designed for use in the background

    "},"Constants.html#/c:@SDLAppHMITypeTesting":{"name":"SDLAppHMITypeTesting","abstract":"

    App only for Testing purposes

    "},"Constants.html#/c:@SDLAppHMITypeSystem":{"name":"SDLAppHMITypeSystem","abstract":"

    System App

    "},"Constants.html#/c:@SDLAppHMITypeRemoteControl":{"name":"SDLAppHMITypeRemoteControl","abstract":"

    Remote control

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonIgnitionOff":{"name":"SDLAppInterfaceUnregisteredReasonIgnitionOff","abstract":"

    Vehicle ignition turned off.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonBluetoothOff":{"name":"SDLAppInterfaceUnregisteredReasonBluetoothOff","abstract":"

    Bluetooth was turned off, causing termination of a necessary Bluetooth connection.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUSBDisconnected":{"name":"SDLAppInterfaceUnregisteredReasonUSBDisconnected","abstract":"

    USB was disconnected, causing termination of a necessary iAP connection.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel":{"name":"SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel","abstract":"

    Application attempted SmartDeviceLink RPC request while HMILevel = NONE. App must have HMILevel other than NONE to issue RPC requests or get notifications or RPC responses.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonTooManyRequests":{"name":"SDLAppInterfaceUnregisteredReasonTooManyRequests","abstract":"

    Either too many – or too many per unit of time – requests were made by the application.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonDriverDistractionViolation":{"name":"SDLAppInterfaceUnregisteredReasonDriverDistractionViolation","abstract":"

    The application has issued requests which cause driver distraction rules to be violated.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonLanguageChange":{"name":"SDLAppInterfaceUnregisteredReasonLanguageChange","abstract":"

    The user performed a language change on the SDL platform, causing the application to need to be reregistered for the new language.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonMasterReset":{"name":"SDLAppInterfaceUnregisteredReasonMasterReset","abstract":"

    The user performed a MASTER RESET on the SDL platform, causing removal of a necessary Bluetooth pairing.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonFactoryDefaults":{"name":"SDLAppInterfaceUnregisteredReasonFactoryDefaults","abstract":"

    The user restored settings to FACTORY DEFAULTS on the SDL platform.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonAppUnauthorized":{"name":"SDLAppInterfaceUnregisteredReasonAppUnauthorized","abstract":"

    The app is not being authorized to be connected to SDL.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonProtocolViolation":{"name":"SDLAppInterfaceUnregisteredReasonProtocolViolation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource":{"name":"SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppServiceTypeMedia":{"name":"SDLAppServiceTypeMedia","abstract":"

    The app will have a service type of media.

    "},"Constants.html#/c:@SDLAppServiceTypeWeather":{"name":"SDLAppServiceTypeWeather","abstract":"

    The app will have a service type of weather.

    "},"Constants.html#/c:@SDLAppServiceTypeNavigation":{"name":"SDLAppServiceTypeNavigation","abstract":"

    The app will have a service type of navigation.

    "},"Constants.html#/c:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamingIndicatorPlayPause":{"name":"SDLAudioStreamingIndicatorPlayPause","abstract":"

    Default playback indicator."},"Constants.html#/c:@SDLAudioStreamingIndicatorPlay":{"name":"SDLAudioStreamingIndicatorPlay","abstract":"

    Indicates that a button press of the Play/Pause button starts the audio playback.

    "},"Constants.html#/c:@SDLAudioStreamingIndicatorPause":{"name":"SDLAudioStreamingIndicatorPause","abstract":"

    Indicates that a button press of the Play/Pause button pauses the current audio playback.

    "},"Constants.html#/c:@SDLAudioStreamingIndicatorStop":{"name":"SDLAudioStreamingIndicatorStop","abstract":"

    Indicates that a button press of the Play/Pause button stops the current audio playback.

    "},"Constants.html#/c:@SDLAudioStreamingStateAudible":{"name":"SDLAudioStreamingStateAudible","abstract":"

    Currently streaming audio, if any, is audible to user.

    "},"Constants.html#/c:@SDLAudioStreamingStateAttenuated":{"name":"SDLAudioStreamingStateAttenuated","abstract":"

    Some kind of audio mixing is taking place. Currently streaming audio, if any, is audible to the user at a lowered volume.

    "},"Constants.html#/c:@SDLAudioStreamingStateNotAudible":{"name":"SDLAudioStreamingStateNotAudible","abstract":"

    Currently streaming audio, if any, is not audible to user. made via VR session.

    "},"Constants.html#/c:@SDLAudioTypePCM":{"name":"SDLAudioTypePCM","abstract":"

    PCM raw audio

    "},"Constants.html#/c:@SDLBitsPerSample8Bit":{"name":"SDLBitsPerSample8Bit","abstract":"

    8 bits per sample

    "},"Constants.html#/c:@SDLBitsPerSample16Bit":{"name":"SDLBitsPerSample16Bit","abstract":"

    16 bits per sample

    "},"Constants.html#/c:@SDLButtonEventModeButtonUp":{"name":"SDLButtonEventModeButtonUp","abstract":"

    The button was released

    "},"Constants.html#/c:@SDLButtonEventModeButtonDown":{"name":"SDLButtonEventModeButtonDown","abstract":"

    The button was depressed

    "},"Constants.html#/c:@SDLButtonNameOk":{"name":"SDLButtonNameOk","abstract":"

    Represents the button usually labeled OK. A typical use of this button is for the user to press it to make a selection. Prior to SDL Core 5.0 (iOS Proxy v.6.1), Ok was used for both OK buttons AND PlayPause. In 5.0, PlayPause was introduced to reduce confusion, and you should use the one you intend for your use case (usually PlayPause). Until the next proxy breaking change, however, subscribing to this button name will continue to subscribe you to PlayPause so that your code does not break. That means that if you subscribe to both Ok and PlayPause, you will receive duplicate notifications.

    "},"Constants.html#/c:@SDLButtonNamePlayPause":{"name":"SDLButtonNamePlayPause","abstract":"

    Represents the play/pause button for media apps. Replaces OK on sub-5.0 head units, compliments it on 5.0 head units and later.

    "},"Constants.html#/c:@SDLButtonNameSeekLeft":{"name":"SDLButtonNameSeekLeft","abstract":"

    Represents the seek-left button. A typical use of this button is for the user to scroll to the left through menu choices one menu item per press.

    "},"Constants.html#/c:@SDLButtonNameSeekRight":{"name":"SDLButtonNameSeekRight","abstract":"

    Represents the seek-right button. A typical use of this button is for the user to scroll to the right through menu choices one menu item per press.

    "},"Constants.html#/c:@SDLButtonNameTuneUp":{"name":"SDLButtonNameTuneUp","abstract":"

    Represents a turn of the tuner knob in the clockwise direction one tick.

    "},"Constants.html#/c:@SDLButtonNameTuneDown":{"name":"SDLButtonNameTuneDown","abstract":"

    Represents a turn of the tuner knob in the counter-clockwise direction one tick.

    "},"Constants.html#/c:@SDLButtonNamePreset0":{"name":"SDLButtonNamePreset0","abstract":"

    Represents the preset 0 button.

    "},"Constants.html#/c:@SDLButtonNamePreset1":{"name":"SDLButtonNamePreset1","abstract":"

    Represents the preset 1 button.

    "},"Constants.html#/c:@SDLButtonNamePreset2":{"name":"SDLButtonNamePreset2","abstract":"

    Represents the preset 2 button.

    "},"Constants.html#/c:@SDLButtonNamePreset3":{"name":"SDLButtonNamePreset3","abstract":"

    Represents the preset 3 button.

    "},"Constants.html#/c:@SDLButtonNamePreset4":{"name":"SDLButtonNamePreset4","abstract":"

    Represents the preset 4 button.

    "},"Constants.html#/c:@SDLButtonNamePreset5":{"name":"SDLButtonNamePreset5","abstract":"

    Represents the preset 5 button.

    "},"Constants.html#/c:@SDLButtonNamePreset6":{"name":"SDLButtonNamePreset6","abstract":"

    Represents the preset 6 button.

    "},"Constants.html#/c:@SDLButtonNamePreset7":{"name":"SDLButtonNamePreset7","abstract":"

    Represents the preset 7 button.

    "},"Constants.html#/c:@SDLButtonNamePreset8":{"name":"SDLButtonNamePreset8","abstract":"

    Represents the preset 8 button.

    "},"Constants.html#/c:@SDLButtonNamePreset9":{"name":"SDLButtonNamePreset9","abstract":"

    Represents the preset 9 button.

    "},"Constants.html#/c:@SDLButtonNameCustomButton":{"name":"SDLButtonNameCustomButton","abstract":"

    Represents the Custom button.

    "},"Constants.html#/c:@SDLButtonNameSearch":{"name":"SDLButtonNameSearch","abstract":"

    Represents the SEARCH button.

    "},"Constants.html#/c:@SDLButtonNameACMax":{"name":"SDLButtonNameACMax","abstract":"

    Represents AC max button *

    "},"Constants.html#/c:@SDLButtonNameAC":{"name":"SDLButtonNameAC","abstract":"

    Represents AC button *

    "},"Constants.html#/c:@SDLButtonNameRecirculate":{"name":"SDLButtonNameRecirculate","abstract":"

    Represents a Recirculate button

    "},"Constants.html#/c:@SDLButtonNameFanUp":{"name":"SDLButtonNameFanUp","abstract":"

    Represents a Fan up button

    "},"Constants.html#/c:@SDLButtonNameFanDown":{"name":"SDLButtonNameFanDown","abstract":"

    Represents a fan down button

    "},"Constants.html#/c:@SDLButtonNameTempUp":{"name":"SDLButtonNameTempUp","abstract":"

    Represents a temperature up button

    "},"Constants.html#/c:@SDLButtonNameTempDown":{"name":"SDLButtonNameTempDown","abstract":"

    Represents a temperature down button

    "},"Constants.html#/c:@SDLButtonNameDefrostMax":{"name":"SDLButtonNameDefrostMax","abstract":"

    Represents a Defrost max button.

    "},"Constants.html#/c:@SDLButtonNameDefrost":{"name":"SDLButtonNameDefrost","abstract":"

    Represents a Defrost button.

    "},"Constants.html#/c:@SDLButtonNameDefrostRear":{"name":"SDLButtonNameDefrostRear","abstract":"

    Represents a Defrost rear button.

    "},"Constants.html#/c:@SDLButtonNameUpperVent":{"name":"SDLButtonNameUpperVent","abstract":"

    Represents a Upper Vent button.

    "},"Constants.html#/c:@SDLButtonNameLowerVent":{"name":"SDLButtonNameLowerVent","abstract":"

    Represents a Lower vent button.

    "},"Constants.html#/c:@SDLButtonNameVolumeUp":{"name":"SDLButtonNameVolumeUp","abstract":"

    Represents a volume up button.

    "},"Constants.html#/c:@SDLButtonNameVolumeDown":{"name":"SDLButtonNameVolumeDown","abstract":"

    Represents a volume down button.

    "},"Constants.html#/c:@SDLButtonNameEject":{"name":"SDLButtonNameEject","abstract":"

    Represents a Eject Button.

    "},"Constants.html#/c:@SDLButtonNameSource":{"name":"SDLButtonNameSource","abstract":"

    Represents a Source button.

    "},"Constants.html#/c:@SDLButtonNameShuffle":{"name":"SDLButtonNameShuffle","abstract":"

    Represents a SHUFFLE button.

    "},"Constants.html#/c:@SDLButtonNameRepeat":{"name":"SDLButtonNameRepeat","abstract":"

    Represents a Repeat button.

    "},"Constants.html#/c:@SDLButtonPressModeLong":{"name":"SDLButtonPressModeLong","abstract":"

    A button was released, after it was pressed for a long time. Actual timing is defined by the head unit and may vary.

    "},"Constants.html#/c:@SDLButtonPressModeShort":{"name":"SDLButtonPressModeShort","abstract":"

    A button was released, after it was pressed for a short time. Actual timing is defined by the head unit and may vary.

    "},"Constants.html#/c:@SDLCarModeStatusNormal":{"name":"SDLCarModeStatusNormal","abstract":"

    Provides carmode NORMAL to each module.

    "},"Constants.html#/c:@SDLCarModeStatusFactory":{"name":"SDLCarModeStatusFactory","abstract":"

    Provides carmode FACTORY to each module.

    "},"Constants.html#/c:@SDLCarModeStatusTransport":{"name":"SDLCarModeStatusTransport","abstract":"

    Provides carmode TRANSPORT to each module.

    "},"Constants.html#/c:@SDLCarModeStatusCrash":{"name":"SDLCarModeStatusCrash","abstract":"

    Provides carmode CRASH to each module.

    "},"Constants.html#/c:@SDLCharacterSetType2":{"name":"SDLCharacterSetType2","abstract":"

    Character Set Type 2

    "},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"

    Character Set Type 5

    "},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"

    Character Set CID1

    "},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"

    Character Set CID2

    "},"Constants.html#/c:@SDLCompassDirectionNorth":{"name":"SDLCompassDirectionNorth","abstract":"

    Direction North

    "},"Constants.html#/c:@SDLCompassDirectionNorthwest":{"name":"SDLCompassDirectionNorthwest","abstract":"

    Direction Northwest

    "},"Constants.html#/c:@SDLCompassDirectionWest":{"name":"SDLCompassDirectionWest","abstract":"

    Direction West

    "},"Constants.html#/c:@SDLCompassDirectionSouthwest":{"name":"SDLCompassDirectionSouthwest","abstract":"

    Direction Southwest

    "},"Constants.html#/c:@SDLCompassDirectionSouth":{"name":"SDLCompassDirectionSouth","abstract":"

    Direction South

    "},"Constants.html#/c:@SDLCompassDirectionSoutheast":{"name":"SDLCompassDirectionSoutheast","abstract":"

    Direction Southeast

    "},"Constants.html#/c:@SDLCompassDirectionEast":{"name":"SDLCompassDirectionEast","abstract":"

    Direction East

    "},"Constants.html#/c:@SDLCompassDirectionNortheast":{"name":"SDLCompassDirectionNortheast","abstract":"

    Direction Northeast

    "},"Constants.html#/c:@SDLComponentVolumeStatusUnknown":{"name":"SDLComponentVolumeStatusUnknown","abstract":"

    Unknown SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusNormal":{"name":"SDLComponentVolumeStatusNormal","abstract":"

    Normal SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusLow":{"name":"SDLComponentVolumeStatusLow","abstract":"

    Low SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusFault":{"name":"SDLComponentVolumeStatusFault","abstract":"

    Fault SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusAlert":{"name":"SDLComponentVolumeStatusAlert","abstract":"

    Alert SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusNotSupported":{"name":"SDLComponentVolumeStatusNotSupported","abstract":"

    Not supported SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLDefrostZoneFront":{"name":"SDLDefrostZoneFront","abstract":"

    A SDLDefrostZone with the value of FRONT

    "},"Constants.html#/c:@SDLDefrostZoneRear":{"name":"SDLDefrostZoneRear","abstract":"

    A SDLDefrostZone with the value of REAR

    "},"Constants.html#/c:@SDLDefrostZoneAll":{"name":"SDLDefrostZoneAll","abstract":"

    A SDLDefrostZone with the value of All

    "},"Constants.html#/c:@SDLDefrostZoneNone":{"name":"SDLDefrostZoneNone","abstract":"

    A SDLDefrostZone with the value of None

    "},"Constants.html#/c:@SDLDeliveryModePrompt":{"name":"SDLDeliveryModePrompt","abstract":"

    User is prompted on HMI

    "},"Constants.html#/c:@SDLDeliveryModeDestination":{"name":"SDLDeliveryModeDestination","abstract":"

    Set the location as destination without prompting the user

    "},"Constants.html#/c:@SDLDeliveryModeQueue":{"name":"SDLDeliveryModeQueue","abstract":"

    Adds the current location to navigation queue

    "},"Constants.html#/c:@SDLDeviceLevelStatusZeroBars":{"name":"SDLDeviceLevelStatusZeroBars","abstract":"

    Device battery level is zero bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusOneBar":{"name":"SDLDeviceLevelStatusOneBar","abstract":"

    Device battery level is one bar

    "},"Constants.html#/c:@SDLDeviceLevelStatusTwoBars":{"name":"SDLDeviceLevelStatusTwoBars","abstract":"

    Device battery level is two bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusThreeBars":{"name":"SDLDeviceLevelStatusThreeBars","abstract":"

    Device battery level is three bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusFourBars":{"name":"SDLDeviceLevelStatusFourBars","abstract":"

    Device battery level is four bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusNotProvided":{"name":"SDLDeviceLevelStatusNotProvided","abstract":"

    Device battery level is unknown

    "},"Constants.html#/c:@SDLDimensionNoFix":{"name":"SDLDimensionNoFix","abstract":"

    No GPS at all

    "},"Constants.html#/c:@SDLDimension2D":{"name":"SDLDimension2D","abstract":"

    Longitude and latitude of the GPS

    "},"Constants.html#/c:@SDLDimension3D":{"name":"SDLDimension3D","abstract":"

    Longitude and latitude and altitude of the GPS

    "},"Constants.html#/c:@SDLDirectionLeft":{"name":"SDLDirectionLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDirectionRight":{"name":"SDLDirectionRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDisplayModeDay":{"name":"SDLDisplayModeDay","abstract":"

    @abstract Display Mode : DAY

    "},"Constants.html#/c:@SDLDisplayModeNight":{"name":"SDLDisplayModeNight","abstract":"

    @abstract Display Mode : NIGHT.

    "},"Constants.html#/c:@SDLDisplayModeAuto":{"name":"SDLDisplayModeAuto","abstract":"

    @abstract Display Mode : AUTO.

    "},"Constants.html#/c:@SDLDisplayTypeCID":{"name":"SDLDisplayTypeCID","abstract":"

    This display type provides a 2-line x 20 character dot matrix display.

    "},"Constants.html#/c:@SDLDisplayTypeType2":{"name":"SDLDisplayTypeType2","abstract":"

    Display type 2

    "},"Constants.html#/c:@SDLDisplayTypeType5":{"name":"SDLDisplayTypeType5","abstract":"

    Display type 5

    "},"Constants.html#/c:@SDLDisplayTypeNGN":{"name":"SDLDisplayTypeNGN","abstract":"

    This display type provides an 8 inch touchscreen display.

    "},"Constants.html#/c:@SDLDisplayTypeGen28DMA":{"name":"SDLDisplayTypeGen28DMA","abstract":"

    Display type Gen 28 DMA

    "},"Constants.html#/c:@SDLDisplayTypeGen26DMA":{"name":"SDLDisplayTypeGen26DMA","abstract":"

    Display type Gen 26 DMA

    "},"Constants.html#/c:@SDLDisplayTypeMFD3":{"name":"SDLDisplayTypeMFD3","abstract":"

    Display type MFD3

    "},"Constants.html#/c:@SDLDisplayTypeMFD4":{"name":"SDLDisplayTypeMFD4","abstract":"

    Display type MFD4

    "},"Constants.html#/c:@SDLDisplayTypeMFD5":{"name":"SDLDisplayTypeMFD5","abstract":"

    Display type MFD5

    "},"Constants.html#/c:@SDLDisplayTypeGen38Inch":{"name":"SDLDisplayTypeGen38Inch","abstract":"

    Display type Gen 3 8-inch

    "},"Constants.html#/c:@SDLDisplayTypeGeneric":{"name":"SDLDisplayTypeGeneric","abstract":"

    Display type Generic

    "},"Constants.html#/c:@SDLDistanceUnitMiles":{"name":"SDLDistanceUnitMiles","abstract":"

    @abstract SDLDistanceUnit: MILES

    "},"Constants.html#/c:@SDLDistanceUnitKilometers":{"name":"SDLDistanceUnitKilometers","abstract":"

    @abstract SDLDistanceUnit: KILOMETERS

    "},"Constants.html#/c:@SDLDriverDistractionStateOn":{"name":"SDLDriverDistractionStateOn","abstract":"

    Driver distraction rules are in effect.

    "},"Constants.html#/c:@SDLDriverDistractionStateOff":{"name":"SDLDriverDistractionStateOff","abstract":"

    Driver distraction rules are NOT in effect.

    "},"Constants.html#/c:@SDLECallConfirmationStatusNormal":{"name":"SDLECallConfirmationStatusNormal","abstract":"

    No E-Call signal triggered.

    "},"Constants.html#/c:@SDLECallConfirmationStatusInProgress":{"name":"SDLECallConfirmationStatusInProgress","abstract":"

    An E-Call is being in progress.

    "},"Constants.html#/c:@SDLECallConfirmationStatusCancelled":{"name":"SDLECallConfirmationStatusCancelled","abstract":"

    An E-Call was cancelled by the user.

    "},"Constants.html#/c:@SDLECallConfirmationStatusCompleted":{"name":"SDLECallConfirmationStatusCompleted","abstract":"

    The E-Call sequence is completed.

    "},"Constants.html#/c:@SDLECallConfirmationStatusUnsuccessful":{"name":"SDLECallConfirmationStatusUnsuccessful","abstract":"

    An E-Call could not be connected.

    "},"Constants.html#/c:@SDLECallConfirmationStatusConfiguredOff":{"name":"SDLECallConfirmationStatusConfiguredOff","abstract":"

    E-Call is not configured on this vehicle.

    "},"Constants.html#/c:@SDLECallConfirmationStatusCompleteDTMFTimeout":{"name":"SDLECallConfirmationStatusCompleteDTMFTimeout","abstract":"

    E-Call is considered to be complete without Emergency Operator contact.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusClosed":{"name":"SDLElectronicParkBrakeStatusClosed","abstract":"

    Parking brake actuators have been fully applied.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusTransition":{"name":"SDLElectronicParkBrakeStatusTransition","abstract":"

    Parking brake actuators are transitioning to either Apply/Closed or Release/Open state.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusOpen":{"name":"SDLElectronicParkBrakeStatusOpen","abstract":"

    Parking brake actuators are released.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusDriveActive":{"name":"SDLElectronicParkBrakeStatusDriveActive","abstract":"

    When driver pulls the Electronic Parking Brake switch while driving at speed.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusFault":{"name":"SDLElectronicParkBrakeStatusFault","abstract":"

    When system has a fault or is under maintenance.

    "},"Constants.html#/c:@SDLEmergencyEventTypeNoEvent":{"name":"SDLEmergencyEventTypeNoEvent","abstract":"

    No emergency event has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeFrontal":{"name":"SDLEmergencyEventTypeFrontal","abstract":"

    Frontal collision has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeSide":{"name":"SDLEmergencyEventTypeSide","abstract":"

    Side collision has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeRear":{"name":"SDLEmergencyEventTypeRear","abstract":"

    Rear collision has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeRollover":{"name":"SDLEmergencyEventTypeRollover","abstract":"

    A rollover event has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeNotSupported":{"name":"SDLEmergencyEventTypeNotSupported","abstract":"

    The signal is not supported

    "},"Constants.html#/c:@SDLEmergencyEventTypeFault":{"name":"SDLEmergencyEventTypeFault","abstract":"

    Emergency status cannot be determined

    "},"Constants.html#/c:@SDLFileTypeBMP":{"name":"SDLFileTypeBMP","abstract":"

    file type: Bitmap (BMP)

    "},"Constants.html#/c:@SDLFileTypeJPEG":{"name":"SDLFileTypeJPEG","abstract":"

    file type: JPEG

    "},"Constants.html#/c:@SDLFileTypePNG":{"name":"SDLFileTypePNG","abstract":"

    file type: PNG

    "},"Constants.html#/c:@SDLFileTypeWAV":{"name":"SDLFileTypeWAV","abstract":"

    file type: WAVE (WAV)

    "},"Constants.html#/c:@SDLFileTypeMP3":{"name":"SDLFileTypeMP3","abstract":"

    file type: MP3

    "},"Constants.html#/c:@SDLFileTypeAAC":{"name":"SDLFileTypeAAC","abstract":"

    file type: AAC

    "},"Constants.html#/c:@SDLFileTypeBinary":{"name":"SDLFileTypeBinary","abstract":"

    file type: BINARY

    "},"Constants.html#/c:@SDLFileTypeJSON":{"name":"SDLFileTypeJSON","abstract":"

    file type: JSON

    "},"Constants.html#/c:@SDLFuelCutoffStatusTerminateFuel":{"name":"SDLFuelCutoffStatusTerminateFuel","abstract":"

    Fuel is cut off

    "},"Constants.html#/c:@SDLFuelCutoffStatusNormalOperation":{"name":"SDLFuelCutoffStatusNormalOperation","abstract":"

    Fuel is not cut off

    "},"Constants.html#/c:@SDLFuelCutoffStatusFault":{"name":"SDLFuelCutoffStatusFault","abstract":"

    Status of the fuel pump cannot be determined

    "},"Constants.html#/c:@SDLFuelTypeGasoline":{"name":"SDLFuelTypeGasoline","abstract":"

    Fuel type: Gasoline

    "},"Constants.html#/c:@SDLFuelTypeDiesel":{"name":"SDLFuelTypeDiesel","abstract":"

    Fuel type: Diesel

    "},"Constants.html#/c:@SDLFuelTypeCNG":{"name":"SDLFuelTypeCNG","abstract":"

    Fuel type: CNG

    "},"Constants.html#/c:@SDLFuelTypeLPG":{"name":"SDLFuelTypeLPG","abstract":"

    Fuel type: LPG

    "},"Constants.html#/c:@SDLFuelTypeHydrogen":{"name":"SDLFuelTypeHydrogen","abstract":"

    Fuel type: Hydrogen

    "},"Constants.html#/c:@SDLFuelTypeBattery":{"name":"SDLFuelTypeBattery","abstract":"

    Fuel type: Battery

    "},"Constants.html#/c:@SDLGlobalPropertyHelpPrompt":{"name":"SDLGlobalPropertyHelpPrompt","abstract":"

    The help prompt to be spoken if the user needs assistance during a user-initiated interaction.

    "},"Constants.html#/c:@SDLGlobalPropertyTimeoutPrompt":{"name":"SDLGlobalPropertyTimeoutPrompt","abstract":"

    The prompt to be spoken if the user-initiated interaction times out waiting for the user’s verbal input.

    "},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpTitle":{"name":"SDLGlobalPropertyVoiceRecognitionHelpTitle","abstract":"

    The title of the menu displayed when the user requests help via voice recognition.

    "},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpItems":{"name":"SDLGlobalPropertyVoiceRecognitionHelpItems","abstract":"

    Items of the menu displayed when the user requests help via voice recognition.

    "},"Constants.html#/c:@SDLGlobalPropertyMenuName":{"name":"SDLGlobalPropertyMenuName","abstract":"

    The name of the menu button displayed in templates

    "},"Constants.html#/c:@SDLGlobalPropertyMenuIcon":{"name":"SDLGlobalPropertyMenuIcon","abstract":"

    An icon on the menu button displayed in templates

    "},"Constants.html#/c:@SDLGlobalPropertyKeyboard":{"name":"SDLGlobalPropertyKeyboard","abstract":"

    Property related to the keyboard

    "},"Constants.html#/c:@SDLHMILevelFull":{"name":"SDLHMILevelFull","abstract":"

    The application has full use of the SDL HMI. The app may output via TTS, display, or streaming audio and may gather input via VR, Menu, and button presses

    "},"Constants.html#/c:@SDLHMILevelLimited":{"name":"SDLHMILevelLimited","abstract":"

    This HMI Level is only defined for a media application using an HMI with an 8 inch touchscreen (Nav) system. The application’s Show text is displayed and it receives button presses from media-oriented buttons (SEEKRIGHT, SEEKLEFT, TUNEUP, TUNEDOWN, PRESET_0-9)

    "},"Constants.html#/c:@SDLHMILevelBackground":{"name":"SDLHMILevelBackground","abstract":"

    App cannot interact with user via TTS, VR, Display or Button Presses. App can perform the following operations:

    "},"Constants.html#/c:@SDLHMILevelNone":{"name":"SDLHMILevelNone","abstract":"

    Application has been discovered by SDL, but it cannot send any requests or receive any notifications

    "},"Constants.html#/c:@SDLHMIZoneCapabilitiesFront":{"name":"SDLHMIZoneCapabilitiesFront","abstract":"

    Indicates HMI available for front seat passengers.

    "},"Constants.html#/c:@SDLHMIZoneCapabilitiesBack":{"name":"SDLHMIZoneCapabilitiesBack","abstract":"

    Indicates HMI available for rear seat passengers.

    "},"Constants.html#/c:@SDLHybridAppPreferenceMobile":{"name":"SDLHybridAppPreferenceMobile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLHybridAppPreferenceCloud":{"name":"SDLHybridAppPreferenceCloud","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLHybridAppPreferenceBoth":{"name":"SDLHybridAppPreferenceBoth","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLIgnitionStableStatusNotStable":{"name":"SDLIgnitionStableStatusNotStable","abstract":"

    The current ignition switch status is considered not to be stable.

    "},"Constants.html#/c:@SDLIgnitionStableStatusStable":{"name":"SDLIgnitionStableStatusStable","abstract":"

    The current ignition switch status is considered to be stable.

    "},"Constants.html#/c:@SDLIgnitionStableStatusMissingFromTransmitter":{"name":"SDLIgnitionStableStatusMissingFromTransmitter","abstract":"

    The current ignition switch status is considered to be missing from the transmitter

    "},"Constants.html#/c:@SDLIgnitionStatusUnknown":{"name":"SDLIgnitionStatusUnknown","abstract":"

    Ignition status currently unknown

    "},"Constants.html#/c:@SDLIgnitionStatusOff":{"name":"SDLIgnitionStatusOff","abstract":"

    Ignition is off

    "},"Constants.html#/c:@SDLIgnitionStatusAccessory":{"name":"SDLIgnitionStatusAccessory","abstract":"

    Ignition is in mode accessory

    "},"Constants.html#/c:@SDLIgnitionStatusRun":{"name":"SDLIgnitionStatusRun","abstract":"

    Ignition is in mode run

    "},"Constants.html#/c:@SDLIgnitionStatusStart":{"name":"SDLIgnitionStatusStart","abstract":"

    Ignition is in mode start

    "},"Constants.html#/c:@SDLIgnitionStatusInvalid":{"name":"SDLIgnitionStatusInvalid","abstract":"

    Signal is invalid

    "},"Constants.html#/c:@SDLImageFieldNameSoftButtonImage":{"name":"SDLImageFieldNameSoftButtonImage","abstract":"

    The image field for SoftButton

    "},"Constants.html#/c:@SDLImageFieldNameChoiceImage":{"name":"SDLImageFieldNameChoiceImage","abstract":"

    The first image field for Choice.

    "},"Constants.html#/c:@SDLImageFieldNameChoiceSecondaryImage":{"name":"SDLImageFieldNameChoiceSecondaryImage","abstract":"

    The scondary image field for Choice.

    "},"Constants.html#/c:@SDLImageFieldNameVoiceRecognitionHelpItem":{"name":"SDLImageFieldNameVoiceRecognitionHelpItem","abstract":"

    The image field for vrHelpItem.

    "},"Constants.html#/c:@SDLImageFieldNameTurnIcon":{"name":"SDLImageFieldNameTurnIcon","abstract":"

    The image field for Turn.

    "},"Constants.html#/c:@SDLImageFieldNameMenuIcon":{"name":"SDLImageFieldNameMenuIcon","abstract":"

    The image field for the menu icon in SetGlobalProperties.

    "},"Constants.html#/c:@SDLImageFieldNameCommandIcon":{"name":"SDLImageFieldNameCommandIcon","abstract":"

    The image field for AddCommand."},"Constants.html#/c:@SDLImageFieldNameAppIcon":{"name":"SDLImageFieldNameAppIcon","abstract":"

    The image field for the app icon (set by setAppIcon).

    "},"Constants.html#/c:@SDLImageFieldNameGraphic":{"name":"SDLImageFieldNameGraphic","abstract":"

    The primary image field for Show."},"Constants.html#/c:@SDLImageFieldNameSecondaryGraphic":{"name":"SDLImageFieldNameSecondaryGraphic","abstract":"

    The secondary image field for Show."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTIcon":{"name":"SDLImageFieldNameShowConstantTBTIcon","abstract":"

    The primary image field for ShowConstant TBT."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTNextTurnIcon":{"name":"SDLImageFieldNameShowConstantTBTNextTurnIcon","abstract":"

    The secondary image field for ShowConstant TBT.

    "},"Constants.html#/c:@SDLImageFieldNameLocationImage":{"name":"SDLImageFieldNameLocationImage","abstract":"

    The optional image of a destination / location

    "},"Constants.html#/c:@SDLImageTypeStatic":{"name":"SDLImageTypeStatic","abstract":"

    Activate an icon that shipped with the IVI system by passing a hex value.

    "},"Constants.html#/c:@SDLImageTypeDynamic":{"name":"SDLImageTypeDynamic","abstract":"

    An icon referencing an image uploaded by the app (identifier to be sent by SDLPutFile)

    "},"Constants.html#/c:@SDLInteractionModeManualOnly":{"name":"SDLInteractionModeManualOnly","abstract":"

    Interaction Mode : Manual Only

    "},"Constants.html#/c:@SDLInteractionModeVoiceRecognitionOnly":{"name":"SDLInteractionModeVoiceRecognitionOnly","abstract":"

    Interaction Mode : VR Only

    "},"Constants.html#/c:@SDLInteractionModeBoth":{"name":"SDLInteractionModeBoth","abstract":"

    Interaction Mode : Manual & VR

    "},"Constants.html#/c:@SDLKeyboardEventKeypress":{"name":"SDLKeyboardEventKeypress","abstract":"

    The use has pressed the keyboard key (applies to both SINGLE_KEYPRESS and RESEND_CURRENT_ENTRY modes).

    "},"Constants.html#/c:@SDLKeyboardEventSubmitted":{"name":"SDLKeyboardEventSubmitted","abstract":"

    The User has finished entering text from the keyboard and submitted the entry.

    "},"Constants.html#/c:@SDLKeyboardEventCancelled":{"name":"SDLKeyboardEventCancelled","abstract":"

    The User has pressed the HMI-defined Cancel button.

    "},"Constants.html#/c:@SDLKeyboardEventAborted":{"name":"SDLKeyboardEventAborted","abstract":"

    The User has not finished entering text and the keyboard is aborted with the event of higher priority.

    "},"Constants.html#/c:@SDLKeyboardEventVoice":{"name":"SDLKeyboardEventVoice","abstract":"

    The user used voice as input for the keyboard

    "},"Constants.html#/c:@SDLKeyboardLayoutQWERTY":{"name":"SDLKeyboardLayoutQWERTY","abstract":"

    QWERTY layout (the name comes from the first six keys
    appearing on the top left letter row of the keyboard and read from left to right)

    "},"Constants.html#/c:@SDLKeyboardLayoutQWERTZ":{"name":"SDLKeyboardLayoutQWERTZ","abstract":"

    QWERTZ layout (the name comes from the first six keys
    appearing on the top left letter row of the keyboard and read from left to right)

    "},"Constants.html#/c:@SDLKeyboardLayoutAZERTY":{"name":"SDLKeyboardLayoutAZERTY","abstract":"

    AZERTY layout (the name comes from the first six keys
    appearing on the top left letter row of the keyboard and read from left to right)

    "},"Constants.html#/c:@SDLKeypressModeSingleKeypress":{"name":"SDLKeypressModeSingleKeypress","abstract":"

    SINGLE_KEYPRESS:
    Each and every User`s keypress must be reported (new notification for every newly entered single symbol).

    "},"Constants.html#/c:@SDLKeypressModeQueueKeypresses":{"name":"SDLKeypressModeQueueKeypresses","abstract":"

    QUEUE_KEYPRESSES:
    The whole entry is reported only after the User submits it (by ‘Search’ button click displayed on touchscreen keyboard)

    "},"Constants.html#/c:@SDLKeypressModeResendCurrentEntry":{"name":"SDLKeypressModeResendCurrentEntry","abstract":"

    RESEND_CURRENT_ENTRY:
    The whole entry must be reported each and every time the User makes a new keypress
    (new notification with all previously entered symbols and a newly entered one appended).

    "},"Constants.html#/c:@SDLLanguageEnSa":{"name":"SDLLanguageEnSa","abstract":"

    English_SA

    "},"Constants.html#/c:@SDLLanguageHeIl":{"name":"SDLLanguageHeIl","abstract":"

    Hebrew_IL

    "},"Constants.html#/c:@SDLLanguageRoRo":{"name":"SDLLanguageRoRo","abstract":"

    Romainian_RO

    "},"Constants.html#/c:@SDLLanguageUkUa":{"name":"SDLLanguageUkUa","abstract":"

    Ukrainian_UA

    "},"Constants.html#/c:@SDLLanguageIdId":{"name":"SDLLanguageIdId","abstract":"

    Indonesian_ID

    "},"Constants.html#/c:@SDLLanguageViVn":{"name":"SDLLanguageViVn","abstract":"

    Vietnamese_VN

    "},"Constants.html#/c:@SDLLanguageMsMy":{"name":"SDLLanguageMsMy","abstract":"

    Malay_MY

    "},"Constants.html#/c:@SDLLanguageHiIn":{"name":"SDLLanguageHiIn","abstract":"

    Hindi_IN

    "},"Constants.html#/c:@SDLLanguageNlBe":{"name":"SDLLanguageNlBe","abstract":"

    Dutch(Flemish)_BE

    "},"Constants.html#/c:@SDLLanguageElGr":{"name":"SDLLanguageElGr","abstract":"

    Greek_GR

    "},"Constants.html#/c:@SDLLanguageHuHu":{"name":"SDLLanguageHuHu","abstract":"

    Hungarian_HU

    "},"Constants.html#/c:@SDLLanguageFiFi":{"name":"SDLLanguageFiFi","abstract":"

    Finnish_FI

    "},"Constants.html#/c:@SDLLanguageSkSk":{"name":"SDLLanguageSkSk","abstract":"

    Slovak_SK

    "},"Constants.html#/c:@SDLLanguageEnUs":{"name":"SDLLanguageEnUs","abstract":"

    English_US

    "},"Constants.html#/c:@SDLLanguageEnIn":{"name":"SDLLanguageEnIn","abstract":"

    English - India

    "},"Constants.html#/c:@SDLLanguageThTh":{"name":"SDLLanguageThTh","abstract":"

    Thai - Thailand

    "},"Constants.html#/c:@SDLLanguageEsMx":{"name":"SDLLanguageEsMx","abstract":"

    Spanish - Mexico

    "},"Constants.html#/c:@SDLLanguageFrCa":{"name":"SDLLanguageFrCa","abstract":"

    French - Canada

    "},"Constants.html#/c:@SDLLanguageDeDe":{"name":"SDLLanguageDeDe","abstract":"

    German - Germany

    "},"Constants.html#/c:@SDLLanguageEsEs":{"name":"SDLLanguageEsEs","abstract":"

    Spanish - Spain

    "},"Constants.html#/c:@SDLLanguageEnGb":{"name":"SDLLanguageEnGb","abstract":"

    English - Great Britain

    "},"Constants.html#/c:@SDLLanguageRuRu":{"name":"SDLLanguageRuRu","abstract":"

    Russian - Russia

    "},"Constants.html#/c:@SDLLanguageTrTr":{"name":"SDLLanguageTrTr","abstract":"

    Turkish - Turkey

    "},"Constants.html#/c:@SDLLanguagePlPl":{"name":"SDLLanguagePlPl","abstract":"

    Polish - Poland

    "},"Constants.html#/c:@SDLLanguageFrFr":{"name":"SDLLanguageFrFr","abstract":"

    French - France

    "},"Constants.html#/c:@SDLLanguageItIt":{"name":"SDLLanguageItIt","abstract":"

    Italian - Italy

    "},"Constants.html#/c:@SDLLanguageSvSe":{"name":"SDLLanguageSvSe","abstract":"

    Swedish - Sweden

    "},"Constants.html#/c:@SDLLanguagePtPt":{"name":"SDLLanguagePtPt","abstract":"

    Portuguese - Portugal

    "},"Constants.html#/c:@SDLLanguageNlNl":{"name":"SDLLanguageNlNl","abstract":"

    Dutch (Standard) - Netherlands

    "},"Constants.html#/c:@SDLLanguageEnAu":{"name":"SDLLanguageEnAu","abstract":"

    English - Australia

    "},"Constants.html#/c:@SDLLanguageZhCn":{"name":"SDLLanguageZhCn","abstract":"

    Mandarin - China

    "},"Constants.html#/c:@SDLLanguageZhTw":{"name":"SDLLanguageZhTw","abstract":"

    Mandarin - Taiwan

    "},"Constants.html#/c:@SDLLanguageJaJp":{"name":"SDLLanguageJaJp","abstract":"

    Japanese - Japan

    "},"Constants.html#/c:@SDLLanguageArSa":{"name":"SDLLanguageArSa","abstract":"

    Arabic - Saudi Arabia

    "},"Constants.html#/c:@SDLLanguageKoKr":{"name":"SDLLanguageKoKr","abstract":"

    Korean - South Korea

    "},"Constants.html#/c:@SDLLanguagePtBr":{"name":"SDLLanguagePtBr","abstract":"

    Portuguese - Brazil

    "},"Constants.html#/c:@SDLLanguageCsCz":{"name":"SDLLanguageCsCz","abstract":"

    Czech - Czech Republic

    "},"Constants.html#/c:@SDLLanguageDaDk":{"name":"SDLLanguageDaDk","abstract":"

    Danish - Denmark

    "},"Constants.html#/c:@SDLLanguageNoNo":{"name":"SDLLanguageNoNo","abstract":"

    Norwegian - Norway

    "},"Constants.html#/c:@SDLLayoutModeIconOnly":{"name":"SDLLayoutModeIconOnly","abstract":"

    This mode causes the interaction to display the previous set of choices as icons.

    "},"Constants.html#/c:@SDLLayoutModeIconWithSearch":{"name":"SDLLayoutModeIconWithSearch","abstract":"

    This mode causes the interaction to display the previous set of choices as icons along with a search field in the HMI.

    "},"Constants.html#/c:@SDLLayoutModeListOnly":{"name":"SDLLayoutModeListOnly","abstract":"

    This mode causes the interaction to display the previous set of choices as a list.

    "},"Constants.html#/c:@SDLLayoutModeListWithSearch":{"name":"SDLLayoutModeListWithSearch","abstract":"

    This mode causes the interaction to display the previous set of choices as a list along with a search field in the HMI.

    "},"Constants.html#/c:@SDLLayoutModeKeyboard":{"name":"SDLLayoutModeKeyboard","abstract":"

    This mode causes the interaction to immediately display a keyboard entry through the HMI.

    "},"Constants.html#/c:@SDLLightNameFrontLeftHighBeam":{"name":"SDLLightNameFrontLeftHighBeam","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_HIGH_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontRightHighBeam":{"name":"SDLLightNameFrontRightHighBeam","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_HIGH_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontLeftLowBeam":{"name":"SDLLightNameFrontLeftLowBeam","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_LOW_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontRightLowBeam":{"name":"SDLLightNameFrontRightLowBeam","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_LOW_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontLeftParkingLight":{"name":"SDLLightNameFrontLeftParkingLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_PARKING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightParkingLight":{"name":"SDLLightNameFrontRightParkingLight","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_PARKING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontLeftFogLight":{"name":"SDLLightNameFrontLeftFogLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_FOG_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightFogLight":{"name":"SDLLightNameFrontRightFogLight","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_FOG_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontLeftDaytimeRunningLight":{"name":"SDLLightNameFrontLeftDaytimeRunningLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_DAYTIME_RUNNING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightDaytimeRunningLight":{"name":"SDLLightNameFrontRightDaytimeRunningLight","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_DAYTIME_RUNNING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontLeftTurnLight":{"name":"SDLLightNameFrontLeftTurnLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightTurnLight":{"name":"SDLLightNameFrontRightTurnLight","abstract":"

    @abstract Represents the Light with name FRONT_Right_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftFogLight":{"name":"SDLLightNameRearLeftFogLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_FOG_LIGHT.

    "},"Constants.html#/c:@SDLLightNameRearRightFogLight":{"name":"SDLLightNameRearRightFogLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_FOG_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftTailLight":{"name":"SDLLightNameRearLeftTailLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_TAIL_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRightTailLight":{"name":"SDLLightNameRearRightTailLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_TAIL_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftBrakeLight":{"name":"SDLLightNameRearLeftBrakeLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_BRAKE_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRightBrakeLight":{"name":"SDLLightNameRearRightBrakeLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_BRAKE_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftTurnLight":{"name":"SDLLightNameRearLeftTurnLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRightTurnLight":{"name":"SDLLightNameRearRightTurnLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRegistrationPlateLight":{"name":"SDLLightNameRearRegistrationPlateLight","abstract":"

    @abstract Represents the Light with name REAR_REGISTRATION_PLATE_LIGHT

    "},"Constants.html#/c:@SDLLightNameHighBeams":{"name":"SDLLightNameHighBeams","abstract":"

    @abstract Include all high beam lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameLowBeams":{"name":"SDLLightNameLowBeams","abstract":"

    @abstract Include all low beam lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameFogLights":{"name":"SDLLightNameFogLights","abstract":"

    @abstract Include all fog lights: front_left, front_right, rear_left and rear_right.

    "},"Constants.html#/c:@SDLLightNameRunningLights":{"name":"SDLLightNameRunningLights","abstract":"

    @abstract Include all daytime running lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameParkingLights":{"name":"SDLLightNameParkingLights","abstract":"

    @abstract Include all parking lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameBrakeLights":{"name":"SDLLightNameBrakeLights","abstract":"

    @abstract Include all brake lights: rear_left and rear_right.

    "},"Constants.html#/c:@SDLLightNameRearReversingLights":{"name":"SDLLightNameRearReversingLights","abstract":"

    @abstract Represents the Light with name REAR_REVERSING_LIGHTS

    "},"Constants.html#/c:@SDLLightNameSideMarkerLights":{"name":"SDLLightNameSideMarkerLights","abstract":"

    @abstract Represents the Light with name SIDE_MARKER_LIGHTS

    "},"Constants.html#/c:@SDLLightNameLeftTurnLights":{"name":"SDLLightNameLeftTurnLights","abstract":"

    @abstract Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted.

    "},"Constants.html#/c:@SDLLightNameRightTurnLights":{"name":"SDLLightNameRightTurnLights","abstract":"

    @abstract Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted.

    "},"Constants.html#/c:@SDLLightNameHazardLights":{"name":"SDLLightNameHazardLights","abstract":"

    @abstract Include all hazard lights: front_left, front_right, rear_left and rear_right.

    "},"Constants.html#/c:@SDLLightNameAmbientLights":{"name":"SDLLightNameAmbientLights","abstract":"

    @abstract Represents the Light with name AMBIENT_LIGHTS

    "},"Constants.html#/c:@SDLLightNameOverHeadLights":{"name":"SDLLightNameOverHeadLights","abstract":"

    @abstract Represents the Light with name OVERHEAD_LIGHTS

    "},"Constants.html#/c:@SDLLightNameReadingLights":{"name":"SDLLightNameReadingLights","abstract":"

    @abstract Represents the Light with name READING_LIGHTS

    "},"Constants.html#/c:@SDLLightNameTrunkLights":{"name":"SDLLightNameTrunkLights","abstract":"

    @abstract Represents the Light with name TRUNK_LIGHTS

    "},"Constants.html#/c:@SDLLightNameExteriorFrontLights":{"name":"SDLLightNameExteriorFrontLights","abstract":"

    @abstract Include exterior lights located in front of the vehicle. For example, fog lights and low beams.

    "},"Constants.html#/c:@SDLLightNameExteriorRearLights":{"name":"SDLLightNameExteriorRearLights","abstract":"

    @abstract Include exterior lights located at the back of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorLeftLights":{"name":"SDLLightNameExteriorLeftLights","abstract":"

    @abstract Include exterior lights located at the left side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRightLights":{"name":"SDLLightNameExteriorRightLights","abstract":"

    @abstract Include exterior lights located at the right side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRearCargoLights":{"name":"SDLLightNameExteriorRearCargoLights","abstract":"

    @abstract Cargo lamps illuminate the cargo area.

    "},"Constants.html#/c:@SDLLightNameExteriorRearTruckBedLights":{"name":"SDLLightNameExteriorRearTruckBedLights","abstract":"

    @abstract Truck bed lamps light up the bed of the truck.

    "},"Constants.html#/c:@SDLLightNameExteriorRearTrailerLights":{"name":"SDLLightNameExteriorRearTrailerLights","abstract":"

    @abstract Trailer lights are lamps mounted on a trailer hitch.

    "},"Constants.html#/c:@SDLLightNameExteriorLeftSpotLights":{"name":"SDLLightNameExteriorLeftSpotLights","abstract":"

    @abstract It is the spotlights mounted on the left side of a vehicle.

    "},"Constants.html#/c:@SDLLightNameExteriorRightSpotLights":{"name":"SDLLightNameExteriorRightSpotLights","abstract":"

    @abstract It is the spotlights mounted on the right side of a vehicle.

    "},"Constants.html#/c:@SDLLightNameExteriorLeftPuddleLights":{"name":"SDLLightNameExteriorLeftPuddleLights","abstract":"

    @abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.

    "},"Constants.html#/c:@SDLLightNameExteriorRightPuddleLights":{"name":"SDLLightNameExteriorRightPuddleLights","abstract":"

    @abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.

    "},"Constants.html#/c:@SDLLightNameExteriorAllLights":{"name":"SDLLightNameExteriorAllLights","abstract":"

    @abstract Include all exterior lights around the vehicle.

    "},"Constants.html#/c:@SDLLightStatusOn":{"name":"SDLLightStatusOn","abstract":"

    @abstract Light status currently on.

    "},"Constants.html#/c:@SDLLightStatusOFF":{"name":"SDLLightStatusOFF","abstract":"

    @abstract Light status currently Off.

    "},"Constants.html#/c:@SDLLightStatusRampUp":{"name":"SDLLightStatusRampUp","abstract":"

    @abstract Light status currently RAMP_UP.

    "},"Constants.html#/c:@SDLLightStatusRampDown":{"name":"SDLLightStatusRampDown","abstract":"

    @abstract Light status currently RAMP_DOWN.

    "},"Constants.html#/c:@SDLLightStatusUnknown":{"name":"SDLLightStatusUnknown","abstract":"

    @abstract Light status currently UNKNOWN.

    "},"Constants.html#/c:@SDLLightStatusInvalid":{"name":"SDLLightStatusInvalid","abstract":"

    @abstract Light status currently INVALID.

    "},"Constants.html#/c:@SDLLockScreenStatusOff":{"name":"SDLLockScreenStatusOff","abstract":"

    LockScreen is Not Required

    "},"Constants.html#/c:@SDLLockScreenStatusOptional":{"name":"SDLLockScreenStatusOptional","abstract":"

    LockScreen is Optional

    "},"Constants.html#/c:@SDLLockScreenStatusRequired":{"name":"SDLLockScreenStatusRequired","abstract":"

    LockScreen is Not Required

    "},"Constants.html#/c:@SDLMaintenanceModeStatusNormal":{"name":"SDLMaintenanceModeStatusNormal","abstract":"

    Maintenance Mode Status : Normal

    "},"Constants.html#/c:@SDLMaintenanceModeStatusNear":{"name":"SDLMaintenanceModeStatusNear","abstract":"

    Maintenance Mode Status : Near

    "},"Constants.html#/c:@SDLMaintenanceModeStatusActive":{"name":"SDLMaintenanceModeStatusActive","abstract":"

    Maintenance Mode Status : Active

    "},"Constants.html#/c:@SDLMaintenanceModeStatusFeatureNotPresent":{"name":"SDLMaintenanceModeStatusFeatureNotPresent","abstract":"

    Maintenance Mode Status : Feature not present

    "},"Constants.html#/c:@SDLMassageCushionTopLumbar":{"name":"SDLMassageCushionTopLumbar","abstract":"

    @abstract TOP LUMBAR cushions of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionMiddleLumbar":{"name":"SDLMassageCushionMiddleLumbar","abstract":"

    @abstract MIDDLE LUMBAR cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionBottomLumbar":{"name":"SDLMassageCushionBottomLumbar","abstract":"

    @abstract BOTTOM LUMBAR cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionBackBolsters":{"name":"SDLMassageCushionBackBolsters","abstract":"

    @abstract BACK BOLSTERS cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionSeatBolsters":{"name":"SDLMassageCushionSeatBolsters","abstract":"

    @abstract SEAT BOLSTERS cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageModeOff":{"name":"SDLMassageModeOff","abstract":"

    @abstract Massage Mode Status : OFF

    "},"Constants.html#/c:@SDLMassageModeLow":{"name":"SDLMassageModeLow","abstract":"

    @abstract Massage Mode Status : LOW

    "},"Constants.html#/c:@SDLMassageModeHigh":{"name":"SDLMassageModeHigh","abstract":"

    @abstract Massage Mode Status : HIGH

    "},"Constants.html#/c:@SDLMassageZoneLumbar":{"name":"SDLMassageZoneLumbar","abstract":"

    @abstract The back of a multi-contour massage seat. or SEAT_BACK

    "},"Constants.html#/c:@SDLMassageZoneSeatCushion":{"name":"SDLMassageZoneSeatCushion","abstract":"

    @abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM

    "},"Constants.html#/c:@SDLMediaClockFormatClock1":{"name":"SDLMediaClockFormatClock1","abstract":"

    Media clock format: Clock1

    "},"Constants.html#/c:@SDLMediaClockFormatClock2":{"name":"SDLMediaClockFormatClock2","abstract":"

    Media clock format: Clock2

    "},"Constants.html#/c:@SDLMediaClockFormatClock3":{"name":"SDLMediaClockFormatClock3","abstract":"

    Media clock format: Clock3

    "},"Constants.html#/c:@SDLMediaClockFormatClockText1":{"name":"SDLMediaClockFormatClockText1","abstract":"

    Media clock format: ClockText1

    "},"Constants.html#/c:@SDLMediaClockFormatClockText2":{"name":"SDLMediaClockFormatClockText2","abstract":"

    Media clock format: ClockText2

    "},"Constants.html#/c:@SDLMediaClockFormatClockText3":{"name":"SDLMediaClockFormatClockText3","abstract":"

    Media clock format: ClockText3

    "},"Constants.html#/c:@SDLMediaClockFormatClockText4":{"name":"SDLMediaClockFormatClockText4","abstract":"

    Media clock format: ClockText4

    "},"Constants.html#/c:@SDLMediaTypeMusic":{"name":"SDLMediaTypeMusic","abstract":"

    The app will have a media type of music.

    "},"Constants.html#/c:@SDLMediaTypePodcast":{"name":"SDLMediaTypePodcast","abstract":"

    The app will have a media type of podcast.

    "},"Constants.html#/c:@SDLMediaTypeAudiobook":{"name":"SDLMediaTypeAudiobook","abstract":"

    The app will have a media type of audiobook.

    "},"Constants.html#/c:@SDLMediaTypeOther":{"name":"SDLMediaTypeOther","abstract":"

    The app will have a media type of other.

    "},"Constants.html#/c:@SDLMetadataTypeMediaTitle":{"name":"SDLMetadataTypeMediaTitle","abstract":"

    The song / media title name

    "},"Constants.html#/c:@SDLMetadataTypeMediaArtist":{"name":"SDLMetadataTypeMediaArtist","abstract":"

    The artist of the media

    "},"Constants.html#/c:@SDLMetadataTypeMediaAlbum":{"name":"SDLMetadataTypeMediaAlbum","abstract":"

    The album of the media"

    "},"Constants.html#/c:@SDLMetadataTypeMediaYear":{"name":"SDLMetadataTypeMediaYear","abstract":"

    The year that the media was created

    "},"Constants.html#/c:@SDLMetadataTypeMediaGenre":{"name":"SDLMetadataTypeMediaGenre","abstract":"

    The genre of the media

    "},"Constants.html#/c:@SDLMetadataTypeMediaStation":{"name":"SDLMetadataTypeMediaStation","abstract":"

    The station that the media is playing on

    "},"Constants.html#/c:@SDLMetadataTypeRating":{"name":"SDLMetadataTypeRating","abstract":"

    The rating given to the media

    "},"Constants.html#/c:@SDLMetadataTypeCurrentTemperature":{"name":"SDLMetadataTypeCurrentTemperature","abstract":"

    The current temperature of the weather information

    "},"Constants.html#/c:@SDLMetadataTypeMaximumTemperature":{"name":"SDLMetadataTypeMaximumTemperature","abstract":"

    The high / maximum temperature of the weather information for the current period

    "},"Constants.html#/c:@SDLMetadataTypeMinimumTemperature":{"name":"SDLMetadataTypeMinimumTemperature","abstract":"

    The low / minimum temperature of the weather information for the current period

    "},"Constants.html#/c:@SDLMetadataTypeWeatherTerm":{"name":"SDLMetadataTypeWeatherTerm","abstract":"

    A description of the weather for the current period

    "},"Constants.html#/c:@SDLMetadataTypeHumidity":{"name":"SDLMetadataTypeHumidity","abstract":"

    The humidity of the weather information for the current period

    "},"Constants.html#/c:@SDLModuleTypeClimate":{"name":"SDLModuleTypeClimate","abstract":"

    A SDLModuleType with the value of CLIMATE

    "},"Constants.html#/c:@SDLModuleTypeRadio":{"name":"SDLModuleTypeRadio","abstract":"

    A SDLModuleType with the value of RADIO

    "},"Constants.html#/c:@SDLModuleTypeSeat":{"name":"SDLModuleTypeSeat","abstract":"

    A SDLModuleType with the value of SEAT

    "},"Constants.html#/c:@SDLModuleTypeAudio":{"name":"SDLModuleTypeAudio","abstract":"

    A SDLModuleType with the value of AUDIO

    "},"Constants.html#/c:@SDLModuleTypeLight":{"name":"SDLModuleTypeLight","abstract":"

    A SDLModuleType with the value of LIGHT

    "},"Constants.html#/c:@SDLModuleTypeHMISettings":{"name":"SDLModuleTypeHMISettings","abstract":"

    A SDLModuleType with the value of HMI_SETTINGS

    "},"Constants.html#/c:@SDLNavigationActionTurn":{"name":"SDLNavigationActionTurn","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionExit":{"name":"SDLNavigationActionExit","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionStay":{"name":"SDLNavigationActionStay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionMerge":{"name":"SDLNavigationActionMerge","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionFerry":{"name":"SDLNavigationActionFerry","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionCarShuttleTrain":{"name":"SDLNavigationActionCarShuttleTrain","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionWaypoint":{"name":"SDLNavigationActionWaypoint","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionRegular":{"name":"SDLNavigationJunctionRegular","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionBifurcation":{"name":"SDLNavigationJunctionBifurcation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionMultiCarriageway":{"name":"SDLNavigationJunctionMultiCarriageway","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionRoundabout":{"name":"SDLNavigationJunctionRoundabout","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionTraversableRoundabout":{"name":"SDLNavigationJunctionTraversableRoundabout","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionJughandle":{"name":"SDLNavigationJunctionJughandle","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionAllWayYield":{"name":"SDLNavigationJunctionAllWayYield","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionTurnAround":{"name":"SDLNavigationJunctionTurnAround","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNotificationUserInfoObject":{"name":"SDLNotificationUserInfoObject","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTransportDidDisconnect":{"name":"SDLTransportDidDisconnect","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTransportDidConnect":{"name":"SDLTransportDidConnect","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTransportConnectError":{"name":"SDLTransportConnectError","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveError":{"name":"SDLDidReceiveError","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveLockScreenIcon":{"name":"SDLDidReceiveLockScreenIcon","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidBecomeReady":{"name":"SDLDidBecomeReady","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidUpdateProjectionView":{"name":"SDLDidUpdateProjectionView","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddCommandResponse":{"name":"SDLDidReceiveAddCommandResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddSubMenuResponse":{"name":"SDLDidReceiveAddSubMenuResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertResponse":{"name":"SDLDidReceiveAlertResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertManeuverResponse":{"name":"SDLDidReceiveAlertManeuverResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonPressResponse":{"name":"SDLDidReceiveButtonPressResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse":{"name":"SDLDidReceiveChangeRegistrationResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse":{"name":"SDLDidReceiveCreateInteractionChoiceSetResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteCommandResponse":{"name":"SDLDidReceiveDeleteCommandResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteFileResponse":{"name":"SDLDidReceiveDeleteFileResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse":{"name":"SDLDidReceiveDeleteInteractionChoiceSetResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse":{"name":"SDLDidReceiveDeleteSubmenuResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse":{"name":"SDLDidReceiveDiagnosticMessageResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDialNumberResponse":{"name":"SDLDidReceiveDialNumberResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse":{"name":"SDLDidReceiveEncodedSyncPDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse":{"name":"SDLDidReceiveEndAudioPassThruResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGenericResponse":{"name":"SDLDidReceiveGenericResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesResponse":{"name":"SDLDidReceiveGetCloudAppPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataResponse":{"name":"SDLDidReceiveGetAppServiceDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetDTCsResponse":{"name":"SDLDidReceiveGetDTCsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetFileResponse":{"name":"SDLDidReceiveGetFileResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilitiesResponse":{"name":"SDLDidReceiveGetSystemCapabilitiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse":{"name":"SDLDidReceiveGetVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetWaypointsResponse":{"name":"SDLDidReceiveGetWaypointsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveListFilesResponse":{"name":"SDLDidReceiveListFilesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionResponse":{"name":"SDLDidReceivePerformAppServiceInteractionResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse":{"name":"SDLDidReceivePerformAudioPassThruResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformInteractionResponse":{"name":"SDLDidReceivePerformInteractionResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePublishAppServiceResponse":{"name":"SDLDidReceivePublishAppServiceResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePutFileResponse":{"name":"SDLDidReceivePutFileResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveReadDIDResponse":{"name":"SDLDidReceiveReadDIDResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse":{"name":"SDLDidReceiveRegisterAppInterfaceResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse":{"name":"SDLDidReceiveResetGlobalPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveScrollableMessageResponse":{"name":"SDLDidReceiveScrollableMessageResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendHapticDataResponse":{"name":"SDLDidReceiveSendHapticDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendLocationResponse":{"name":"SDLDidReceiveSendLocationResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetAppIconResponse":{"name":"SDLDidReceiveSetAppIconResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesResponse":{"name":"SDLDidReceiveSetCloudAppPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse":{"name":"SDLDidReceiveSetDisplayLayoutResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse":{"name":"SDLDidReceiveSetGlobalPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataResponse":{"name":"SDLDidReceiveSetInteriorVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse":{"name":"SDLDidReceiveSetMediaClockTimerResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse":{"name":"SDLDidReceiveShowConstantTBTResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowResponse":{"name":"SDLDidReceiveShowResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSliderResponse":{"name":"SDLDidReceiveSliderResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSpeakResponse":{"name":"SDLDidReceiveSpeakResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse":{"name":"SDLDidReceiveSubscribeButtonResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse":{"name":"SDLDidReceiveSubscribeVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeWaypointsResponse":{"name":"SDLDidReceiveSubscribeWaypointsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse":{"name":"SDLDidReceiveUpdateTurnListResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse":{"name":"SDLDidReceiveUnregisterAppInterfaceResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse":{"name":"SDLDidReceiveUnsubscribeButtonResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse":{"name":"SDLDidReceiveUnsubscribeVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeWaypointsResponse":{"name":"SDLDidReceiveUnsubscribeWaypointsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddCommandRequest":{"name":"SDLDidReceiveAddCommandRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddSubMenuRequest":{"name":"SDLDidReceiveAddSubMenuRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertRequest":{"name":"SDLDidReceiveAlertRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertManeuverRequest":{"name":"SDLDidReceiveAlertManeuverRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonPressRequest":{"name":"SDLDidReceiveButtonPressRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveChangeRegistrationRequest":{"name":"SDLDidReceiveChangeRegistrationRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetRequest":{"name":"SDLDidReceiveCreateInteractionChoiceSetRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteCommandRequest":{"name":"SDLDidReceiveDeleteCommandRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteFileRequest":{"name":"SDLDidReceiveDeleteFileRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetRequest":{"name":"SDLDidReceiveDeleteInteractionChoiceSetRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteSubMenuRequest":{"name":"SDLDidReceiveDeleteSubMenuRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageRequest":{"name":"SDLDidReceiveDiagnosticMessageRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDialNumberRequest":{"name":"SDLDidReceiveDialNumberRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataRequest":{"name":"SDLDidReceiveEncodedSyncPDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruRequest":{"name":"SDLDidReceiveEndAudioPassThruRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataRequest":{"name":"SDLDidReceiveGetAppServiceDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesRequest":{"name":"SDLDidReceiveGetCloudAppPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetDTCsRequest":{"name":"SDLDidReceiveGetDTCsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetFileRequest":{"name":"SDLDidReceiveGetFileRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilityRequest":{"name":"SDLDidReceiveGetSystemCapabilityRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetVehicleDataRequest":{"name":"SDLDidReceiveGetVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetWayPointsRequest":{"name":"SDLDidReceiveGetWayPointsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveListFilesRequest":{"name":"SDLDidReceiveListFilesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionRequest":{"name":"SDLDidReceivePerformAppServiceInteractionRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruRequest":{"name":"SDLDidReceivePerformAudioPassThruRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformInteractionRequest":{"name":"SDLDidReceivePerformInteractionRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePublishAppServiceRequest":{"name":"SDLDidReceivePublishAppServiceRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePutFileRequest":{"name":"SDLDidReceivePutFileRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveReadDIDRequest":{"name":"SDLDidReceiveReadDIDRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceRequest":{"name":"SDLDidReceiveRegisterAppInterfaceRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesRequest":{"name":"SDLDidReceiveResetGlobalPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveScrollableMessageRequest":{"name":"SDLDidReceiveScrollableMessageRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendHapticDataRequest":{"name":"SDLDidReceiveSendHapticDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendLocationRequest":{"name":"SDLDidReceiveSendLocationRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetAppIconRequest":{"name":"SDLDidReceiveSetAppIconRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesRequest":{"name":"SDLDidReceiveSetCloudAppPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutRequest":{"name":"SDLDidReceiveSetDisplayLayoutRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesRequest":{"name":"SDLDidReceiveSetGlobalPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataRequest":{"name":"SDLDidReceiveSetInteriorVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerRequest":{"name":"SDLDidReceiveSetMediaClockTimerRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowRequest":{"name":"SDLDidReceiveShowRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowConstantTBTRequest":{"name":"SDLDidReceiveShowConstantTBTRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSliderRequest":{"name":"SDLDidReceiveSliderRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSpeakRequest":{"name":"SDLDidReceiveSpeakRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeButtonRequest":{"name":"SDLDidReceiveSubscribeButtonRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataRequest":{"name":"SDLDidReceiveSubscribeVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeWayPointsRequest":{"name":"SDLDidReceiveSubscribeWayPointsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSyncPDataRequest":{"name":"SDLDidReceiveSyncPDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSystemRequestRequest":{"name":"SDLDidReceiveSystemRequestRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceRequest":{"name":"SDLDidReceiveUnregisterAppInterfaceRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonRequest":{"name":"SDLDidReceiveUnsubscribeButtonRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataRequest":{"name":"SDLDidReceiveUnsubscribeVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeWayPointsRequest":{"name":"SDLDidReceiveUnsubscribeWayPointsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUpdateTurnListRequest":{"name":"SDLDidReceiveUpdateTurnListRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification":{"name":"SDLDidChangeDriverDistractionStateNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeHMIStatusNotification":{"name":"SDLDidChangeHMIStatusNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAppServiceDataNotification":{"name":"SDLDidReceiveAppServiceDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification":{"name":"SDLDidReceiveAppUnregisteredNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAudioPassThruNotification":{"name":"SDLDidReceiveAudioPassThruNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonEventNotification":{"name":"SDLDidReceiveButtonEventNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonPressNotification":{"name":"SDLDidReceiveButtonPressNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveCommandNotification":{"name":"SDLDidReceiveCommandNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEncodedDataNotification":{"name":"SDLDidReceiveEncodedDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveInteriorVehicleDataNotification":{"name":"SDLDidReceiveInteriorVehicleDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveKeyboardInputNotification":{"name":"SDLDidReceiveKeyboardInputNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeLanguageNotification":{"name":"SDLDidChangeLanguageNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeLockScreenStatusNotification":{"name":"SDLDidChangeLockScreenStatusNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveNewHashNotification":{"name":"SDLDidReceiveNewHashNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveVehicleIconNotification":{"name":"SDLDidReceiveVehicleIconNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangePermissionsNotification":{"name":"SDLDidChangePermissionsNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveRemoteControlStatusNotification":{"name":"SDLDidReceiveRemoteControlStatusNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSystemCapabilityUpdatedNotification":{"name":"SDLDidReceiveSystemCapabilityUpdatedNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSystemRequestNotification":{"name":"SDLDidReceiveSystemRequestNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification":{"name":"SDLDidChangeTurnByTurnStateNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveTouchEventNotification":{"name":"SDLDidReceiveTouchEventNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveVehicleDataNotification":{"name":"SDLDidReceiveVehicleDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveWaypointNotification":{"name":"SDLDidReceiveWaypointNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLPRNDLPark":{"name":"SDLPRNDLPark","abstract":"

    Park

    "},"Constants.html#/c:@SDLPRNDLReverse":{"name":"SDLPRNDLReverse","abstract":"

    Reverse gear

    "},"Constants.html#/c:@SDLPRNDLNeutral":{"name":"SDLPRNDLNeutral","abstract":"

    No gear

    "},"Constants.html#/c:@SDLPRNDLDrive":{"name":"SDLPRNDLDrive","abstract":"

    @abstract: Drive gear

    "},"Constants.html#/c:@SDLPRNDLSport":{"name":"SDLPRNDLSport","abstract":"

    Drive Sport mode

    "},"Constants.html#/c:@SDLPRNDLLowGear":{"name":"SDLPRNDLLowGear","abstract":"

    1st gear hold

    "},"Constants.html#/c:@SDLPRNDLFirst":{"name":"SDLPRNDLFirst","abstract":"

    First gear

    "},"Constants.html#/c:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"

    Second gear

    "},"Constants.html#/c:@SDLPRNDLThird":{"name":"SDLPRNDLThird","abstract":"

    Third gear

    "},"Constants.html#/c:@SDLPRNDLFourth":{"name":"SDLPRNDLFourth","abstract":"

    Fourth gear

    "},"Constants.html#/c:@SDLPRNDLFifth":{"name":"SDLPRNDLFifth","abstract":"

    Fifth gear

    "},"Constants.html#/c:@SDLPRNDLSixth":{"name":"SDLPRNDLSixth","abstract":"

    Sixth gear

    "},"Constants.html#/c:@SDLPRNDLSeventh":{"name":"SDLPRNDLSeventh","abstract":"

    Seventh gear

    "},"Constants.html#/c:@SDLPRNDLEighth":{"name":"SDLPRNDLEighth","abstract":"

    Eighth gear

    "},"Constants.html#/c:@SDLPRNDLUnknown":{"name":"SDLPRNDLUnknown","abstract":"

    Unknown

    "},"Constants.html#/c:@SDLPRNDLFault":{"name":"SDLPRNDLFault","abstract":"

    Fault

    "},"Constants.html#/c:@SDLPermissionStatusAllowed":{"name":"SDLPermissionStatusAllowed","abstract":"

    permission: allowed

    "},"Constants.html#/c:@SDLPermissionStatusDisallowed":{"name":"SDLPermissionStatusDisallowed","abstract":"

    permission: disallowed

    "},"Constants.html#/c:@SDLPermissionStatusUserDisallowed":{"name":"SDLPermissionStatusUserDisallowed","abstract":"

    permission: user disallowed

    "},"Constants.html#/c:@SDLPermissionStatusUserConsentPending":{"name":"SDLPermissionStatusUserConsentPending","abstract":"

    permission: user consent pending

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusUndefined":{"name":"SDLPowerModeQualificationStatusUndefined","abstract":"

    An undefined status

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusEvaluationInProgress":{"name":"SDLPowerModeQualificationStatusEvaluationInProgress","abstract":"

    An evaluation in progress status

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusNotDefined":{"name":"SDLPowerModeQualificationStatusNotDefined","abstract":"

    A not defined status

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusOk":{"name":"SDLPowerModeQualificationStatusOk","abstract":"

    An ok status

    "},"Constants.html#/c:@SDLPowerModeStatusKeyOut":{"name":"SDLPowerModeStatusKeyOut","abstract":"

    The key is not in the ignition, and the power is off

    "},"Constants.html#/c:@SDLPowerModeStatusKeyRecentlyOut":{"name":"SDLPowerModeStatusKeyRecentlyOut","abstract":"

    The key is not in the ignition and it was just recently removed

    "},"Constants.html#/c:@SDLPowerModeStatusKeyApproved":{"name":"SDLPowerModeStatusKeyApproved","abstract":"

    The key is not in the ignition, but an approved key is available

    "},"Constants.html#/c:@SDLPowerModeStatusPostAccessory":{"name":"SDLPowerModeStatusPostAccessory","abstract":"

    We are in a post-accessory power situation

    "},"Constants.html#/c:@SDLPowerModeStatusAccessory":{"name":"SDLPowerModeStatusAccessory","abstract":"

    The car is in accessory power mode

    "},"Constants.html#/c:@SDLPowerModeStatusPostIgnition":{"name":"SDLPowerModeStatusPostIgnition","abstract":"

    We are in a post-ignition power situation

    "},"Constants.html#/c:@SDLPowerModeStatusIgnitionOn":{"name":"SDLPowerModeStatusIgnitionOn","abstract":"

    The ignition is on but the car is not yet running

    "},"Constants.html#/c:@SDLPowerModeStatusRunning":{"name":"SDLPowerModeStatusRunning","abstract":"

    The ignition is on and the car is running

    "},"Constants.html#/c:@SDLPowerModeStatusCrank":{"name":"SDLPowerModeStatusCrank","abstract":"

    We are in a crank power situation

    "},"Constants.html#/c:@SDLPredefinedLayoutDefault":{"name":"SDLPredefinedLayoutDefault","abstract":"

    A default layout

    "},"Constants.html#/c:@SDLPredefinedLayoutMedia":{"name":"SDLPredefinedLayoutMedia","abstract":"

    The default media layout

    "},"Constants.html#/c:@SDLPredefinedLayoutNonMedia":{"name":"SDLPredefinedLayoutNonMedia","abstract":"

    The default non-media layout

    "},"Constants.html#/c:@SDLPredefinedLayoutOnscreenPresets":{"name":"SDLPredefinedLayoutOnscreenPresets","abstract":"

    A media layout containing preset buttons

    "},"Constants.html#/c:@SDLPredefinedLayoutNavigationFullscreenMap":{"name":"SDLPredefinedLayoutNavigationFullscreenMap","abstract":"

    The default navigation layout with a fullscreen map

    "},"Constants.html#/c:@SDLPredefinedLayoutNavigationList":{"name":"SDLPredefinedLayoutNavigationList","abstract":"

    A list layout used for navigation apps

    "},"Constants.html#/c:@SDLPredefinedLayoutNavigationKeyboard":{"name":"SDLPredefinedLayoutNavigationKeyboard","abstract":"

    A keyboard layout used for navigation apps

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithText":{"name":"SDLPredefinedLayoutGraphicWithText","abstract":"

    A layout with a single graphic on the left and text on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTextWithGraphic":{"name":"SDLPredefinedLayoutTextWithGraphic","abstract":"

    A layout with text on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTilesOnly":{"name":"SDLPredefinedLayoutTilesOnly","abstract":"

    A layout with only softbuttons placed in a tile layout

    "},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsOnly":{"name":"SDLPredefinedLayoutTextButtonsOnly","abstract":"

    A layout with only soft buttons that only accept text

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTiles":{"name":"SDLPredefinedLayoutGraphicWithTiles","abstract":"

    A layout with a single graphic on the left and soft buttons in a tile layout on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTilesWithGraphic":{"name":"SDLPredefinedLayoutTilesWithGraphic","abstract":"

    A layout with soft buttons in a tile layout on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextAndSoftButtons":{"name":"SDLPredefinedLayoutGraphicWithTextAndSoftButtons","abstract":"

    A layout with a single graphic on the left and both text and soft buttons on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTextAndSoftButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextAndSoftButtonsWithGraphic","abstract":"

    A layout with both text and soft buttons on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextButtons":{"name":"SDLPredefinedLayoutGraphicWithTextButtons","abstract":"

    A layout with a single graphic on the left and text-only soft buttons on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextButtonsWithGraphic","abstract":"

    A layout with text-only soft buttons on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutLargeGraphicWithSoftButtons","abstract":"

    A layout with a single large graphic and soft buttons

    "},"Constants.html#/c:@SDLPredefinedLayoutDoubleGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutDoubleGraphicWithSoftButtons","abstract":"

    A layout with two graphics and soft buttons

    "},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicOnly":{"name":"SDLPredefinedLayoutLargeGraphicOnly","abstract":"

    A layout with only a single large graphic

    "},"Constants.html#/c:@SDLPrerecordedSpeechHelp":{"name":"SDLPrerecordedSpeechHelp","abstract":"

    A prerecorded help prompt

    "},"Constants.html#/c:@SDLPrerecordedSpeechInitial":{"name":"SDLPrerecordedSpeechInitial","abstract":"

    A prerecorded initial prompt

    "},"Constants.html#/c:@SDLPrerecordedSpeechListen":{"name":"SDLPrerecordedSpeechListen","abstract":"

    A prerecorded listen prompt is available

    "},"Constants.html#/c:@SDLPrerecordedSpeechPositive":{"name":"SDLPrerecordedSpeechPositive","abstract":"

    A prerecorded positive indicator noise is available

    "},"Constants.html#/c:@SDLPrerecordedSpeechNegative":{"name":"SDLPrerecordedSpeechNegative","abstract":"

    A prerecorded negative indicator noise is available

    "},"Constants.html#/c:@SDLPrimaryAudioSourceNoSourceSelected":{"name":"SDLPrimaryAudioSourceNoSourceSelected","abstract":"

    Currently no source selected

    "},"Constants.html#/c:@SDLPrimaryAudioSourceUSB":{"name":"SDLPrimaryAudioSourceUSB","abstract":"

    USB is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceUSB2":{"name":"SDLPrimaryAudioSourceUSB2","abstract":"

    USB2 is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceBluetoothStereo":{"name":"SDLPrimaryAudioSourceBluetoothStereo","abstract":"

    Bluetooth Stereo is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceLineIn":{"name":"SDLPrimaryAudioSourceLineIn","abstract":"

    Line in is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceIpod":{"name":"SDLPrimaryAudioSourceIpod","abstract":"

    iPod is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceMobileApp":{"name":"SDLPrimaryAudioSourceMobileApp","abstract":"

    Mobile app is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceCD":{"name":"SDLPrimaryAudioSourceCD","abstract":"

    @abstract CD is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceAM":{"name":"SDLPrimaryAudioSourceAM","abstract":"

    @abstract Radio frequency AM is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceFM":{"name":"SDLPrimaryAudioSourceFM","abstract":"

    @abstract Radio frequency FM is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceXM":{"name":"SDLPrimaryAudioSourceXM","abstract":"

    @abstract Radio frequency XM is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceDAB":{"name":"SDLPrimaryAudioSourceDAB","abstract":"

    @abstract Radio frequency DAB is current source

    "},"Constants.html#/c:@SDLRPCFunctionNameAddCommand":{"name":"SDLRPCFunctionNameAddCommand","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameAddSubMenu":{"name":"SDLRPCFunctionNameAddSubMenu","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameAlert":{"name":"SDLRPCFunctionNameAlert","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameAlertManeuver":{"name":"SDLRPCFunctionNameAlertManeuver","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameButtonPress":{"name":"SDLRPCFunctionNameButtonPress","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameChangeRegistration":{"name":"SDLRPCFunctionNameChangeRegistration","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameCreateInteractionChoiceSet":{"name":"SDLRPCFunctionNameCreateInteractionChoiceSet","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteCommand":{"name":"SDLRPCFunctionNameDeleteCommand","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteFile":{"name":"SDLRPCFunctionNameDeleteFile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteInteractionChoiceSet":{"name":"SDLRPCFunctionNameDeleteInteractionChoiceSet","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteSubMenu":{"name":"SDLRPCFunctionNameDeleteSubMenu","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDiagnosticMessage":{"name":"SDLRPCFunctionNameDiagnosticMessage","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDialNumber":{"name":"SDLRPCFunctionNameDialNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameEncodedSyncPData":{"name":"SDLRPCFunctionNameEncodedSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameEndAudioPassThru":{"name":"SDLRPCFunctionNameEndAudioPassThru","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGenericResponse":{"name":"SDLRPCFunctionNameGenericResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetAppServiceData":{"name":"SDLRPCFunctionNameGetAppServiceData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetDTCs":{"name":"SDLRPCFunctionNameGetDTCs","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetFile":{"name":"SDLRPCFunctionNameGetFile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetCloudAppProperties":{"name":"SDLRPCFunctionNameGetCloudAppProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleData":{"name":"SDLRPCFunctionNameGetInteriorVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetSystemCapability":{"name":"SDLRPCFunctionNameGetSystemCapability","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetVehicleData":{"name":"SDLRPCFunctionNameGetVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetWayPoints":{"name":"SDLRPCFunctionNameGetWayPoints","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameListFiles":{"name":"SDLRPCFunctionNameListFiles","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered":{"name":"SDLRPCFunctionNameOnAppInterfaceUnregistered","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnAppServiceData":{"name":"SDLRPCFunctionNameOnAppServiceData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnAudioPassThru":{"name":"SDLRPCFunctionNameOnAudioPassThru","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnButtonEvent":{"name":"SDLRPCFunctionNameOnButtonEvent","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnButtonPress":{"name":"SDLRPCFunctionNameOnButtonPress","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnCommand":{"name":"SDLRPCFunctionNameOnCommand","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnDriverDistraction":{"name":"SDLRPCFunctionNameOnDriverDistraction","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnEncodedSyncPData":{"name":"SDLRPCFunctionNameOnEncodedSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnHashChange":{"name":"SDLRPCFunctionNameOnHashChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnHMIStatus":{"name":"SDLRPCFunctionNameOnHMIStatus","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnInteriorVehicleData":{"name":"SDLRPCFunctionNameOnInteriorVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnKeyboardInput":{"name":"SDLRPCFunctionNameOnKeyboardInput","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnLanguageChange":{"name":"SDLRPCFunctionNameOnLanguageChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnLockScreenStatus":{"name":"SDLRPCFunctionNameOnLockScreenStatus","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnPermissionsChange":{"name":"SDLRPCFunctionNameOnPermissionsChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnRCStatus":{"name":"SDLRPCFunctionNameOnRCStatus","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnSyncPData":{"name":"SDLRPCFunctionNameOnSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnSystemCapabilityUpdated":{"name":"SDLRPCFunctionNameOnSystemCapabilityUpdated","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnSystemRequest":{"name":"SDLRPCFunctionNameOnSystemRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnTBTClientState":{"name":"SDLRPCFunctionNameOnTBTClientState","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnTouchEvent":{"name":"SDLRPCFunctionNameOnTouchEvent","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnVehicleData":{"name":"SDLRPCFunctionNameOnVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnWayPointChange":{"name":"SDLRPCFunctionNameOnWayPointChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePerformAppServiceInteraction":{"name":"SDLRPCFunctionNamePerformAppServiceInteraction","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePerformAudioPassThru":{"name":"SDLRPCFunctionNamePerformAudioPassThru","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePerformInteraction":{"name":"SDLRPCFunctionNamePerformInteraction","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePublishAppService":{"name":"SDLRPCFunctionNamePublishAppService","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePutFile":{"name":"SDLRPCFunctionNamePutFile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameReadDID":{"name":"SDLRPCFunctionNameReadDID","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameRegisterAppInterface":{"name":"SDLRPCFunctionNameRegisterAppInterface","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameReserved":{"name":"SDLRPCFunctionNameReserved","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameResetGlobalProperties":{"name":"SDLRPCFunctionNameResetGlobalProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameScrollableMessage":{"name":"SDLRPCFunctionNameScrollableMessage","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSendHapticData":{"name":"SDLRPCFunctionNameSendHapticData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSendLocation":{"name":"SDLRPCFunctionNameSendLocation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetAppIcon":{"name":"SDLRPCFunctionNameSetAppIcon","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetCloudAppProperties":{"name":"SDLRPCFunctionNameSetCloudAppProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetDisplayLayout":{"name":"SDLRPCFunctionNameSetDisplayLayout","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetGlobalProperties":{"name":"SDLRPCFunctionNameSetGlobalProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetInteriorVehicleData":{"name":"SDLRPCFunctionNameSetInteriorVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetMediaClockTimer":{"name":"SDLRPCFunctionNameSetMediaClockTimer","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameShow":{"name":"SDLRPCFunctionNameShow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameShowConstantTBT":{"name":"SDLRPCFunctionNameShowConstantTBT","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSlider":{"name":"SDLRPCFunctionNameSlider","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSpeak":{"name":"SDLRPCFunctionNameSpeak","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSubscribeButton":{"name":"SDLRPCFunctionNameSubscribeButton","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSubscribeVehicleData":{"name":"SDLRPCFunctionNameSubscribeVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSubscribeWayPoints":{"name":"SDLRPCFunctionNameSubscribeWayPoints","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSyncPData":{"name":"SDLRPCFunctionNameSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSystemRequest":{"name":"SDLRPCFunctionNameSystemRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnregisterAppInterface":{"name":"SDLRPCFunctionNameUnregisterAppInterface","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeButton":{"name":"SDLRPCFunctionNameUnsubscribeButton","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeVehicleData":{"name":"SDLRPCFunctionNameUnsubscribeVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints":{"name":"SDLRPCFunctionNameUnsubscribeWayPoints","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList":{"name":"SDLRPCFunctionNameUpdateTurnList","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRadioBandAM":{"name":"SDLRadioBandAM","abstract":"

    Represents AM radio band

    "},"Constants.html#/c:@SDLRadioBandFM":{"name":"SDLRadioBandFM","abstract":"

    Represents FM radio band

    "},"Constants.html#/c:@SDLRadioBandXM":{"name":"SDLRadioBandXM","abstract":"

    Represents XM radio band

    "},"Constants.html#/c:@SDLRadioStateAcquiring":{"name":"SDLRadioStateAcquiring","abstract":"

    Represents Radio state as ACQUIRING

    "},"Constants.html#/c:@SDLRadioStateAcquired":{"name":"SDLRadioStateAcquired","abstract":"

    Represents Radio state as ACQUIRED

    "},"Constants.html#/c:@SDLRadioStateMulticast":{"name":"SDLRadioStateMulticast","abstract":"

    Represents Radio state as MULTICAST

    "},"Constants.html#/c:@SDLRadioStateNotFound":{"name":"SDLRadioStateNotFound","abstract":"

    Represents Radio state as NOT_FOUND

    "},"Constants.html#/c:@SDLRequestTypeHTTP":{"name":"SDLRequestTypeHTTP","abstract":"

    An HTTP request

    "},"Constants.html#/c:@SDLRequestTypeFileResume":{"name":"SDLRequestTypeFileResume","abstract":"

    A file resumption request

    "},"Constants.html#/c:@SDLRequestTypeAuthenticationRequest":{"name":"SDLRequestTypeAuthenticationRequest","abstract":"

    An authentication request

    "},"Constants.html#/c:@SDLRequestTypeAuthenticationChallenge":{"name":"SDLRequestTypeAuthenticationChallenge","abstract":"

    An authentication challenge

    "},"Constants.html#/c:@SDLRequestTypeAuthenticationAck":{"name":"SDLRequestTypeAuthenticationAck","abstract":"

    An authentication acknowledgment

    "},"Constants.html#/c:@SDLRequestTypeProprietary":{"name":"SDLRequestTypeProprietary","abstract":"

    An proprietary formatted request

    "},"Constants.html#/c:@SDLRequestTypeQueryApps":{"name":"SDLRequestTypeQueryApps","abstract":"

    An Query Apps request

    "},"Constants.html#/c:@SDLRequestTypeLaunchApp":{"name":"SDLRequestTypeLaunchApp","abstract":"

    A Launch Apps request

    "},"Constants.html#/c:@SDLRequestTypeLockScreenIconURL":{"name":"SDLRequestTypeLockScreenIconURL","abstract":"

    The URL for a lock screen icon

    "},"Constants.html#/c:@SDLRequestTypeTrafficMessageChannel":{"name":"SDLRequestTypeTrafficMessageChannel","abstract":"

    A traffic message channel request

    "},"Constants.html#/c:@SDLRequestTypeDriverProfile":{"name":"SDLRequestTypeDriverProfile","abstract":"

    A driver profile request

    "},"Constants.html#/c:@SDLRequestTypeVoiceSearch":{"name":"SDLRequestTypeVoiceSearch","abstract":"

    A voice search request

    "},"Constants.html#/c:@SDLRequestTypeNavigation":{"name":"SDLRequestTypeNavigation","abstract":"

    A navigation request

    "},"Constants.html#/c:@SDLRequestTypePhone":{"name":"SDLRequestTypePhone","abstract":"

    A phone request

    "},"Constants.html#/c:@SDLRequestTypeClimate":{"name":"SDLRequestTypeClimate","abstract":"

    A climate request

    "},"Constants.html#/c:@SDLRequestTypeSettings":{"name":"SDLRequestTypeSettings","abstract":"

    A settings request

    "},"Constants.html#/c:@SDLRequestTypeVehicleDiagnostics":{"name":"SDLRequestTypeVehicleDiagnostics","abstract":"

    A vehicle diagnostics request

    "},"Constants.html#/c:@SDLRequestTypeEmergency":{"name":"SDLRequestTypeEmergency","abstract":"

    An emergency request

    "},"Constants.html#/c:@SDLRequestTypeMedia":{"name":"SDLRequestTypeMedia","abstract":"

    A media request

    "},"Constants.html#/c:@SDLRequestTypeFOTA":{"name":"SDLRequestTypeFOTA","abstract":"

    A firmware over-the-air request

    "},"Constants.html#/c:@SDLRequestTypeOEMSpecific":{"name":"SDLRequestTypeOEMSpecific","abstract":"

    A request that is OEM specific using the RequestSubType in SystemRequest

    "},"Constants.html#/c:@SDLRequestTypeIconURL":{"name":"SDLRequestTypeIconURL","abstract":"

    A request for an icon url

    "},"Constants.html#/c:@SDLResultSuccess":{"name":"SDLResultSuccess","abstract":"

    The request succeeded

    "},"Constants.html#/c:@SDLResultInvalidData":{"name":"SDLResultInvalidData","abstract":"

    The request contained invalid data

    "},"Constants.html#/c:@SDLResultCharacterLimitExceeded":{"name":"SDLResultCharacterLimitExceeded","abstract":"

    The request had a string containing too many characters

    "},"Constants.html#/c:@SDLResultUnsupportedRequest":{"name":"SDLResultUnsupportedRequest","abstract":"

    The request is not supported by the IVI unit implementing SDL

    "},"Constants.html#/c:@SDLResultOutOfMemory":{"name":"SDLResultOutOfMemory","abstract":"

    The system could not process the request because the necessary memory couldn’t be allocated

    "},"Constants.html#/c:@SDLResultTooManyPendingRequests":{"name":"SDLResultTooManyPendingRequests","abstract":"

    There are too many requests pending (means that the response has not been delivered yet).

    "},"Constants.html#/c:@SDLResultInvalidId":{"name":"SDLResultInvalidId","abstract":"

    One of the provided IDs is not valid.

    "},"Constants.html#/c:@SDLResultDuplicateName":{"name":"SDLResultDuplicateName","abstract":"

    The provided name or synonym is a duplicate of some already-defined name or synonym.

    "},"Constants.html#/c:@SDLResultTooManyApplications":{"name":"SDLResultTooManyApplications","abstract":"

    There are already too many registered applications.

    "},"Constants.html#/c:@SDLResultApplicationRegisteredAlready":{"name":"SDLResultApplicationRegisteredAlready","abstract":"

    RegisterAppInterface has been called, but this app is already registered

    "},"Constants.html#/c:@SDLResultUnsupportedVersion":{"name":"SDLResultUnsupportedVersion","abstract":"

    The Head Unit doesn’t support the SDL version that is requested by the mobile application.

    "},"Constants.html#/c:@SDLResultWrongLanguage":{"name":"SDLResultWrongLanguage","abstract":"

    The requested language is currently not supported. This might be because of a mismatch of the currently active language on the head unit and the requested language.

    "},"Constants.html#/c:@SDLResultApplicationNotRegistered":{"name":"SDLResultApplicationNotRegistered","abstract":"

    A command can not be executed because no application has been registered with RegisterApplication.

    "},"Constants.html#/c:@SDLResultInUse":{"name":"SDLResultInUse","abstract":"

    The data may not be changed, because it is currently in use. For example when trying to delete a choice set that is currently involved in an interaction.

    "},"Constants.html#/c:@SDLResultVehicleDataNotAllowed":{"name":"SDLResultVehicleDataNotAllowed","abstract":"

    The user has turned off access to vehicle data, and it is globally unavailable to mobile applications.

    "},"Constants.html#/c:@SDLResultVehicleDataNotAvailable":{"name":"SDLResultVehicleDataNotAvailable","abstract":"

    The requested vehicle data is not available on this vehicle or is not published.

    "},"Constants.html#/c:@SDLResultRejected":{"name":"SDLResultRejected","abstract":"

    The requested command was rejected, e.g. because the mobile app is in background and cannot perform any HMI commands, or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is playing.

    "},"Constants.html#/c:@SDLResultAborted":{"name":"SDLResultAborted","abstract":"

    A command was aborted, e.g. due to user interaction (user pressed button), or an HMI command (e.g. Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested.

    "},"Constants.html#/c:@SDLResultIgnored":{"name":"SDLResultIgnored","abstract":"

    A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was used to pause the media clock although the clock is paused already.

    "},"Constants.html#/c:@SDLResultUnsupportedResource":{"name":"SDLResultUnsupportedResource","abstract":"

    A button that was requested for subscription is not supported under the current system.

    "},"Constants.html#/c:@SDLResultFileNotFound":{"name":"SDLResultFileNotFound","abstract":"

    A specified file could not be found on the head unit.

    "},"Constants.html#/c:@SDLResultGenericError":{"name":"SDLResultGenericError","abstract":"

    Provided data is valid but something went wrong in the lower layers.

    "},"Constants.html#/c:@SDLResultDisallowed":{"name":"SDLResultDisallowed","abstract":"

    RPC is not authorized in local policy table.

    "},"Constants.html#/c:@SDLResultUserDisallowed":{"name":"SDLResultUserDisallowed","abstract":"

    RPC is included in a functional group explicitly blocked by the user.

    "},"Constants.html#/c:@SDLResultTimedOut":{"name":"SDLResultTimedOut","abstract":"

    Overlay reached the maximum timeout and closed.

    "},"Constants.html#/c:@SDLResultCancelRoute":{"name":"SDLResultCancelRoute","abstract":"

    User selected to Cancel Route.

    "},"Constants.html#/c:@SDLResultCorruptedData":{"name":"SDLResultCorruptedData","abstract":"

    The data sent failed to pass CRC check in receiver end.

    "},"Constants.html#/c:@SDLResultTruncatedData":{"name":"SDLResultTruncatedData","abstract":"

    The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, only part of the data is available.

    "},"Constants.html#/c:@SDLResultRetry":{"name":"SDLResultRetry","abstract":"

    The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue the new RPC.

    "},"Constants.html#/c:@SDLResultWarnings":{"name":"SDLResultWarnings","abstract":"

    The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure.

    "},"Constants.html#/c:@SDLResultSaved":{"name":"SDLResultSaved","abstract":"

    The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value.

    "},"Constants.html#/c:@SDLResultInvalidCertificate":{"name":"SDLResultInvalidCertificate","abstract":"

    The certificate provided during authentication is invalid.

    "},"Constants.html#/c:@SDLResultExpiredCertificate":{"name":"SDLResultExpiredCertificate","abstract":"

    The certificate provided during authentication is expired.

    "},"Constants.html#/c:@SDLResultResumeFailed":{"name":"SDLResultResumeFailed","abstract":"

    The provided hash ID does not match the hash of the current set of registered data or the core could not resume the previous data.

    "},"Constants.html#/c:@SDLResultDataNotAvailable":{"name":"SDLResultDataNotAvailable","abstract":"

    The requested data is not available on this vehicle or is not published for the connected app.

    "},"Constants.html#/c:@SDLResultReadOnly":{"name":"SDLResultReadOnly","abstract":"

    The requested data is read only thus cannot be change via remote control .

    "},"Constants.html#/c:@SDLSamplingRate8KHZ":{"name":"SDLSamplingRate8KHZ","abstract":"

    Sampling rate of 8 kHz

    "},"Constants.html#/c:@SDLSamplingRate16KHZ":{"name":"SDLSamplingRate16KHZ","abstract":"

    Sampling rate of 16 kHz

    "},"Constants.html#/c:@SDLSamplingRate22KHZ":{"name":"SDLSamplingRate22KHZ","abstract":"

    Sampling rate of 22 kHz

    "},"Constants.html#/c:@SDLSamplingRate44KHZ":{"name":"SDLSamplingRate44KHZ","abstract":"

    Sampling rate of 44 kHz

    "},"Constants.html#/c:@SDLSeatMemoryActionTypeSave":{"name":"SDLSeatMemoryActionTypeSave","abstract":"

    @abstract Save current seat postions and settings to seat memory.

    "},"Constants.html#/c:@SDLSeatMemoryActionTypeRestore":{"name":"SDLSeatMemoryActionTypeRestore","abstract":"

    @abstract Restore / apply the seat memory settings to the current seat.

    "},"Constants.html#/c:@SDLSeatMemoryActionTypeNone":{"name":"SDLSeatMemoryActionTypeNone","abstract":"

    @abstract No action to be performed.

    "},"Constants.html#/c:@SDLServiceUpdatePublished":{"name":"SDLServiceUpdatePublished","abstract":"

    The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.

    "},"Constants.html#/c:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"

    The service has just been unpublished with the module and is no longer accessible.

    "},"Constants.html#/c:@SDLServiceUpdateActivated":{"name":"SDLServiceUpdateActivated","abstract":"

    The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.

    "},"Constants.html#/c:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"

    The service has been deactivated as the primary service of its type.

    "},"Constants.html#/c:@SDLServiceUpdateManifestUpdate":{"name":"SDLServiceUpdateManifestUpdate","abstract":"

    The service has updated its manifest. This could imply updated capabilities.

    "},"Constants.html#/c:@SDLSoftButtonTypeText":{"name":"SDLSoftButtonTypeText","abstract":"

    Text kind Softbutton

    "},"Constants.html#/c:@SDLSoftButtonTypeImage":{"name":"SDLSoftButtonTypeImage","abstract":"

    Image kind Softbutton

    "},"Constants.html#/c:@SDLSoftButtonTypeBoth":{"name":"SDLSoftButtonTypeBoth","abstract":"

    Both (Text & Image) kind Softbutton

    "},"Constants.html#/c:@SDLSpeechCapabilitiesText":{"name":"SDLSpeechCapabilitiesText","abstract":"

    The SDL platform can speak text phrases.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesSAPIPhonemes":{"name":"SDLSpeechCapabilitiesSAPIPhonemes","abstract":"

    The SDL platform can speak SAPI Phonemes.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesLHPlusPhonemes":{"name":"SDLSpeechCapabilitiesLHPlusPhonemes","abstract":"

    The SDL platform can speak LHPlus Phonemes.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesPrerecorded":{"name":"SDLSpeechCapabilitiesPrerecorded","abstract":"

    The SDL platform can speak Prerecorded indicators and prompts.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesSilence":{"name":"SDLSpeechCapabilitiesSilence","abstract":"

    The SDL platform can speak Silence.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesFile":{"name":"SDLSpeechCapabilitiesFile","abstract":"

    The SDL platform can play a file

    "},"Constants.html#/c:@SDLStaticIconNameAcceptCall":{"name":"SDLStaticIconNameAcceptCall","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAddWaypoint":{"name":"SDLStaticIconNameAddWaypoint","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAlbum":{"name":"SDLStaticIconNameAlbum","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAmbientLighting":{"name":"SDLStaticIconNameAmbientLighting","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameArrowNorth":{"name":"SDLStaticIconNameArrowNorth","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAudioMute":{"name":"SDLStaticIconNameAudioMute","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAudiobookEpisode":{"name":"SDLStaticIconNameAudiobookEpisode","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAudiobookNarrator":{"name":"SDLStaticIconNameAudiobookNarrator","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAuxillaryAudio":{"name":"SDLStaticIconNameAuxillaryAudio","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBack":{"name":"SDLStaticIconNameBack","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity0Of5":{"name":"SDLStaticIconNameBatteryCapacity0Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity1Of5":{"name":"SDLStaticIconNameBatteryCapacity1Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity2Of5":{"name":"SDLStaticIconNameBatteryCapacity2Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity3Of5":{"name":"SDLStaticIconNameBatteryCapacity3Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity4Of5":{"name":"SDLStaticIconNameBatteryCapacity4Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity5Of5":{"name":"SDLStaticIconNameBatteryCapacity5Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBluetoothAudioSource":{"name":"SDLStaticIconNameBluetoothAudioSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBluetooth1":{"name":"SDLStaticIconNameBluetooth1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBluetooth2":{"name":"SDLStaticIconNameBluetooth2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBrowse":{"name":"SDLStaticIconNameBrowse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellPhoneInRoamingMode":{"name":"SDLStaticIconNameCellPhoneInRoamingMode","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength0Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength0Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength1Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength1Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength2Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength2Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength3Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength3Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength4Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength4Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength5Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength5Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameChangeLaneLeft":{"name":"SDLStaticIconNameChangeLaneLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameChangeLaneRight":{"name":"SDLStaticIconNameChangeLaneRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCheckBoxChecked":{"name":"SDLStaticIconNameCheckBoxChecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCheckBoxUnchecked":{"name":"SDLStaticIconNameCheckBoxUnchecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameClimate":{"name":"SDLStaticIconNameClimate","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameClock":{"name":"SDLStaticIconNameClock","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCompose":{"name":"SDLStaticIconNameCompose","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameContact":{"name":"SDLStaticIconNameContact","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameContinue":{"name":"SDLStaticIconNameContinue","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDash":{"name":"SDLStaticIconNameDash","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDate":{"name":"SDLStaticIconNameDate","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDelete":{"name":"SDLStaticIconNameDelete","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDestination":{"name":"SDLStaticIconNameDestination","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDestinationFerryAhead":{"name":"SDLStaticIconNameDestinationFerryAhead","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameEbookmark":{"name":"SDLStaticIconNameEbookmark","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameEmpty":{"name":"SDLStaticIconNameEmpty","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameEndCall":{"name":"SDLStaticIconNameEndCall","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFail":{"name":"SDLStaticIconNameFail","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFastForward30Secs":{"name":"SDLStaticIconNameFastForward30Secs","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFavoriteHeart":{"name":"SDLStaticIconNameFavoriteHeart","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFavoriteStar":{"name":"SDLStaticIconNameFavoriteStar","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFaxNumber":{"name":"SDLStaticIconNameFaxNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFilename":{"name":"SDLStaticIconNameFilename","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFilter":{"name":"SDLStaticIconNameFilter","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFolder":{"name":"SDLStaticIconNameFolder","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFuelPrices":{"name":"SDLStaticIconNameFuelPrices","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFullMap":{"name":"SDLStaticIconNameFullMap","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameGenericPhoneNumber":{"name":"SDLStaticIconNameGenericPhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameGenre":{"name":"SDLStaticIconNameGenre","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameGlobalKeyboard":{"name":"SDLStaticIconNameGlobalKeyboard","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameHighwayExitInformation":{"name":"SDLStaticIconNameHighwayExitInformation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameHomePhoneNumber":{"name":"SDLStaticIconNameHomePhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameHyperlink":{"name":"SDLStaticIconNameHyperlink","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameID3TagUnknown":{"name":"SDLStaticIconNameID3TagUnknown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameIncomingCalls":{"name":"SDLStaticIconNameIncomingCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameInformation":{"name":"SDLStaticIconNameInformation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameIPodMediaSource":{"name":"SDLStaticIconNameIPodMediaSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameJoinCalls":{"name":"SDLStaticIconNameJoinCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameKeepLeft":{"name":"SDLStaticIconNameKeepLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameKeepRight":{"name":"SDLStaticIconNameKeepRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameKey":{"name":"SDLStaticIconNameKey","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLeft":{"name":"SDLStaticIconNameLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLeftArrow":{"name":"SDLStaticIconNameLeftArrow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLeftExit":{"name":"SDLStaticIconNameLeftExit","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLineInAudioSource":{"name":"SDLStaticIconNameLineInAudioSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLocked":{"name":"SDLStaticIconNameLocked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlLeftArrow":{"name":"SDLStaticIconNameMediaControlLeftArrow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlRecording":{"name":"SDLStaticIconNameMediaControlRecording","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlRightArrow":{"name":"SDLStaticIconNameMediaControlRightArrow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlStop":{"name":"SDLStaticIconNameMediaControlStop","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMicrophone":{"name":"SDLStaticIconNameMicrophone","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMissedCalls":{"name":"SDLStaticIconNameMissedCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMobilePhoneNumber":{"name":"SDLStaticIconNameMobilePhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMoveDown":{"name":"SDLStaticIconNameMoveDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMoveUp":{"name":"SDLStaticIconNameMoveUp","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMP3TagArtist":{"name":"SDLStaticIconNameMP3TagArtist","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNavigation":{"name":"SDLStaticIconNameNavigation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNavigationCurrentDirection":{"name":"SDLStaticIconNameNavigationCurrentDirection","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNegativeRatingThumbsDown":{"name":"SDLStaticIconNameNegativeRatingThumbsDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNew":{"name":"SDLStaticIconNameNew","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOfficePhoneNumber":{"name":"SDLStaticIconNameOfficePhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOpened":{"name":"SDLStaticIconNameOpened","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOrigin":{"name":"SDLStaticIconNameOrigin","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOutgoingCalls":{"name":"SDLStaticIconNameOutgoingCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePause":{"name":"SDLStaticIconNamePause","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoneCall1":{"name":"SDLStaticIconNamePhoneCall1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoneCall2":{"name":"SDLStaticIconNamePhoneCall2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoneDevice":{"name":"SDLStaticIconNamePhoneDevice","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhonebook":{"name":"SDLStaticIconNamePhonebook","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoto":{"name":"SDLStaticIconNamePhoto","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePlay":{"name":"SDLStaticIconNamePlay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePlaylist":{"name":"SDLStaticIconNamePlaylist","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePopUp":{"name":"SDLStaticIconNamePopUp","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePositiveRatingThumbsUp":{"name":"SDLStaticIconNamePositiveRatingThumbsUp","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePower":{"name":"SDLStaticIconNamePower","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePrimaryPhone":{"name":"SDLStaticIconNamePrimaryPhone","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRadioButtonChecked":{"name":"SDLStaticIconNameRadioButtonChecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRadioButtonUnchecked":{"name":"SDLStaticIconNameRadioButtonUnchecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRecentCalls":{"name":"SDLStaticIconNameRecentCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRecentDestinations":{"name":"SDLStaticIconNameRecentDestinations","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRedo":{"name":"SDLStaticIconNameRedo","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRefresh":{"name":"SDLStaticIconNameRefresh","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRemoteDiagnosticsCheckEngine":{"name":"SDLStaticIconNameRemoteDiagnosticsCheckEngine","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRendered911Assist":{"name":"SDLStaticIconNameRendered911Assist","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRepeat":{"name":"SDLStaticIconNameRepeat","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRepeatPlay":{"name":"SDLStaticIconNameRepeatPlay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameReply":{"name":"SDLStaticIconNameReply","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRewind30Secs":{"name":"SDLStaticIconNameRewind30Secs","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRight":{"name":"SDLStaticIconNameRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRightExit":{"name":"SDLStaticIconNameRightExit","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRingtones":{"name":"SDLStaticIconNameRingtones","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand1":{"name":"SDLStaticIconNameRoundaboutLeftHand1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand2":{"name":"SDLStaticIconNameRoundaboutLeftHand2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand3":{"name":"SDLStaticIconNameRoundaboutLeftHand3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand4":{"name":"SDLStaticIconNameRoundaboutLeftHand4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand5":{"name":"SDLStaticIconNameRoundaboutLeftHand5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand6":{"name":"SDLStaticIconNameRoundaboutLeftHand6","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand7":{"name":"SDLStaticIconNameRoundaboutLeftHand7","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand1":{"name":"SDLStaticIconNameRoundaboutRightHand1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand2":{"name":"SDLStaticIconNameRoundaboutRightHand2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand3":{"name":"SDLStaticIconNameRoundaboutRightHand3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand4":{"name":"SDLStaticIconNameRoundaboutRightHand4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand5":{"name":"SDLStaticIconNameRoundaboutRightHand5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand6":{"name":"SDLStaticIconNameRoundaboutRightHand6","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand7":{"name":"SDLStaticIconNameRoundaboutRightHand7","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRSS":{"name":"SDLStaticIconNameRSS","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSettings":{"name":"SDLStaticIconNameSettings","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSharpLeft":{"name":"SDLStaticIconNameSharpLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSharpRight":{"name":"SDLStaticIconNameSharpRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameShow":{"name":"SDLStaticIconNameShow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameShufflePlay":{"name":"SDLStaticIconNameShufflePlay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSkiPlaces":{"name":"SDLStaticIconNameSkiPlaces","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSlightLeft":{"name":"SDLStaticIconNameSlightLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSlightRight":{"name":"SDLStaticIconNameSlightRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSmartphone":{"name":"SDLStaticIconNameSmartphone","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSortList":{"name":"SDLStaticIconNameSortList","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber0":{"name":"SDLStaticIconNameSpeedDialNumbersNumber0","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber1":{"name":"SDLStaticIconNameSpeedDialNumbersNumber1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber2":{"name":"SDLStaticIconNameSpeedDialNumbersNumber2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber3":{"name":"SDLStaticIconNameSpeedDialNumbersNumber3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber4":{"name":"SDLStaticIconNameSpeedDialNumbersNumber4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber5":{"name":"SDLStaticIconNameSpeedDialNumbersNumber5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber6":{"name":"SDLStaticIconNameSpeedDialNumbersNumber6","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber7":{"name":"SDLStaticIconNameSpeedDialNumbersNumber7","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber8":{"name":"SDLStaticIconNameSpeedDialNumbersNumber8","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber9":{"name":"SDLStaticIconNameSpeedDialNumbersNumber9","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSuccess":{"name":"SDLStaticIconNameSuccess","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameTrackTitle":{"name":"SDLStaticIconNameTrackTitle","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameTrafficReport":{"name":"SDLStaticIconNameTrafficReport","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameTurnList":{"name":"SDLStaticIconNameTurnList","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUTurnLeftTraffic":{"name":"SDLStaticIconNameUTurnLeftTraffic","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUTurnRightTraffic":{"name":"SDLStaticIconNameUTurnRightTraffic","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUndo":{"name":"SDLStaticIconNameUndo","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUnlocked":{"name":"SDLStaticIconNameUnlocked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUSBMediaAudioSource":{"name":"SDLStaticIconNameUSBMediaAudioSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo1":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo2":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo3":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo4":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionFailed":{"name":"SDLStaticIconNameVoiceRecognitionFailed","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionPause":{"name":"SDLStaticIconNameVoiceRecognitionPause","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSuccessful":{"name":"SDLStaticIconNameVoiceRecognitionSuccessful","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemActive":{"name":"SDLStaticIconNameVoiceRecognitionSystemActive","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemListening":{"name":"SDLStaticIconNameVoiceRecognitionSystemListening","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionTryAgain":{"name":"SDLStaticIconNameVoiceRecognitionTryAgain","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameWarning":{"name":"SDLStaticIconNameWarning","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameWeather":{"name":"SDLStaticIconNameWeather","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameWifiFull":{"name":"SDLStaticIconNameWifiFull","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameZoomIn":{"name":"SDLStaticIconNameZoomIn","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameZoomOut":{"name":"SDLStaticIconNameZoomOut","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDefaultScreenSize":{"name":"SDLDefaultScreenSize","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamDidStartNotification":{"name":"SDLVideoStreamDidStartNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamDidStopNotification":{"name":"SDLVideoStreamDidStopNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamSuspendedNotification":{"name":"SDLVideoStreamSuspendedNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamDidStartNotification":{"name":"SDLAudioStreamDidStartNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamDidStopNotification":{"name":"SDLAudioStreamDidStopNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerWillPresentLockScreenViewController":{"name":"SDLLockScreenManagerWillPresentLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerDidPresentLockScreenViewController":{"name":"SDLLockScreenManagerDidPresentLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerWillDismissLockScreenViewController":{"name":"SDLLockScreenManagerWillDismissLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerDidDismissLockScreenViewController":{"name":"SDLLockScreenManagerDidDismissLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateStopped":{"name":"SDLVideoStreamManagerStateStopped","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateStarting":{"name":"SDLVideoStreamManagerStateStarting","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateReady":{"name":"SDLVideoStreamManagerStateReady","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateSuspended":{"name":"SDLVideoStreamManagerStateSuspended","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateShuttingDown":{"name":"SDLVideoStreamManagerStateShuttingDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateStopped":{"name":"SDLAudioStreamManagerStateStopped","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateStarting":{"name":"SDLAudioStreamManagerStateStarting","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateReady":{"name":"SDLAudioStreamManagerStateReady","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateShuttingDown":{"name":"SDLAudioStreamManagerStateShuttingDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppStateInactive":{"name":"SDLAppStateInactive","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppStateActive":{"name":"SDLAppStateActive","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLSupportedSeatDriver":{"name":"SDLSupportedSeatDriver","abstract":"

    @abstract Save current seat postions and settings to seat memory.

    "},"Constants.html#/c:@SDLSupportedSeatFrontPassenger":{"name":"SDLSupportedSeatFrontPassenger","abstract":"

    @abstract Restore / apply the seat memory settings to the current seat.

    "},"Constants.html#/c:@SDLSystemActionDefaultAction":{"name":"SDLSystemActionDefaultAction","abstract":"

    A default soft button action

    "},"Constants.html#/c:@SDLSystemActionStealFocus":{"name":"SDLSystemActionStealFocus","abstract":"

    An action causing your app to steal HMI focus

    "},"Constants.html#/c:@SDLSystemActionKeepContext":{"name":"SDLSystemActionKeepContext","abstract":"

    An action causing you to keep context

    "},"Constants.html#/c:@SDLSystemCapabilityTypeAppServices":{"name":"SDLSystemCapabilityTypeAppServices","abstract":"

    The app services capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypeNavigation":{"name":"SDLSystemCapabilityTypeNavigation","abstract":"

    The navigation capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypePhoneCall":{"name":"SDLSystemCapabilityTypePhoneCall","abstract":"

    The phone call capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypeVideoStreaming":{"name":"SDLSystemCapabilityTypeVideoStreaming","abstract":"

    The video streaming capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypeRemoteControl":{"name":"SDLSystemCapabilityTypeRemoteControl","abstract":"

    The remote control capability

    "},"Constants.html#/c:@SDLSystemContextMain":{"name":"SDLSystemContextMain","abstract":"

    No user interaction (user-initiated or app-initiated) is in progress.

    "},"Constants.html#/c:@SDLSystemContextVoiceRecognitionSession":{"name":"SDLSystemContextVoiceRecognitionSession","abstract":"

    VR-oriented, user-initiated or app-initiated interaction is in-progress.

    "},"Constants.html#/c:@SDLSystemContextMenu":{"name":"SDLSystemContextMenu","abstract":"

    Menu-oriented, user-initiated or app-initiated interaction is in-progress.

    "},"Constants.html#/c:@SDLSystemContextHMIObscured":{"name":"SDLSystemContextHMIObscured","abstract":"

    The app’s display HMI is currently being obscured by either a system or other app’s overlay.

    "},"Constants.html#/c:@SDLSystemContextAlert":{"name":"SDLSystemContextAlert","abstract":"

    Broadcast only to whichever app has an alert currently being displayed.

    "},"Constants.html#/c:@SDLTBTStateRouteUpdateRequest":{"name":"SDLTBTStateRouteUpdateRequest","abstract":"

    The route should be updated

    "},"Constants.html#/c:@SDLTBTStateRouteAccepted":{"name":"SDLTBTStateRouteAccepted","abstract":"

    The route is accepted

    "},"Constants.html#/c:@SDLTBTStateRouteRefused":{"name":"SDLTBTStateRouteRefused","abstract":"

    The route is refused

    "},"Constants.html#/c:@SDLTBTStateRouteCancelled":{"name":"SDLTBTStateRouteCancelled","abstract":"

    The route is cancelled

    "},"Constants.html#/c:@SDLTBTStateETARequest":{"name":"SDLTBTStateETARequest","abstract":"

    The route should update its Estimated Time of Arrival

    "},"Constants.html#/c:@SDLTBTStateNextTurnRequest":{"name":"SDLTBTStateNextTurnRequest","abstract":"

    The route should update its next turn

    "},"Constants.html#/c:@SDLTBTStateRouteStatusRequest":{"name":"SDLTBTStateRouteStatusRequest","abstract":"

    The route should update its status

    "},"Constants.html#/c:@SDLTBTStateRouteSummaryRequest":{"name":"SDLTBTStateRouteSummaryRequest","abstract":"

    The route update its summary

    "},"Constants.html#/c:@SDLTBTStateTripStatusRequest":{"name":"SDLTBTStateTripStatusRequest","abstract":"

    The route should update the trip’s status

    "},"Constants.html#/c:@SDLTBTStateRouteUpdateRequestTimeout":{"name":"SDLTBTStateRouteUpdateRequestTimeout","abstract":"

    The route update timed out

    "},"Constants.html#/c:@SDLTPMSUnknown":{"name":"SDLTPMSUnknown","abstract":"

    If set the status of the tire is not known.

    "},"Constants.html#/c:@SDLTPMSSystemFault":{"name":"SDLTPMSSystemFault","abstract":"

    TPMS does not function.

    "},"Constants.html#/c:@SDLTPMSSensorFault":{"name":"SDLTPMSSensorFault","abstract":"

    The sensor of the tire does not function.

    "},"Constants.html#/c:@SDLTPMSLow":{"name":"SDLTPMSLow","abstract":"

    TPMS is reporting a low tire pressure for the tire.

    "},"Constants.html#/c:@SDLTPMSSystemActive":{"name":"SDLTPMSSystemActive","abstract":"

    TPMS is active and the tire pressure is monitored.

    "},"Constants.html#/c:@SDLTPMSTrain":{"name":"SDLTPMSTrain","abstract":"

    TPMS is reporting that the tire must be trained.

    "},"Constants.html#/c:@SDLTPMSTrainingComplete":{"name":"SDLTPMSTrainingComplete","abstract":"

    TPMS reports the training for the tire is completed.

    "},"Constants.html#/c:@SDLTPMSNotTrained":{"name":"SDLTPMSNotTrained","abstract":"

    TPMS reports the tire is not trained.

    "},"Constants.html#/c:@SDLTemperatureUnitCelsius":{"name":"SDLTemperatureUnitCelsius","abstract":"

    Reflects the current HMI setting for temperature unit in Celsius

    "},"Constants.html#/c:@SDLTemperatureUnitFahrenheit":{"name":"SDLTemperatureUnitFahrenheit","abstract":"

    Reflects the current HMI setting for temperature unit in Fahrenheit

    "},"Constants.html#/c:@SDLTextAlignmentLeft":{"name":"SDLTextAlignmentLeft","abstract":"

    Text aligned left.

    "},"Constants.html#/c:@SDLTextAlignmentRight":{"name":"SDLTextAlignmentRight","abstract":"

    Text aligned right.

    "},"Constants.html#/c:@SDLTextAlignmentCenter":{"name":"SDLTextAlignmentCenter","abstract":"

    Text aligned centered.

    "},"Constants.html#/c:@SDLTextFieldNameMainField1":{"name":"SDLTextFieldNameMainField1","abstract":"

    The first line of the first set of main fields of the persistent display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMainField2":{"name":"SDLTextFieldNameMainField2","abstract":"

    The second line of the first set of main fields of the persistent display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMainField3":{"name":"SDLTextFieldNameMainField3","abstract":"

    The first line of the second set of main fields of the persistent display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMainField4":{"name":"SDLTextFieldNameMainField4"},"Constants.html#/c:@SDLTextFieldNameStatusBar":{"name":"SDLTextFieldNameStatusBar","abstract":"

    The status bar on the NGN display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMediaClock":{"name":"SDLTextFieldNameMediaClock","abstract":"

    Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMediaTrack":{"name":"SDLTextFieldNameMediaTrack","abstract":"

    The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameAlertText1":{"name":"SDLTextFieldNameAlertText1","abstract":"

    The first line of the alert text field. Applies to SDLAlert.

    "},"Constants.html#/c:@SDLTextFieldNameAlertText2":{"name":"SDLTextFieldNameAlertText2","abstract":"

    The second line of the alert text field. Applies to SDLAlert.

    "},"Constants.html#/c:@SDLTextFieldNameAlertText3":{"name":"SDLTextFieldNameAlertText3","abstract":"

    The third line of the alert text field. Applies to SDLAlert.

    "},"Constants.html#/c:@SDLTextFieldNameScrollableMessageBody":{"name":"SDLTextFieldNameScrollableMessageBody","abstract":"

    Long form body of text that can include newlines and tabs. Applies to SDLScrollableMessage.

    "},"Constants.html#/c:@SDLTextFieldNameInitialInteractionText":{"name":"SDLTextFieldNameInitialInteractionText","abstract":"

    First line suggestion for a user response (in the case of VR enabled interaction).

    "},"Constants.html#/c:@SDLTextFieldNameNavigationText1":{"name":"SDLTextFieldNameNavigationText1","abstract":"

    First line of navigation text.

    "},"Constants.html#/c:@SDLTextFieldNameNavigationText2":{"name":"SDLTextFieldNameNavigationText2","abstract":"

    Second line of navigation text.

    "},"Constants.html#/c:@SDLTextFieldNameETA":{"name":"SDLTextFieldNameETA","abstract":"

    Estimated Time of Arrival time for navigation.

    "},"Constants.html#/c:@SDLTextFieldNameTotalDistance":{"name":"SDLTextFieldNameTotalDistance","abstract":"

    Total distance to destination for navigation.

    "},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText1":{"name":"SDLTextFieldNameAudioPassThruDisplayText1","abstract":"

    First line of text for audio pass thru.

    "},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText2":{"name":"SDLTextFieldNameAudioPassThruDisplayText2","abstract":"

    Second line of text for audio pass thru.

    "},"Constants.html#/c:@SDLTextFieldNameSliderHeader":{"name":"SDLTextFieldNameSliderHeader","abstract":"

    Header text for slider.

    "},"Constants.html#/c:@SDLTextFieldNameSliderFooter":{"name":"SDLTextFieldNameSliderFooter","abstract":"

    Footer text for slider

    "},"Constants.html#/c:@SDLTextFieldNameMenuName":{"name":"SDLTextFieldNameMenuName","abstract":"

    Primary text for SDLChoice

    "},"Constants.html#/c:@SDLTextFieldNameSecondaryText":{"name":"SDLTextFieldNameSecondaryText","abstract":"

    Secondary text for SDLChoice

    "},"Constants.html#/c:@SDLTextFieldNameTertiaryText":{"name":"SDLTextFieldNameTertiaryText","abstract":"

    Tertiary text for SDLChoice

    "},"Constants.html#/c:@SDLTextFieldNameMenuTitle":{"name":"SDLTextFieldNameMenuTitle","abstract":"

    Optional text to label an app menu button (for certain touchscreen platforms)

    "},"Constants.html#/c:@SDLTextFieldNameLocationName":{"name":"SDLTextFieldNameLocationName","abstract":"

    Optional name / title of intended location for SDLSendLocation

    "},"Constants.html#/c:@SDLTextFieldNameLocationDescription":{"name":"SDLTextFieldNameLocationDescription","abstract":"

    Optional description of intended location / establishment (if applicable) for SDLSendLocation

    "},"Constants.html#/c:@SDLTextFieldNameAddressLines":{"name":"SDLTextFieldNameAddressLines","abstract":"

    Optional location address (if applicable) for SDLSendLocation

    "},"Constants.html#/c:@SDLTextFieldNamePhoneNumber":{"name":"SDLTextFieldNamePhoneNumber","abstract":"

    Optional hone number of intended location / establishment (if applicable) for SDLSendLocation

    "},"Constants.html#/c:@SDLTimerModeUp":{"name":"SDLTimerModeUp","abstract":"

    The timer should count up.

    "},"Constants.html#/c:@SDLTimerModeDown":{"name":"SDLTimerModeDown","abstract":"

    The timer should count down.

    "},"Constants.html#/c:@SDLTimerModeNone":{"name":"SDLTimerModeNone","abstract":"

    The timer should not count.

    "},"Constants.html#/c:@SDLTouchTypeBegin":{"name":"SDLTouchTypeBegin","abstract":"

    The touch is the beginning of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTouchTypeMove":{"name":"SDLTouchTypeMove","abstract":"

    The touch is the movement of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTouchTypeEnd":{"name":"SDLTouchTypeEnd","abstract":"

    The touch is the ending of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTouchTypeCancel":{"name":"SDLTouchTypeCancel","abstract":"

    The touch is the cancellation of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTriggerSourceMenu":{"name":"SDLTriggerSourceMenu","abstract":"

    Selection made via menu

    "},"Constants.html#/c:@SDLTriggerSourceVoiceRecognition":{"name":"SDLTriggerSourceVoiceRecognition","abstract":"

    Selection made via Voice session

    "},"Constants.html#/c:@SDLTriggerSourceKeyboard":{"name":"SDLTriggerSourceKeyboard","abstract":"

    Selection made via Keyboard

    "},"Constants.html#/c:@SDLTurnSignalOff":{"name":"SDLTurnSignalOff","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTurnSignalLeft":{"name":"SDLTurnSignalLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTurnSignalRight":{"name":"SDLTurnSignalRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTurnSignalBoth":{"name":"SDLTurnSignalBoth","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLUpdateModeCountUp":{"name":"SDLUpdateModeCountUp","abstract":"

    Starts the media clock timer counting upward, in increments of 1 second.

    "},"Constants.html#/c:@SDLUpdateModeCountDown":{"name":"SDLUpdateModeCountDown","abstract":"

    Starts the media clock timer counting downward, in increments of 1 second.

    "},"Constants.html#/c:@SDLUpdateModePause":{"name":"SDLUpdateModePause","abstract":"

    Pauses the media clock timer.

    "},"Constants.html#/c:@SDLUpdateModeResume":{"name":"SDLUpdateModeResume","abstract":"

    Resumes the media clock timer. The timer resumes counting in whatever mode was in effect before pausing (i.e. COUNTUP or COUNTDOWN).

    "},"Constants.html#/c:@SDLUpdateModeClear":{"name":"SDLUpdateModeClear","abstract":"

    Clear the media clock timer.

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveNotConfirmed","abstract":"

    Inactive not confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveConfirmed","abstract":"

    Inactive confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusActiveNotConfirmed","abstract":"

    Active not confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveConfirmed":{"name":"SDLVehicleDataActiveStatusActiveConfirmed","abstract":"

    Active confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusFault":{"name":"SDLVehicleDataActiveStatusFault","abstract":"

    Fault

    "},"Constants.html#/c:@SDLVehicleDataEventStatusNoEvent":{"name":"SDLVehicleDataEventStatusNoEvent","abstract":"

    No event

    "},"Constants.html#/c:@SDLVehicleDataEventStatusNo":{"name":"SDLVehicleDataEventStatusNo","abstract":"

    The event is a No status

    "},"Constants.html#/c:@SDLVehicleDataEventStatusYes":{"name":"SDLVehicleDataEventStatusYes","abstract":"

    The event is a Yes status

    "},"Constants.html#/c:@SDLVehicleDataEventStatusNotSupported":{"name":"SDLVehicleDataEventStatusNotSupported","abstract":"

    Vehicle data event is not supported

    "},"Constants.html#/c:@SDLVehicleDataEventStatusFault":{"name":"SDLVehicleDataEventStatusFault","abstract":"

    The event is a Fault status

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotSupported":{"name":"SDLVehicleDataNotificationStatusNotSupported","abstract":"

    The vehicle data notification status is not supported

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusNormal":{"name":"SDLVehicleDataNotificationStatusNormal","abstract":"

    The vehicle data notification status is normal

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusActive":{"name":"SDLVehicleDataNotificationStatusActive","abstract":"

    The vehicle data notification status is active

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotUsed":{"name":"SDLVehicleDataNotificationStatusNotUsed","abstract":"

    The vehicle data notification status is not used

    "},"Constants.html#/c:@SDLVehicleDataResultCodeSuccess":{"name":"SDLVehicleDataResultCodeSuccess","abstract":"

    Individual vehicle data item / DTC / DID request or subscription successful

    "},"Constants.html#/c:@SDLVehicleDataResultCodeTruncatedData":{"name":"SDLVehicleDataResultCodeTruncatedData","abstract":"

    DTC / DID request successful, however, not all active DTCs or full contents of DID location available

    "},"Constants.html#/c:@SDLVehicleDataResultCodeDisallowed":{"name":"SDLVehicleDataResultCodeDisallowed","abstract":"

    This vehicle data item is not allowed for this app by SDL

    "},"Constants.html#/c:@SDLVehicleDataResultCodeUserDisallowed":{"name":"SDLVehicleDataResultCodeUserDisallowed","abstract":"

    The user has not granted access to this type of vehicle data item at this time

    "},"Constants.html#/c:@SDLVehicleDataResultCodeInvalidId":{"name":"SDLVehicleDataResultCodeInvalidId","abstract":"

    The ECU ID referenced is not a valid ID on the bus / system

    "},"Constants.html#/c:@SDLVehicleDataResultCodeVehicleDataNotAvailable":{"name":"SDLVehicleDataResultCodeVehicleDataNotAvailable","abstract":"

    The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system

    "},"Constants.html#/c:@SDLVehicleDataResultCodeDataAlreadySubscribed":{"name":"SDLVehicleDataResultCodeDataAlreadySubscribed","abstract":"

    The vehicle data item is already subscribed

    "},"Constants.html#/c:@SDLVehicleDataResultCodeDataNotSubscribed":{"name":"SDLVehicleDataResultCodeDataNotSubscribed","abstract":"

    The vehicle data item cannot be unsubscribed because it is not currently subscribed

    "},"Constants.html#/c:@SDLVehicleDataResultCodeIgnored":{"name":"SDLVehicleDataResultCodeIgnored","abstract":"

    The request for this item is ignored because it is already in progress

    "},"Constants.html#/c:@SDLVehicleDataStatusNoDataExists":{"name":"SDLVehicleDataStatusNoDataExists","abstract":"

    No data avaliable

    "},"Constants.html#/c:@SDLVehicleDataStatusOff":{"name":"SDLVehicleDataStatusOff","abstract":"

    The status is Off

    "},"Constants.html#/c:@SDLVehicleDataStatusOn":{"name":"SDLVehicleDataStatusOn","abstract":"

    The status is On

    "},"Constants.html#/c:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"

    GPS vehicle data

    "},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"

    Vehicle speed data

    "},"Constants.html#/c:@SDLVehicleDataTypeRPM":{"name":"SDLVehicleDataTypeRPM","abstract":"

    Vehicle RPM data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelLevel":{"name":"SDLVehicleDataTypeFuelLevel","abstract":"

    Vehicle fuel level data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelLevelState":{"name":"SDLVehicleDataTypeFuelLevelState","abstract":"

    Vehicle fuel level state data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelConsumption":{"name":"SDLVehicleDataTypeFuelConsumption","abstract":"

    Vehicle fuel consumption data

    "},"Constants.html#/c:@SDLVehicleDataTypeExternalTemperature":{"name":"SDLVehicleDataTypeExternalTemperature","abstract":"

    Vehicle external temperature data

    "},"Constants.html#/c:@SDLVehicleDataTypeVIN":{"name":"SDLVehicleDataTypeVIN","abstract":"

    Vehicle VIN data

    "},"Constants.html#/c:@SDLVehicleDataTypePRNDL":{"name":"SDLVehicleDataTypePRNDL","abstract":"

    Vehicle PRNDL data

    "},"Constants.html#/c:@SDLVehicleDataTypeTirePressure":{"name":"SDLVehicleDataTypeTirePressure","abstract":"

    Vehicle tire pressure data

    "},"Constants.html#/c:@SDLVehicleDataTypeOdometer":{"name":"SDLVehicleDataTypeOdometer","abstract":"

    Vehicle odometer data

    "},"Constants.html#/c:@SDLVehicleDataTypeBeltStatus":{"name":"SDLVehicleDataTypeBeltStatus","abstract":"

    Vehicle belt status data

    "},"Constants.html#/c:@SDLVehicleDataTypeBodyInfo":{"name":"SDLVehicleDataTypeBodyInfo","abstract":"

    Vehicle body info data

    "},"Constants.html#/c:@SDLVehicleDataTypeDeviceStatus":{"name":"SDLVehicleDataTypeDeviceStatus","abstract":"

    Vehicle device status data

    "},"Constants.html#/c:@SDLVehicleDataTypeECallInfo":{"name":"SDLVehicleDataTypeECallInfo","abstract":"

    Vehicle emergency call info data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelRange":{"name":"SDLVehicleDataTypeFuelRange","abstract":"

    Vehicle fuel range data

    "},"Constants.html#/c:@SDLVehicleDataTypeAirbagStatus":{"name":"SDLVehicleDataTypeAirbagStatus","abstract":"

    Vehicle airbag status data

    "},"Constants.html#/c:@SDLVehicleDataTypeEmergencyEvent":{"name":"SDLVehicleDataTypeEmergencyEvent","abstract":"

    Vehicle emergency event info

    "},"Constants.html#/c:@SDLVehicleDataTypeClusterModeStatus":{"name":"SDLVehicleDataTypeClusterModeStatus","abstract":"

    Vehicle cluster mode status data

    "},"Constants.html#/c:@SDLVehicleDataTypeMyKey":{"name":"SDLVehicleDataTypeMyKey","abstract":"

    Vehicle MyKey data

    "},"Constants.html#/c:@SDLVehicleDataTypeBraking":{"name":"SDLVehicleDataTypeBraking","abstract":"

    Vehicle braking data

    "},"Constants.html#/c:@SDLVehicleDataTypeWiperStatus":{"name":"SDLVehicleDataTypeWiperStatus","abstract":"

    Vehicle wiper status data

    "},"Constants.html#/c:@SDLVehicleDataTypeHeadlampStatus":{"name":"SDLVehicleDataTypeHeadlampStatus","abstract":"

    Vehicle headlamp status

    "},"Constants.html#/c:@SDLVehicleDataTypeBatteryVoltage":{"name":"SDLVehicleDataTypeBatteryVoltage","abstract":"

    Vehicle battery voltage data

    "},"Constants.html#/c:@SDLVehicleDataTypeEngineOilLife":{"name":"SDLVehicleDataTypeEngineOilLife","abstract":"

    Vehicle engine oil life data

    "},"Constants.html#/c:@SDLVehicleDataTypeEngineTorque":{"name":"SDLVehicleDataTypeEngineTorque","abstract":"

    Vehicle engine torque data

    "},"Constants.html#/c:@SDLVehicleDataTypeAccelerationPedal":{"name":"SDLVehicleDataTypeAccelerationPedal","abstract":"

    Vehicle accleration pedal data

    "},"Constants.html#/c:@SDLVehicleDataTypeSteeringWheel":{"name":"SDLVehicleDataTypeSteeringWheel","abstract":"

    Vehicle steering wheel data

    "},"Constants.html#/c:@SDLVehicleDataTypeElectronicParkBrakeStatus":{"name":"SDLVehicleDataTypeElectronicParkBrakeStatus","abstract":"

    Vehicle electronic parking brake status data

    "},"Constants.html#/c:@SDLVehicleDataTypeTurnSignal":{"name":"SDLVehicleDataTypeTurnSignal","abstract":"

    Vehicle turn signal data

    "},"Constants.html#/c:@SDLVehicleDataTypeCloudAppVehicleID":{"name":"SDLVehicleDataTypeCloudAppVehicleID","abstract":"

    The cloud application vehicle id. Used by cloud apps to identify a head unit

    "},"Constants.html#/c:@SDLVentilationModeUpper":{"name":"SDLVentilationModeUpper","abstract":"

    The upper ventilation mode

    "},"Constants.html#/c:@SDLVentilationModeLower":{"name":"SDLVentilationModeLower","abstract":"

    The lower ventilation mode

    "},"Constants.html#/c:@SDLVentilationModeBoth":{"name":"SDLVentilationModeBoth","abstract":"

    The both ventilation mode

    "},"Constants.html#/c:@SDLVentilationModeNone":{"name":"SDLVentilationModeNone","abstract":"

    No ventilation mode

    "},"Constants.html#/c:@SDLVideoStreamingCodecH264":{"name":"SDLVideoStreamingCodecH264","abstract":"

    H264

    "},"Constants.html#/c:@SDLVideoStreamingCodecH265":{"name":"SDLVideoStreamingCodecH265","abstract":"

    H265

    "},"Constants.html#/c:@SDLVideoStreamingCodecTheora":{"name":"SDLVideoStreamingCodecTheora","abstract":"

    Theora

    "},"Constants.html#/c:@SDLVideoStreamingCodecVP8":{"name":"SDLVideoStreamingCodecVP8","abstract":"

    VP8

    "},"Constants.html#/c:@SDLVideoStreamingCodecVP9":{"name":"SDLVideoStreamingCodecVP9","abstract":"

    VP9

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRAW":{"name":"SDLVideoStreamingProtocolRAW","abstract":"

    RAW

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRTP":{"name":"SDLVideoStreamingProtocolRTP","abstract":"

    RTP

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRTSP":{"name":"SDLVideoStreamingProtocolRTSP","abstract":"

    RTSP

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRTMP":{"name":"SDLVideoStreamingProtocolRTMP","abstract":"

    RTMP

    "},"Constants.html#/c:@SDLVideoStreamingProtocolWebM":{"name":"SDLVideoStreamingProtocolWebM","abstract":"

    WebM

    "},"Constants.html#/c:@SDLVideoStreamingStateStreamable":{"name":"SDLVideoStreamingStateStreamable","abstract":"

    STREAMABLE, the current app is allowed to stream video

    "},"Constants.html#/c:@SDLVideoStreamingStateNotStreamable":{"name":"SDLVideoStreamingStateNotStreamable","abstract":"

    NOT_STREAMABLE, the current app is not allowed to stream video

    "},"Constants.html#/c:@SDLVRCapabilitiesText":{"name":"SDLVRCapabilitiesText","abstract":"

    The SDL platform is capable of recognizing spoken text in the current language.

    "},"Constants.html#/c:@SDLWarningLightStatusOff":{"name":"SDLWarningLightStatusOff","abstract":"

    The warning light is off

    "},"Constants.html#/c:@SDLWarningLightStatusOn":{"name":"SDLWarningLightStatusOn","abstract":"

    The warning light is off

    "},"Constants.html#/c:@SDLWarningLightStatusFlash":{"name":"SDLWarningLightStatusFlash","abstract":"

    The warning light is flashing

    "},"Constants.html#/c:@SDLWarningLightStatusNotUsed":{"name":"SDLWarningLightStatusNotUsed","abstract":"

    The warning light is unused

    "},"Constants.html#/c:@SDLWayPointTypeAll":{"name":"SDLWayPointTypeAll","abstract":"

    All other waypoint types

    "},"Constants.html#/c:@SDLWayPointTypeDestination":{"name":"SDLWayPointTypeDestination","abstract":"

    The destination waypoint

    "},"Constants.html#/c:@SDLWiperStatusOff":{"name":"SDLWiperStatusOff","abstract":"

    Wiper is off

    "},"Constants.html#/c:@SDLWiperStatusAutomaticOff":{"name":"SDLWiperStatusAutomaticOff","abstract":"

    Wiper is off automatically

    "},"Constants.html#/c:@SDLWiperStatusOffMoving":{"name":"SDLWiperStatusOffMoving","abstract":"

    Wiper is moving but off

    "},"Constants.html#/c:@SDLWiperStatusManualIntervalOff":{"name":"SDLWiperStatusManualIntervalOff","abstract":"

    Wiper is off due to a manual interval

    "},"Constants.html#/c:@SDLWiperStatusManualIntervalOn":{"name":"SDLWiperStatusManualIntervalOn","abstract":"

    Wiper is on due to a manual interval

    "},"Constants.html#/c:@SDLWiperStatusManualLow":{"name":"SDLWiperStatusManualLow","abstract":"

    Wiper is on low manually

    "},"Constants.html#/c:@SDLWiperStatusManualHigh":{"name":"SDLWiperStatusManualHigh","abstract":"

    Wiper is on high manually

    "},"Constants.html#/c:@SDLWiperStatusManualFlick":{"name":"SDLWiperStatusManualFlick","abstract":"

    Wiper is on for a single wipe manually

    "},"Constants.html#/c:@SDLWiperStatusWash":{"name":"SDLWiperStatusWash","abstract":"

    Wiper is in wash mode

    "},"Constants.html#/c:@SDLWiperStatusAutomaticLow":{"name":"SDLWiperStatusAutomaticLow","abstract":"

    Wiper is on low automatically

    "},"Constants.html#/c:@SDLWiperStatusAutomaticHigh":{"name":"SDLWiperStatusAutomaticHigh","abstract":"

    Wiper is on high automatically

    "},"Constants.html#/c:@SDLWiperStatusCourtesyWipe":{"name":"SDLWiperStatusCourtesyWipe","abstract":"

    Wiper is performing a courtesy wipe

    "},"Constants.html#/c:@SDLWiperStatusAutomaticAdjust":{"name":"SDLWiperStatusAutomaticAdjust","abstract":"

    Wiper is on automatic adjust

    "},"Constants.html#/c:@SDLWiperStatusStalled":{"name":"SDLWiperStatusStalled","abstract":"

    Wiper is stalled

    "},"Constants.html#/c:@SDLWiperStatusNoDataExists":{"name":"SDLWiperStatusNoDataExists","abstract":"

    Wiper data is not available

    "},"Constants.html#/c:@SmartDeviceLinkVersionNumber":{"name":"SmartDeviceLinkVersionNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SmartDeviceLinkVersionString":{"name":"SmartDeviceLinkVersionString","abstract":"

    Undocumented

    "},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(im)initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:":{"name":"-initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)currentForecastSupported":{"name":"currentForecastSupported","abstract":"

    Whether or not the current forcast is supported.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMultidayForecastAmount":{"name":"maxMultidayForecastAmount","abstract":"

    The maximum number of day-by-day forecasts.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxHourlyForecastAmount":{"name":"maxHourlyForecastAmount","abstract":"

    The maximum number of hour-by-hour forecasts.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMinutelyForecastAmount":{"name":"maxMinutelyForecastAmount","abstract":"

    The maximum number of minute-by-minute forecasts.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)weatherForLocationSupported":{"name":"weatherForLocationSupported","abstract":"

    Whether or not the weather for location is supported.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:":{"name":"-initWithLocation:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:":{"name":"-initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)location":{"name":"location","abstract":"

    The location.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)currentForecast":{"name":"currentForecast","abstract":"

    The current forecast.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)minuteForecast":{"name":"minuteForecast","abstract":"

    A minute-by-minute array of forecasts.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)hourlyForecast":{"name":"hourlyForecast","abstract":"

    An hour-by-hour array of forecasts.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)multidayForecast":{"name":"multidayForecast","abstract":"

    A day-by-day array of forecasts.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)alerts":{"name":"alerts","abstract":"

    An array of weather alerts. This array should be ordered with the first object being the current day.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(im)initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:":{"name":"-initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:","abstract":"

    Convenience init for all parameters

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)currentTemperature":{"name":"currentTemperature","abstract":"

    The current temperature.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureHigh":{"name":"temperatureHigh","abstract":"

    The predicted high temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureLow":{"name":"temperatureLow","abstract":"

    The predicted low temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperature":{"name":"apparentTemperature","abstract":"

    The apparent temperature.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureHigh":{"name":"apparentTemperatureHigh","abstract":"

    The predicted high apparent temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureLow":{"name":"apparentTemperatureLow","abstract":"

    The predicted low apparent temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherSummary":{"name":"weatherSummary","abstract":"

    A summary of the weather.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)time":{"name":"time","abstract":"

    The time this data refers to.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)humidity":{"name":"humidity","abstract":"

    From 0 to 1, percentage humidity.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)cloudCover":{"name":"cloudCover","abstract":"

    From 0 to 1, percentage cloud cover.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)moonPhase":{"name":"moonPhase","abstract":"

    From 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windBearing":{"name":"windBearing","abstract":"

    In degrees, true north at 0 degrees.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windGust":{"name":"windGust","abstract":"

    In km/hr

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windSpeed":{"name":"windSpeed","abstract":"

    In km/hr

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormBearing":{"name":"nearestStormBearing","abstract":"

    In degrees, true north at 0 degrees.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormDistance":{"name":"nearestStormDistance","abstract":"

    In km

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipAccumulation":{"name":"precipAccumulation","abstract":"

    In cm

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipIntensity":{"name":"precipIntensity","abstract":"

    In cm of water per hour.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipProbability":{"name":"precipProbability","abstract":"

    From 0 to 1, percentage chance.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipType":{"name":"precipType","abstract":"

    A description of the precipitation type (e.g. rain, snow, sleet, hail)

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)visibility":{"name":"visibility","abstract":"

    In km

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherIcon":{"name":"weatherIcon","abstract":"

    The weather icon image.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(im)initWithTitle:summary:expires:regions:severity:timeIssued:":{"name":"-initWithTitle:summary:expires:regions:severity:timeIssued:","abstract":"

    Convenience init for all parameters

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)title":{"name":"title","abstract":"

    The title of the alert.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)summary":{"name":"summary","abstract":"

    A summary for the alert.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)expires":{"name":"expires","abstract":"

    The date the alert expires.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)regions":{"name":"regions","abstract":"

    Regions affected.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)severity":{"name":"severity","abstract":"

    Severity of the weather alert.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)timeIssued":{"name":"timeIssued","abstract":"

    The date the alert was issued.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:":{"name":"-initWithText:image:","abstract":"

    Undocumented

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:position:":{"name":"-initWithText:image:position:","abstract":"

    Undocumented

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)text":{"name":"text","abstract":"

    Text to display for VR Help item

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)image":{"name":"image","abstract":"

    Image for VR Help item

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)position":{"name":"position","abstract":"

    Position to display item in VR Help list

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)voiceCommands":{"name":"voiceCommands","abstract":"

    The strings the user can say to activate this voice command

    ","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)handler":{"name":"handler","abstract":"

    The handler that will be called when the command is activated

    ","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(im)initWithVoiceCommands:handler:":{"name":"-initWithVoiceCommands:handler:","abstract":"

    Undocumented

    ","parent_name":"SDLVoiceCommand"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)protocol":{"name":"protocol","abstract":"

    Protocol type, see VideoStreamingProtocol

    ","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)codec":{"name":"codec","abstract":"

    Codec type, see VideoStreamingCodec

    ","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(im)initWithCodec:protocol:":{"name":"-initWithCodec:protocol:","abstract":"

    Undocumented

    ","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:","abstract":"

    Undocumented

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredResolution":{"name":"preferredResolution","abstract":"

    The preferred resolution of a video stream for decoding and rendering on HMI

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)maxBitrate":{"name":"maxBitrate","abstract":"

    The maximum bitrate of video stream that is supported, in kbps, optional

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats":{"name":"supportedFormats","abstract":"

    Detailed information on each format supported by this system, in its preferred order

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported":{"name":"hapticSpatialDataSupported","abstract":"

    True if the system can utilize the haptic spatial data from the source being streamed.

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)major":{"name":"major","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)minor":{"name":"minor","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)patch":{"name":"patch","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)stringVersion":{"name":"stringVersion","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithMajor:minor:patch:":{"name":"-initWithMajor:minor:patch:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithMajor:minor:patch:":{"name":"+versionWithMajor:minor:patch:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithString:":{"name":"-initWithString:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithString:":{"name":"+versionWithString:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithSyncMsgVersion:":{"name":"-initWithSyncMsgVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSyncMsgVersion:":{"name":"+versionWithSyncMsgVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)compare:":{"name":"-compare:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanVersion:":{"name":"-isLessThanVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isEqualToVersion:":{"name":"-isEqualToVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanVersion:":{"name":"-isGreaterThanVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanOrEqualToVersion:":{"name":"-isGreaterThanOrEqualToVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanOrEqualToVersion:":{"name":"-isLessThanOrEqualToVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)make":{"name":"make","abstract":"

    The make of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)model":{"name":"model","abstract":"

    The model of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)modelYear":{"name":"modelYear","abstract":"

    The model year of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)trim":{"name":"trim","abstract":"

    The trim of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)dataType":{"name":"dataType","abstract":"

    Defined published data element type

    ","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)resultCode":{"name":"resultCode","abstract":"

    Published data result code

    ","parent_name":"SDLVehicleDataResult"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(im)initWithTurnList:softButtons:":{"name":"-initWithTurnList:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)turnList":{"name":"turnList","abstract":"

    Optional, SDLTurn, 1 - 100 entries

    ","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)softButtons":{"name":"softButtons","abstract":"

    Required, SDLSoftButton, 0 - 1 Entries

    ","parent_name":"SDLUpdateTurnList"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"

    The result of requesting to unsubscribe to the GPSData.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"

    The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"

    The result of requesting to unsubscribe to the number of revolutions per minute of the engine.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The result of requesting to unsubscribe to the fuel level in the tank (percentage)

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The result of requesting to unsubscribe to the fuel level state.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"

    The result of requesting to unsubscribe to the fuel range.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The result of requesting to unsubscribe to the external temperature in degrees celsius.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"

    The result of requesting to unsubscribe to the PRNDL status.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"

    The result of requesting to unsubscribe to the tireStatus.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"

    The result of requesting to unsubscribe to the odometer in km.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"

    The result of requesting to unsubscribe to the status of the seat belts.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The result of requesting to unsubscribe to the body information including power modes.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The result of requesting to unsubscribe to the device status including signal and battery strength.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"

    The result of requesting to unsubscribe to the status of the brake pedal.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The result of requesting to unsubscribe to the status of the wipers.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"

    The result of requesting to unsubscribe to the status of the head lamps.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"

    The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"

    The result of requesting to unsubscribe to the emergency call info

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The result of requesting to unsubscribe to the airbag status

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    The result of requesting to unsubscribe to the emergency event

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"

    The result of requesting to unsubscribe to the cluster modes

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"

    The result of requesting to unsubscribe to the myKey status

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The result of requesting to unsubscribe to the electronic parking brake status

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"

    The result of requesting to unsubscribe to the turn signal

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The result of requesting to unsubscribe to the cloud app vehicle id

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:","abstract":"

    Convenience init for unsubscribing to all possible vehicle data items.

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for unsubscribing to all possible vehicle data items.

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for unsubscribing to all possible vehicle data items.

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gps":{"name":"gps","abstract":"

    If true, unsubscribes from GPS

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)speed":{"name":"speed","abstract":"

    If true, unsubscribes from Speed

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"

    If true, unsubscribes from RPM

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    If true, unsubscribes from Fuel Level

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    If true, unsubscribes from Fuel Level State

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    If true, unsubscribes from Fuel Range

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    If true, unsubscribes from Instant Fuel Consumption

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    If true, unsubscribes from External Temperature

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"

    If true, unsubscribes from PRNDL

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    If true, unsubscribes from Tire Pressure

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"

    If true, unsubscribes from Odometer

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    If true, unsubscribes from Belt Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    If true, unsubscribes from Body Information

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    If true, unsubscribes from Device Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    If true, unsubscribes from Driver Braking

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    If true, unsubscribes from Wiper Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    If true, unsubscribes from Head Lamp Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    If true, unsubscribes from Engine Oil Life

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    If true, unsubscribes from Engine Torque

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    If true, unsubscribes from Acc Pedal Position

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    If true, unsubscribes from Steering Wheel Angle data

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    If true, unsubscribes from eCallInfo

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    If true, unsubscribes from Airbag Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    If true, unsubscribes from Emergency Event

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    If true, unsubscribes from Cluster Mode Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"

    If true, unsubscribes from My Key

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    A boolean value. If true, unsubscribes to the Electronic Parking Brake Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    A boolean value. If true, unsubscribes to the Turn Signal

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    A boolean value. If true, unsubscribes to the Cloud App Vehicle ID

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(im)initWithButtonName:":{"name":"-initWithButtonName:","abstract":"

    Undocumented

    ","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(py)buttonName":{"name":"buttonName","abstract":"

    A name of the button to unsubscribe from","parent_name":"SDLUnsubscribeButton"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(im)initWithNavigationText:turnIcon:":{"name":"-initWithNavigationText:turnIcon:","abstract":"

    Undocumented

    ","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)navigationText":{"name":"navigationText","abstract":"

    Individual turn text. Must provide at least text or icon for a given turn

    ","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)turnIcon":{"name":"turnIcon","abstract":"

    Individual turn icon. Must provide at least text or icon for a given turn

    ","parent_name":"SDLTurn"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventDelegate":{"name":"touchEventDelegate","abstract":"

    Notified of processed touches such as pinches, pans, and taps

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventHandler":{"name":"touchEventHandler","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapDistanceThreshold":{"name":"tapDistanceThreshold","abstract":"

    Distance between two taps on the screen, in the head unit’s coordinate system, used for registering double-tap callbacks.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)panDistanceThreshold":{"name":"panDistanceThreshold","abstract":"

    Minimum distance for a pan gesture in the head unit’s coordinate system, used for registering pan callbacks.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapTimeThreshold":{"name":"tapTimeThreshold","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)movementTimeThreshold":{"name":"movementTimeThreshold","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)enableSyncedPanning":{"name":"enableSyncedPanning","abstract":"

    If set to NO, the display link syncing will be ignored and movementTimeThreshold will be used. Defaults to YES.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)initWithHitTester:":{"name":"-initWithHitTester:","abstract":"

    Initialize a touch manager with a hit tester if available

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)syncFrame":{"name":"-syncFrame","abstract":"

    Called by SDLStreamingMediaManager in sync with the streaming framerate. This helps to moderate panning gestures by allowing the UI to be modified in time with the framerate.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)pressAvailable":{"name":"pressAvailable","abstract":"

    Whether or not long presses are available

    ","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)multiTouchAvailable":{"name":"multiTouchAvailable","abstract":"

    Whether or not multi-touch (e.g. a pinch gesture) is available

    ","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)doublePressAvailable":{"name":"doublePressAvailable","abstract":"

    Whether or not a double tap is available

    ","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)touchEventId":{"name":"touchEventId","abstract":"

    A touch’s unique identifier. The application can track the current touch events by id.

    ","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)timeStamp":{"name":"timeStamp","abstract":"

    The time that the touch was recorded. This number can the time since the beginning of the session or something else as long as the units are in milliseconds.

    ","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)coord":{"name":"coord","abstract":"

    The touch’s coordinate

    ","parent_name":"SDLTouchEvent"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)x":{"name":"x","abstract":"

    The x value of the touch coordinate

    ","parent_name":"SDLTouchCoord"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)y":{"name":"y","abstract":"

    The y value of the touch coordinate

    ","parent_name":"SDLTouchCoord"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(im)initWithTouchEvent:":{"name":"-initWithTouchEvent:","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)identifier":{"name":"identifier","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)location":{"name":"location","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)timeStamp":{"name":"timeStamp","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isFirstFinger":{"name":"isFirstFinger","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isSecondFinger":{"name":"isSecondFinger","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)pressureTelltale":{"name":"pressureTelltale","abstract":"

    Status of the Tire Pressure Telltale. See WarningLightStatus.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftFront":{"name":"leftFront","abstract":"

    The status of the left front tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightFront":{"name":"rightFront","abstract":"

    The status of the right front tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftRear":{"name":"leftRear","abstract":"

    The status of the left rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightRear":{"name":"rightRear","abstract":"

    The status of the right rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerLeftRear":{"name":"innerLeftRear","abstract":"

    The status of the inner left rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerRightRear":{"name":"innerRightRear","abstract":"

    The status of the innter right rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)name":{"name":"name","abstract":"

    The enumeration identifying the field.

    ","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)characterSet":{"name":"characterSet","abstract":"

    The character set that is supported in this field.

    ","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)width":{"name":"width","abstract":"

    The number of characters in one row of this field.

    ","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)rows":{"name":"rows","abstract":"

    The number of rows for this text field.

    ","parent_name":"SDLTextField"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:":{"name":"-initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:","abstract":"

    Undocumented

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryColor:secondaryColor:backgroundColor:":{"name":"-initWithPrimaryColor:secondaryColor:backgroundColor:","abstract":"

    Undocumented

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)primaryColor":{"name":"primaryColor","abstract":"

    The primary color. This must always be your primary brand color. If the OEM only uses one color, this will be the color. It is recommended to the OEMs that the primaryColor should change the mediaClockTimer bar and the highlight color of soft buttons.

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)secondaryColor":{"name":"secondaryColor","abstract":"

    The secondary color. This may be an accent or complimentary color to your primary brand color. If the OEM uses this color, they must also use the primary color. It is recommended to the OEMs that the secondaryColor should change the background color of buttons, such as soft buttons.

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)backgroundColor":{"name":"backgroundColor","abstract":"

    The background color to be used on the template. If the OEM does not support this parameter, assume on dayColorScheme that this will be a light color, and on nightColorScheme a dark color. You should do the same for your custom schemes.

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithFahrenheitValue:":{"name":"-initWithFahrenheitValue:","abstract":"

    Convenience init for a fahrenheit temperature value.

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithCelsiusValue:":{"name":"-initWithCelsiusValue:","abstract":"

    Convenience init for a celsius temperature value.

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithUnit:value:":{"name":"-initWithUnit:value:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)unit":{"name":"unit","abstract":"

    Temperature unit

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)value":{"name":"value","abstract":"

    Temperature value in specified unit. Range depends on OEM and is not checked by SDL.

    ","parent_name":"SDLTemperature"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(im)initWithText:type:":{"name":"-initWithText:type:","abstract":"

    Initialize with text and a type

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)textChunksFromString:":{"name":"+textChunksFromString:","abstract":"

    Create TTS using text

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)sapiChunksFromString:":{"name":"+sapiChunksFromString:","abstract":"

    Create TTS using SAPI

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)lhPlusChunksFromString:":{"name":"+lhPlusChunksFromString:","abstract":"

    Create TTS using LH Plus

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)prerecordedChunksFromString:":{"name":"+prerecordedChunksFromString:","abstract":"

    Create TTS using prerecorded chunks

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)silenceChunks":{"name":"+silenceChunks","abstract":"

    Create TTS using silence

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)fileChunksWithName:":{"name":"+fileChunksWithName:","abstract":"

    Create TTS to play an audio file previously uploaded to the system.

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)text":{"name":"text","abstract":"

    Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the type field.

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)type":{"name":"type","abstract":"

    The type of information in the text field (e.g. phrase to be spoken, phoneme specification, name of pre-recorded sound).

    ","parent_name":"SDLTTSChunk"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithType:fileName:":{"name":"-initWithType:fileName:","abstract":"

    Create a generic system request with a file name

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithProprietaryType:fileName:":{"name":"-initWithProprietaryType:fileName:","abstract":"

    Create an OEM_PROPRIETARY system request with a subtype and file name

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType":{"name":"requestType","abstract":"

    The type of system request. Note that Proprietary requests should forward the binary data to the known proprietary module on the system.

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"

    A request subType used when the requestType is OEM_SPECIFIC.

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)fileName":{"name":"fileName","abstract":"

    Filename of HTTP data to store in predefined system staging area.

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displayCapabilities":{"name":"displayCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"

    If returned, the platform supports on-screen SoftButtons

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"

    If returned, the platform supports custom on-screen Presets

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)speechCapabilities":{"name":"speechCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)prerecordedSpeechCapabilities":{"name":"prerecordedSpeechCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)vrCapability":{"name":"vrCapability","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)pcmStreamCapability":{"name":"pcmStreamCapability","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"

    If returned, the platform supports app services

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)navigationCapability":{"name":"navigationCapability","abstract":"

    If returned, the platform supports navigation

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)phoneCapability":{"name":"phoneCapability","abstract":"

    If returned, the platform supports making phone calls

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"

    If returned, the platform supports video streaming

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"

    If returned, the platform supports remote control capabilities

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)init":{"name":"-init","abstract":"

    Init is unavailable. Dependencies must be injected using initWithConnectionManager:

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"

    Creates a new system capability manager with a specified connection manager

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)stop":{"name":"-stop","abstract":"

    Stops the manager. This method is used internally.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)updateCapabilityType:completionHandler:":{"name":"-updateCapabilityType:completionHandler:","abstract":"

    Retrieves a capability type from the remote system. This function must be called in order to retrieve the values for navigationCapability, phoneCapability, videoStreamingCapability, remoteControlCapability, and appServicesCapabilities. If you do not call this method first, those values will be nil. After calling this method, assuming there is no error in the handler, you may retrieve the capability you requested from the manager within the handler.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithAppServicesCapabilities:":{"name":"-initWithAppServicesCapabilities:","abstract":"

    Convenience init for an App Service Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithNavigationCapability:":{"name":"-initWithNavigationCapability:","abstract":"

    Convenience init for a Navigation Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithPhoneCapability:":{"name":"-initWithPhoneCapability:","abstract":"

    Convenience init for a Phone Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithVideoStreamingCapability:":{"name":"-initWithVideoStreamingCapability:","abstract":"

    Convenience init for a Video Streaming Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithRemoteControlCapability:":{"name":"-initWithRemoteControlCapability:","abstract":"

    Convenience init for a Remote Control Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"

    Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other parameter included.

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"

    Describes the capabilities of app services including what service types are supported and the current state of services.

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)navigationCapability":{"name":"navigationCapability","abstract":"

    Describes the extended capabilities of the onboard navigation system

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)phoneCapability":{"name":"phoneCapability","abstract":"

    Describes the extended capabilities of the module’s phone feature

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"

    Describes the capabilities of the module’s video streaming feature

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"

    Describes the extended capabilities of the module’s remote control feature

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"

    The major version indicates versions that is not-compatible to previous versions

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)minorVersion":{"name":"minorVersion","abstract":"

    The minor version indicates a change to a previous version that should still allow to be run on an older version (with limited functionality)

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"

    Allows backward-compatible fixes to the API without increasing the minor version of the interface

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"

    The result of requesting to subscribe to the GPSData.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"

    The result of requesting to subscribe to the vehicle speed in kilometers per hour.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"

    The result of requesting to subscribe to the number of revolutions per minute of the engine.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The result of requesting to subscribe to the fuel level in the tank (percentage)

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The result of requesting to subscribe to the fuel level state.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"

    The result of requesting to subscribe to the fuel range.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The result of requesting to subscribe to the external temperature in degrees celsius.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"

    The result of requesting to subscribe to the PRNDL status.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"

    The result of requesting to subscribe to the tireStatus.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"

    The result of requesting to subscribe to the odometer in km.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"

    The result of requesting to subscribe to the status of the seat belts.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The result of requesting to subscribe to the body information including power modes.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The result of requesting to subscribe to the device status including signal and battery strength.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"

    The result of requesting to subscribe to the status of the brake pedal.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The result of requesting to subscribe to the status of the wipers.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"

    The result of requesting to subscribe to the status of the head lamps.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"

    The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    The result of requesting to subscribe to the accelerator pedal position (percentage depressed)

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    The result of requesting to subscribe to the current angle of the steering wheel (in deg)

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"

    The result of requesting to subscribe to the emergency call info

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The result of requesting to subscribe to the airbag status

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    The result of requesting to subscribe to the emergency event

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"

    The result of requesting to subscribe to the cluster modes

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"

    The result of requesting to subscribe to the myKey status

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The result of requesting to subscribe to the electronic parking brake status

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"

    The result of requesting to subscribe to the turn signal

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The result of requesting to subscribe to the cloud app vehicle ID

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:","abstract":"

    Convenience init for subscribing to all possible vehicle data items.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for subscribing to all possible vehicle data items.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for subscribing to all possible vehicle data items.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gps":{"name":"gps","abstract":"

    A boolean value. If true, subscribes GPS data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)speed":{"name":"speed","abstract":"

    A boolean value. If true, subscribes Speed data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"

    A boolean value. If true, subscribes RPM data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    A boolean value. If true, subscribes Fuel Level data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    A boolean value. If true, subscribes Fuel Level State data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    A boolean value. If true, subscribes Fuel Range data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    A boolean value. If true, subscribes Instant Fuel Consumption data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    A boolean value. If true, subscribes External Temperature data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"

    A boolean value. If true, subscribes PRNDL data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    A boolean value. If true, subscribes Tire Pressure status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"

    A boolean value. If true, subscribes Odometer data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    A boolean value. If true, subscribes Belt Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    A boolean value. If true, subscribes Body Information data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    A boolean value. If true, subscribes Device Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    A boolean value. If true, subscribes Driver Braking data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    A boolean value. If true, subscribes Wiper Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    A boolean value. If true, subscribes Head Lamp Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    A boolean value. If true, subscribes to Engine Oil Life data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    A boolean value. If true, subscribes Engine Torque data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    A boolean value. If true, subscribes Acc Pedal Position data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    A boolean value. If true, subscribes Steering Wheel Angle data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    A boolean value. If true, subscribes eCall Info data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    A boolean value. If true, subscribes Airbag Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    A boolean value. If true, subscribes Emergency Event data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    A boolean value. If true, subscribes Cluster Mode Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"

    A boolean value. If true, subscribes myKey data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    A boolean value. If true, subscribes to the electronic parking brake status.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    A boolean value. If true, subscribes to the turn signal status.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    A boolean value. If true, subscribes to the cloud app vehicle ID.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"

    Construct a SDLSubscribeButton with a handler callback when an event occurs.

    ","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithButtonName:handler:":{"name":"-initWithButtonName:handler:","abstract":"

    Undocumented

    ","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)handler":{"name":"handler","abstract":"

    A handler that will let you know when the button you subscribed to is selected.

    ","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)buttonName":{"name":"buttonName","abstract":"

    The name of the button to subscribe to","parent_name":"SDLSubscribeButton"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager":{"name":"touchManager","abstract":"

    Touch Manager responsible for providing touch event notifications.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioManager":{"name":"audioManager","abstract":"

    Audio Manager responsible for managing streaming audio.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)rootViewController":{"name":"rootViewController","abstract":"

    This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on SDLStreamingMediaConfiguration rootViewController. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)focusableItemManager":{"name":"focusableItemManager","abstract":"

    A haptic interface that can be updated to reparse views within the window you’ve provided. Send a SDLDidUpdateProjectionView notification or call the updateInterfaceLayout method to reparse. The output of this haptic interface occurs in the touchManager property where it will call the delegate.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)streamingSupported":{"name":"streamingSupported","abstract":"

    Whether or not video streaming is supported

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoConnected":{"name":"videoConnected","abstract":"

    Whether or not the video session is connected.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoEncrypted":{"name":"videoEncrypted","abstract":"

    Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioConnected":{"name":"audioConnected","abstract":"

    Whether or not the audio session is connected.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioEncrypted":{"name":"audioEncrypted","abstract":"

    Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoStreamingPaused":{"name":"videoStreamingPaused","abstract":"

    Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)screenSize":{"name":"screenSize","abstract":"

    This is the current screen size of a connected display. This will be the size the video encoder uses to encode the raw image data.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoFormat":{"name":"videoFormat","abstract":"

    This is the agreed upon format of video encoder that is in use, or nil if not currently connected.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)supportedFormats":{"name":"supportedFormats","abstract":"

    A list of all supported video formats by this manager

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)pixelBufferPool":{"name":"pixelBufferPool","abstract":"

    The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)requestedEncryptionType":{"name":"requestedEncryptionType","abstract":"

    The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"

    Create a new streaming media manager for navigation and VPM apps with a specified configuration

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startWithProtocol:":{"name":"-startWithProtocol:","abstract":"

    Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on SDLManager.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startAudioWithProtocol:":{"name":"-startAudioWithProtocol:","abstract":"

    Start the audio feature of the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on SDLManager.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startVideoWithProtocol:":{"name":"-startVideoWithProtocol:","abstract":"

    Start the video feature of the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on SDLManager.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stop":{"name":"-stop","abstract":"

    Stop the manager. This method is used internally.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopAudio":{"name":"-stopAudio","abstract":"

    Stop the audio feature of the manager. This method is used internally.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopVideo":{"name":"-stopVideo","abstract":"

    Stop the video feature of the manager. This method is used internally.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:":{"name":"-sendVideoData:","abstract":"

    This method receives raw image data and will run iOS8+‘s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:presentationTimestamp:":{"name":"-sendVideoData:presentationTimestamp:","abstract":"

    This method receives raw image data and will run iOS8+‘s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"

    This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"

    Set security managers which could be used. This is primarily used with video streaming applications to authenticate and perhaps encrypt traffic data.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)maximumDesiredEncryption":{"name":"maximumDesiredEncryption","abstract":"

    What encryption level video/audio streaming should be. The default is SDLStreamingEncryptionFlagAuthenticateAndEncrypt.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)customVideoEncoderSettings":{"name":"customVideoEncoderSettings","abstract":"

    Properties to use for applications that utilize the video encoder for streaming. See VTCompressionProperties.h for more details. For example, you can set kVTCompressionPropertyKey_ExpectedFrameRate to set your framerate. Setting the framerate this way will also set the framerate if you use CarWindow automatic streaming.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)dataSource":{"name":"dataSource","abstract":"

    Usable to change run time video stream setup behavior. Only use this and modify the results if you really know what you’re doing. The head unit defaults are generally good.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController":{"name":"rootViewController","abstract":"

    Set the initial view controller your video streaming content is within.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)carWindowRenderingType":{"name":"carWindowRenderingType","abstract":"

    Declares if CarWindow will use layer rendering or view rendering. Defaults to layer rendering.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)enableForcedFramerateSync":{"name":"enableForcedFramerateSync","abstract":"

    When YES, the StreamingMediaManager will run a CADisplayLink with the framerate set to the video encoder settings kVTCompressionPropertyKey_ExpectedFrameRate. This then forces TouchManager (and CarWindow, if used) to sync their callbacks to the framerate. If using CarWindow, this must be YES. If NO, enableSyncedPanning on SDLTouchManager will be set to NO. Defaults to YES.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)allowMultipleViewControllerOrientations":{"name":"allowMultipleViewControllerOrientations","abstract":"

    When YES, the StreamingMediaManager will disable its internal checks that the rootViewController only has one supportedOrientation. Having multiple orientations can cause streaming issues. If you wish to disable this check, set it to YES. Defaults to NO.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)init":{"name":"-init","abstract":"

    Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you’d like custom video encoder settings, you can set the property manually.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithSecurityManagers:encryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithSecurityManagers:encryptionFlag:videoSettings:dataSource:rootViewController:","abstract":"

    Manually set all the properties to the streaming media configuration

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithSecurityManagers:":{"name":"-initWithSecurityManagers:","abstract":"

    Create a secure configuration for each of the security managers provided.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfigurationWithSecurityManagers:":{"name":"+secureConfigurationWithSecurityManagers:","abstract":"

    Create a secure configuration for each of the security managers provided.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)insecureConfiguration":{"name":"+insecureConfiguration","abstract":"

    Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you’d like custom video encoder settings, you can set the property manually. This is equivalent to init.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingInsecureConfigurationWithInitialViewController:":{"name":"+autostreamingInsecureConfigurationWithInitialViewController:","abstract":"

    Create a CarWindow insecure configuration with a view controller

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingSecureConfigurationWithSecurityManagers:initialViewController:":{"name":"+autostreamingSecureConfigurationWithSecurityManagers:initialViewController:","abstract":"

    Create a CarWindow secure configuration with a view controller and security managers

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(im)initWithCountryCode:fccFacilityId:":{"name":"-initWithCountryCode:fccFacilityId:","abstract":"

    Undocumented

    ","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)countryCode":{"name":"countryCode","abstract":"

    @abstract Binary Representation of ITU Country Code. USA Code is 001.

    ","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)fccFacilityId":{"name":"fccFacilityId","abstract":"

    @abstract Binary representation of unique facility ID assigned by the FCC","parent_name":"SDLStationIDNumber"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithTimeInterval:":{"name":"-initWithTimeInterval:","abstract":"

    Create a time struct with a time interval (time in seconds). Fractions of the second will be eliminated and rounded down.

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithHours:minutes:seconds:":{"name":"-initWithHours:minutes:seconds:","abstract":"

    Create a time struct with hours, minutes, and seconds

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)hours":{"name":"hours","abstract":"

    The hour of the media clock

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)minutes":{"name":"minutes","abstract":"

    The minute of the media clock

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)seconds":{"name":"seconds","abstract":"

    The second of the media clock

    ","parent_name":"SDLStartTime"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTS:":{"name":"-initWithTTS:","abstract":"

    Undocumented

    ","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTSChunks:":{"name":"-initWithTTSChunks:","abstract":"

    Undocumented

    ","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(py)ttsChunks":{"name":"ttsChunks","abstract":"

    An array of TTSChunk structs which, taken together, specify the phrase to be spoken

    ","parent_name":"SDLSpeak"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)name":{"name":"name","abstract":"

    The name of this soft button state

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)artwork":{"name":"artwork","abstract":"

    The artwork to be used with this button or nil if it is text-only

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)text":{"name":"text","abstract":"

    The text to be used with this button or nil if it is image-only

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)highlighted":{"name":"highlighted","abstract":"

    Whether or not the button should be highlighted on the UI

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)systemAction":{"name":"systemAction","abstract":"

    A special system action

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)softButton":{"name":"softButton","abstract":"

    An SDLSoftButton describing this state

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:image:":{"name":"-initWithStateName:text:image:","abstract":"

    Create the soft button state. Either the text or artwork or both may be set.

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:artwork:":{"name":"-initWithStateName:text:artwork:","abstract":"

    Create the soft button state. Either the text or artwork or both may be set.

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)name":{"name":"name","abstract":"

    The name of this button

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states":{"name":"states","abstract":"

    All states available to this button

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentState":{"name":"currentState","abstract":"

    The name of the current state of this soft button

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentStateSoftButton":{"name":"currentStateSoftButton","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)eventHandler":{"name":"eventHandler","abstract":"

    The handler to be called when the button is in the current state and is pressed

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:states:initialStateName:handler:":{"name":"-initWithName:states:initialStateName:handler:","abstract":"

    Create a multi-state (or single-state, but you should use initWithName:state: instead for that case) soft button. For example, a button that changes its image or text, such as a repeat or shuffle button.

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:state:handler:":{"name":"-initWithName:state:handler:","abstract":"

    Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToStateNamed:":{"name":"-transitionToStateNamed:","abstract":"

    Transition the soft button to another state in the states property. The wrapper considers all transitions valid (assuming a state with that name exists).

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToNextState":{"name":"-transitionToNextState","abstract":"

    Transition the soft button to the next state of the array set when in the states property

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)stateWithName:":{"name":"-stateWithName:","abstract":"

    Return a state from the state array with a specific name.

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"

    The button supports a short press.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"

    The button supports a LONG press.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"

    The button supports button down and button up.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)imageSupported":{"name":"imageSupported","abstract":"

    The button supports referencing a static or dynamic image.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithType:text:image:highlighted:buttonId:systemAction:handler:":{"name":"-initWithType:text:image:highlighted:buttonId:systemAction:handler:","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)handler":{"name":"handler","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)type":{"name":"type","abstract":"

    Describes whether this soft button displays only text, only an image, or both

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)text":{"name":"text","abstract":"

    Optional text to display (if defined as TEXT or BOTH type)

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)image":{"name":"image","abstract":"

    Optional image struct for SoftButton (if defined as IMAGE or BOTH type)

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)isHighlighted":{"name":"isHighlighted","abstract":"

    Displays in an alternate mode, e.g. with a colored background or foreground. Depends on the IVI system.

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)softButtonID":{"name":"softButtonID","abstract":"

    Value which is returned via OnButtonPress / OnButtonEvent

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)systemAction":{"name":"systemAction","abstract":"

    Parameter indicating whether selecting a SoftButton shall call a specific system action. This is intended to allow Notifications to bring the callee into full / focus; or in the case of persistent overlays, the overlay can persist when a SoftButton is pressed.

    ","parent_name":"SDLSoftButton"},"Classes/SDLSliderResponse.html#/c:objc(cs)SDLSliderResponse(py)sliderPosition":{"name":"sliderPosition","abstract":"

    The selected position of the slider.

    ","parent_name":"SDLSliderResponse"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:":{"name":"-initWithNumTicks:position:","abstract":"

    Create an SDLSlider with only the number of ticks and position. Note that this is not enough to get a SUCCESS response. You must supply additional data. See below for required parameters.

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooter:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooter:timeout:","abstract":"

    Create an SDLSlider with all required data and a static footer (or no footer).

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:","abstract":"

    Create an SDLSlider with all required data and a dynamic footer (or no footer).

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)numTicks":{"name":"numTicks","abstract":"

    Represents a number of selectable items on a horizontal axis

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)position":{"name":"position","abstract":"

    An Initial position of slider control

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderHeader":{"name":"sliderHeader","abstract":"

    A text header to display

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderFooter":{"name":"sliderFooter","abstract":"

    A text footer to display

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)timeout":{"name":"timeout","abstract":"

    An App defined timeout in milliseconds

    ","parent_name":"SDLSlider"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)status":{"name":"status","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)monitoringSystemStatus":{"name":"monitoringSystemStatus","abstract":"

    The status of TPMS for this particular tire

    ","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)pressure":{"name":"pressure","abstract":"

    The pressure value of this particular tire in kPa (kilopascals)

    ","parent_name":"SDLSingleTireStatus"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(im)initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:":{"name":"-initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText1":{"name":"navigationText1","abstract":"

    The first line of text in a multi-line overlay screen.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText2":{"name":"navigationText2","abstract":"

    The second line of text in a multi-line overlay screen.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)eta":{"name":"eta","abstract":"

    Estimated Time of Arrival time at final destination

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)timeToDestination":{"name":"timeToDestination","abstract":"

    The amount of time needed to reach the final destination

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)totalDistance":{"name":"totalDistance","abstract":"

    The distance to the final destination

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)turnIcon":{"name":"turnIcon","abstract":"

    An icon to show with the turn description

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)nextTurnIcon":{"name":"nextTurnIcon","abstract":"

    An icon to show with the next turn description

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuver":{"name":"distanceToManeuver","abstract":"

    Fraction of distance till next maneuver (starting from when AlertManeuver is triggered). Used to calculate progress bar.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuverScale":{"name":"distanceToManeuverScale","abstract":"

    Distance till next maneuver (starting from) from previous maneuver. Used to calculate progress bar.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)maneuverComplete":{"name":"maneuverComplete","abstract":"

    If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)softButtons":{"name":"softButtons","abstract":"

    Three dynamic SoftButtons available (first SoftButton is fixed to Turns). If omitted on supported displays, the currently displayed SoftButton values will not change.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:":{"name":"-initWithMainField1:mainField2:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:":{"name":"-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField1":{"name":"mainField1","abstract":"

    The text displayed in a single-line display, or in the upper display","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField2":{"name":"mainField2","abstract":"

    The text displayed on the second display line of a two-line display

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField3":{"name":"mainField3","abstract":"

    The text displayed on the first display line of the second page

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField4":{"name":"mainField4","abstract":"

    The text displayed on the second display line of the second page

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)alignment":{"name":"alignment","abstract":"

    The alignment that Specifies how mainField1 and mainField2 text","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)statusBar":{"name":"statusBar","abstract":"

    Text in the Status Bar

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaClock":{"name":"mediaClock","abstract":"

    This property is deprecated use SetMediaClockTimer instead.","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaTrack":{"name":"mediaTrack","abstract":"

    The text in the track field

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)graphic":{"name":"graphic","abstract":"

    An image to be shown on supported displays

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"

    An image to be shown on supported displays

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)softButtons":{"name":"softButtons","abstract":"

    The the Soft buttons defined by the App

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)customPresets":{"name":"customPresets","abstract":"

    The Custom Presets defined by the App

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)metadataTags":{"name":"metadataTags","abstract":"

    Text Field Metadata

    ","parent_name":"SDLShow"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"

    Create a media clock timer that counts up, e.g from 0:00 to 4:18.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:","abstract":"

    Create a media clock timer that counts up, e.g from 0:00 to 4:18.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"

    Create a media clock timer that counts down, e.g. from 4:18 to 0:00

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:","abstract":"

    Create a media clock timer that counts down, e.g. from 4:18 to 0:00

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)pauseWithPlayPauseIndicator:":{"name":"+pauseWithPlayPauseIndicator:","abstract":"

    Pause an existing (counting up / down) media clock timer

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:":{"name":"+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:","abstract":"

    Update a pause time (or pause and update the time) on a media clock timer

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTime:endTime:playPauseIndicator:":{"name":"+updatePauseWithNewStartTime:endTime:playPauseIndicator:","abstract":"

    Update a pause time (or pause and update the time) on a media clock timer

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:":{"name":"+resumeWithPlayPauseIndicator:","abstract":"

    Resume a paused media clock timer. It resumes at the same time at which it was paused.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)clearWithPlayPauseIndicator:":{"name":"+clearWithPlayPauseIndicator:","abstract":"

    Remove a media clock timer from the screen

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:hours:minutes:seconds:audioStreamingIndicator:":{"name":"-initWithUpdateMode:hours:minutes:seconds:audioStreamingIndicator:","abstract":"

    Undocumented

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:hours:minutes:seconds:":{"name":"-initWithUpdateMode:hours:minutes:seconds:","abstract":"

    Undocumented

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","abstract":"

    Undocumented

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:playPauseIndicator:":{"name":"-initWithUpdateMode:startTime:endTime:playPauseIndicator:","abstract":"

    Create a SetMediaClockTimer RPC with all available parameters. It’s recommended to use the specific initializers above.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)startTime":{"name":"startTime","abstract":"

    A Start Time with specifying hour, minute, second values

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)endTime":{"name":"endTime","abstract":"

    An END time of type SDLStartTime, specifying hour, minute, second values

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)updateMode":{"name":"updateMode","abstract":"

    The media clock/timer update mode (COUNTUP/COUNTDOWN/PAUSE/RESUME)

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)audioStreamingIndicator":{"name":"audioStreamingIndicator","abstract":"

    The audio streaming indicator used for a play/pause button.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetInteriorVehicleDataResponse.html#/c:objc(cs)SDLSetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"

    The new module data for the requested module

    ","parent_name":"SDLSetInteriorVehicleDataResponse"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(im)initWithModuleData:":{"name":"-initWithModuleData:","abstract":"

    Undocumented

    ","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"

    The module data to set for the requested RC module.

    ","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:":{"name":"-initWithHelpText:timeoutText:","abstract":"

    Initialize SetGlobalProperties with help text and timeout text

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:","abstract":"

    Initialize SetGlobalProperties with help text, timeout text, help title, and help items

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:","abstract":"

    Initialize SetGlobalProperties with all possible items

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)helpPrompt":{"name":"helpPrompt","abstract":"

    Help prompt for when the user asks for help with an interface prompt

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"

    Help prompt for when an interface prompt times out

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelpTitle":{"name":"vrHelpTitle","abstract":"

    Sets a voice recognition Help Title

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelp":{"name":"vrHelp","abstract":"

    Sets the items listed in the VR help screen used in an interaction started by Push to Talk

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuTitle":{"name":"menuTitle","abstract":"

    Text for the menu button label

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuIcon":{"name":"menuIcon","abstract":"

    Icon for the menu button

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)keyboardProperties":{"name":"keyboardProperties","abstract":"

    On-screen keyboard (perform interaction) configuration

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"

    The display capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"

    The button capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"

    The soft button capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"

    The preset bank capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"

    Undocumented

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:":{"name":"-initWithLayout:","abstract":"

    Undocumented

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithPredefinedLayout:dayColorScheme:nightColorScheme:","abstract":"

    Undocumented

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)displayLayout":{"name":"displayLayout","abstract":"

    A display layout. Predefined or dynamically created screen layout.","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)dayColorScheme":{"name":"dayColorScheme","abstract":"

    The color scheme to be used on a head unit using a light or day color scheme. The OEM may only support this theme if their head unit only has a light color scheme.

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)nightColorScheme":{"name":"nightColorScheme","abstract":"

    The color scheme to be used on a head unit using a dark or night color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"

    Convenience init.

    ","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(py)properties":{"name":"properties","abstract":"

    The new cloud application properties.

    ","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"

    Undocumented

    ","parent_name":"SDLSetAppIcon"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(py)syncFileName":{"name":"syncFileName","abstract":"

    A file reference name","parent_name":"SDLSetAppIcon"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:":{"name":"-initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:","abstract":"

    Create a SendLocation request with an address object, without Lat/Long coordinates.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","abstract":"

    Create a SendLocation request with Lat/Long coordinate, not an address object

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:","abstract":"

    Create a SendLocation request with Lat/Long coordinate and an address object and let the nav system decide how to parse it

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"

    The longitudinal coordinate of the location. Either the latitude / longitude OR the address must be provided.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"

    The latitudinal coordinate of the location. Either the latitude / longitude OR the address must be provided.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationName":{"name":"locationName","abstract":"

    Name / title of intended location

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationDescription":{"name":"locationDescription","abstract":"

    Description of the intended location / establishment

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)addressLines":{"name":"addressLines","abstract":"

    Location address for display purposes only.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)phoneNumber":{"name":"phoneNumber","abstract":"

    Phone number of intended location / establishment

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationImage":{"name":"locationImage","abstract":"

    Image / icon of intended location

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)deliveryMode":{"name":"deliveryMode","abstract":"

    Mode in which the sendLocation request is sent

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)timeStamp":{"name":"timeStamp","abstract":"

    Arrival time of Location. If multiple SendLocations are sent, this will be used for sorting as well.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address":{"name":"address","abstract":"

    Address to be used for setting destination. Either the latitude / longitude OR the address must be provided.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(im)initWithHapticRectData:":{"name":"-initWithHapticRectData:","abstract":"

    Constructs a new SDLSendHapticData object indicated by the hapticSpatialData parameter

    ","parent_name":"SDLSendHapticData"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(py)hapticRectData":{"name":"hapticRectData","abstract":"

    Array of spatial data structures that represent the locations of all user controls present on the HMI. This data should be updated if/when the application presents a new screen. When a request is sent, if successful, it will replace all spatial data previously sent through RPC. If an empty array is sent, the existing spatial data will be cleared

    ","parent_name":"SDLSendHapticData"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:action:":{"name":"-initWithId:action:","abstract":"

    @abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:label:action:":{"name":"-initWithId:label:action:","abstract":"

    @abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)id":{"name":"id","abstract":"

    @abstract id of the action to be performed.

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)label":{"name":"label","abstract":"

    @abstract label of the action to be performed.

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)action":{"name":"action","abstract":"

    @abstract type of action to be performed

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:":{"name":"-initWithId:","abstract":"

    Constructs a newly allocated SDLSeatControlData object with cushion and firmness

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:":{"name":"-initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:","abstract":"

    Constructs a newly allocated SDLSeatControlData object with cushion and firmness

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)id":{"name":"id","abstract":"

    @abstract id of seat that is a remote controllable seat.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingEnabled":{"name":"heatingEnabled","abstract":"

    @abstract Whether or not heating is enabled.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingEnabled":{"name":"coolingEnabled","abstract":"

    @abstract Whether or not cooling is enabled.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingLevel":{"name":"heatingLevel","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingLevel":{"name":"coolingLevel","abstract":"

    @abstract cooling level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)horizontalPosition":{"name":"horizontalPosition","abstract":"

    @abstract horizontal Position in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)verticalPosition":{"name":"verticalPosition","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)frontVerticalPosition":{"name":"frontVerticalPosition","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backVerticalPosition":{"name":"backVerticalPosition","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backTiltAngle":{"name":"backTiltAngle","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportHorizontalPosition":{"name":"headSupportHorizontalPosition","abstract":"

    @abstract head Support Horizontal Position in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportVerticalPosition":{"name":"headSupportVerticalPosition","abstract":"

    @abstract head Support Vertical Position in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageEnabled":{"name":"massageEnabled","abstract":"

    @abstract Whether or not massage is enabled.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageMode":{"name":"massageMode","abstract":"

    @abstract Array of massage mode data.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageCushionFirmness":{"name":"massageCushionFirmness","abstract":"

    @abstract Array of firmness of a cushion.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)memory":{"name":"memory","abstract":"

    @abstract type of action to be performed

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"

    Undocumented

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"

    Undocumented

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the light control module.","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingEnabledAvailable":{"name":"heatingEnabledAvailable","abstract":"

    @abstract Whether or not heating is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingEnabledAvailable":{"name":"coolingEnabledAvailable","abstract":"

    @abstract Whether or not cooling is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingLevelAvailable":{"name":"heatingLevelAvailable","abstract":"

    @abstract Whether or not heating level is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingLevelAvailable":{"name":"coolingLevelAvailable","abstract":"

    @abstract Whether or not cooling level is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)horizontalPositionAvailable":{"name":"horizontalPositionAvailable","abstract":"

    @abstract Whether or not horizontal Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)verticalPositionAvailable":{"name":"verticalPositionAvailable","abstract":"

    @abstract Whether or not vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)frontVerticalPositionAvailable":{"name":"frontVerticalPositionAvailable","abstract":"

    @abstract Whether or not front Vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backVerticalPositionAvailable":{"name":"backVerticalPositionAvailable","abstract":"

    @abstract Whether or not back Vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backTiltAngleAvailable":{"name":"backTiltAngleAvailable","abstract":"

    @abstract Whether or not backTilt Angle Available is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportHorizontalPositionAvailable":{"name":"headSupportHorizontalPositionAvailable","abstract":"

    @abstract Whether or not head Supports for Horizontal Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportVerticalPositionAvailable":{"name":"headSupportVerticalPositionAvailable","abstract":"

    @abstract Whether or not head Supports for Vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageEnabledAvailable":{"name":"massageEnabledAvailable","abstract":"

    @abstract Whether or not massage Enabled is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageModeAvailable":{"name":"massageModeAvailable","abstract":"

    @abstract Whether or not massage Mode is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageCushionFirmnessAvailable":{"name":"massageCushionFirmnessAvailable","abstract":"

    @abstract Whether or not massage Cushion Firmness is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)memoryAvailable":{"name":"memoryAvailable","abstract":"

    @abstract Whether or not memory is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:":{"name":"-initWithMessage:","abstract":"

    Undocumented

    ","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:timeout:softButtons:":{"name":"-initWithMessage:timeout:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)scrollableMessageBody":{"name":"scrollableMessageBody","abstract":"

    A Body of text that can include newlines and tabs","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)timeout":{"name":"timeout","abstract":"

    Gets/Sets an App defined timeout. Indicates how long of a timeout in milliseconds from the","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)softButtons":{"name":"softButtons","abstract":"

    Gets/Sets App defined SoftButtons.If omitted on supported displays, only the","parent_name":"SDLScrollableMessage"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)resolution":{"name":"resolution","abstract":"

    The resolution of the prescribed screen area

    ","parent_name":"SDLScreenParams"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)touchEventAvailable":{"name":"touchEventAvailable","abstract":"

    Types of screen touch events available in screen area

    ","parent_name":"SDLScreenParams"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1":{"name":"textField1","abstract":"

    The top text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2":{"name":"textField2","abstract":"

    The second text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3":{"name":"textField3","abstract":"

    The third text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4":{"name":"textField4","abstract":"

    The fourth text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)mediaTrackTextField":{"name":"mediaTrackTextField","abstract":"

    The media text field available within the media layout. Often less emphasized than textField(1-4)

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)primaryGraphic":{"name":"primaryGraphic","abstract":"

    The primary graphic within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"

    A secondary graphic used in some template layouts

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textAlignment":{"name":"textAlignment","abstract":"

    What alignment textField(1-4) should use

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1Type":{"name":"textField1Type","abstract":"

    The type of data textField1 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2Type":{"name":"textField2Type","abstract":"

    The type of data textField2 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3Type":{"name":"textField3Type","abstract":"

    The type of data textField3 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4Type":{"name":"textField4Type","abstract":"

    The type of data textField4 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)softButtonObjects":{"name":"softButtonObjects","abstract":"

    The current list of soft buttons within a template layout. Set this array to change the displayed soft buttons.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menu":{"name":"menu","abstract":"

    The current list of menu cells displayed in the app’s menu.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands":{"name":"voiceCommands","abstract":"

    The current list of voice commands available for the user to speak and be recognized by the IVI’s voice recognition engine.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)keyboardConfiguration":{"name":"keyboardConfiguration","abstract":"

    The default keyboard configuration, this can be additionally customized by each SDLKeyboardDelegate.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)preloadedChoices":{"name":"preloadedChoices","abstract":"

    Cells will be hashed by their text, image names, and VR command text. When assembling an SDLChoiceSet, you can pull objects from here, or recreate them. The preloaded versions will be used so long as their text, image names, and VR commands are the same.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:":{"name":"-initWithConnectionManager:fileManager:","abstract":"

    Initialize a screen manager

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"

    Starts the manager and all sub-managers

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)stop":{"name":"-stop","abstract":"

    Stops the manager.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)beginUpdates":{"name":"-beginUpdates","abstract":"

    Delays all screen updates until endUpdatesWithCompletionHandler: is called.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdates":{"name":"-endUpdates","abstract":"

    Update text fields with new text set into the text field properties. Pass an empty string \\@"" to clear the text field.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"

    Update text fields with new text set into the text field properties. Pass an empty string \\@"" to clear the text field.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)softButtonObjectNamed:":{"name":"-softButtonObjectNamed:","abstract":"

    Undocumented

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)preloadChoices:withCompletionHandler:":{"name":"-preloadChoices:withCompletionHandler:","abstract":"

    Preload cells to the head unit. This will greatly reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You do not need to wait until the completion handler is called to present a choice set containing choices being loaded. The choice set will wait until the preload completes and then immediately present.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)deleteChoices:":{"name":"-deleteChoices:","abstract":"

    Delete loaded cells from the head unit. If the cells don’t exist on the head unit they will be ignored.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentChoiceSet:mode:":{"name":"-presentChoiceSet:mode:","abstract":"

    Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you’re lazy…for real though, it’s kind of confusing to the user and isn’t recommended.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentSearchableChoiceSet:mode:withKeyboardDelegate:":{"name":"-presentSearchableChoiceSet:mode:withKeyboardDelegate:","abstract":"

    Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you’re lazy…for real though, it’s kind of confusing to the user and isn’t recommended.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentKeyboardWithInitialText:delegate:":{"name":"-presentKeyboardWithInitialText:delegate:","abstract":"

    Present a keyboard-only interface to the user and receive input. The user will be able to input text in the keyboard when in a non-driver distraction situation.

    ","parent_name":"SDLScreenManager"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(im)initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:":{"name":"-initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:","abstract":"

    Undocumented

    ","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationShortName":{"name":"stationShortName","abstract":"

    @abstract Identifies the 4-alpha-character station call sign","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationIDNumber":{"name":"stationIDNumber","abstract":"

    @abstract Used for network Application.","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLongName":{"name":"stationLongName","abstract":"

    @abstract Identifies the station call sign or other identifying","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLocation":{"name":"stationLocation","abstract":"

    @abstract Provides the 3-dimensional geographic station location

    ","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationMessage":{"name":"stationMessage","abstract":"

    @abstract May be used to convey textual information of general interest","parent_name":"SDLSISData"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"

    Undocumented

    ","parent_name":"SDLResetGlobalProperties"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(py)properties":{"name":"properties","abstract":"

    An array of one or more GlobalProperty enumeration elements","parent_name":"SDLResetGlobalProperties"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:","abstract":"

    Undocumented

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:","abstract":"

    Constructs a newly allocated SDLRemoteControlCapabilities object with given parameters

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)climateControlCapabilities":{"name":"climateControlCapabilities","abstract":"

    If included, the platform supports RC climate controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)radioControlCapabilities":{"name":"radioControlCapabilities","abstract":"

    If included, the platform supports RC radio controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"

    If included, the platform supports RC button controls with the included button names.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)seatControlCapabilities":{"name":"seatControlCapabilities","abstract":"

    If included, the platform supports seat controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)audioControlCapabilities":{"name":"audioControlCapabilities","abstract":"

    If included, the platform supports audio controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)hmiSettingsControlCapabilities":{"name":"hmiSettingsControlCapabilities","abstract":"

    If included, the platform supports hmi setting controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)lightControlCapabilities":{"name":"lightControlCapabilities","abstract":"

    If included, the platform supports light controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)syncMsgVersion":{"name":"syncMsgVersion","abstract":"

    The RPC spec version supported by the connected IVI system.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)language":{"name":"language","abstract":"

    The currently active VR+TTS language on the module. See Language for options.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"

    The currently active display language on the module. See Language for options.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"

    Contains information about the display for the SDL system to which the application is currently connected.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"

    Provides information about the capabilities of a SDL HMI button.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"

    Contains information about a SoftButton’s capabilities.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"

    If returned, the platform supports custom on-screen Presets

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"

    Specifies HMI Zones in the vehicle.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)speechCapabilities":{"name":"speechCapabilities","abstract":"

    Contains information about TTS capabilities on the SDL platform.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)prerecordedSpeech":{"name":"prerecordedSpeech","abstract":"

    Contains information about the speech capabilities on the SDL platform","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vrCapabilities":{"name":"vrCapabilities","abstract":"

    The VR capabilities of the connected SDL platform.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"

    Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)pcmStreamCapabilities":{"name":"pcmStreamCapabilities","abstract":"

    Describes different audio type configurations for the audio PCM stream service, e.g. {8kHz,8-bit,PCM}

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vehicleType":{"name":"vehicleType","abstract":"

    Specifies the connected vehicle’s type

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)supportedDiagModes":{"name":"supportedDiagModes","abstract":"

    Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"

    Specifies the availability of various SDL features.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlVersion":{"name":"sdlVersion","abstract":"

    The SmartDeviceLink Core version

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"

    The software version of the system that implements SmartDeviceLink Core

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)iconResumed":{"name":"iconResumed","abstract":"

    Whether or not the app’s icon already existed on the system and was resumed. That means that the icon does not need to be sent by the app.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithLifecycleConfiguration:":{"name":"-initWithLifecycleConfiguration:","abstract":"

    Convenience init for registering the application with a lifecycle configuration.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:":{"name":"-initWithAppName:appId:languageDesired:","abstract":"

    Convenience init for registering the application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:","abstract":"

    Convenience init for registering the application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:","abstract":"

    Convenience init for registering the application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:":{"name":"-initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:","abstract":"

    Convenience init for registering the application with all possible options.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)syncMsgVersion":{"name":"syncMsgVersion","abstract":"

    The version of the SDL interface

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appName":{"name":"appName","abstract":"

    The mobile application’s name. This name is displayed in the SDL Mobile Applications menu. It also serves as the unique identifier of the application for SmartDeviceLink.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ttsName":{"name":"ttsName","abstract":"

    TTS string for VR recognition of the mobile application name.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"

    A String representing an abbreviated version of the mobile application’s name (if necessary) that will be displayed on the media screen.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)vrSynonyms":{"name":"vrSynonyms","abstract":"

    Defines additional voice recognition commands

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)isMediaApplication":{"name":"isMediaApplication","abstract":"

    Indicates if the application is a media or a non-media application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)languageDesired":{"name":"languageDesired","abstract":"

    A Language enumeration indicating what language the application intends to use for user interaction (TTS and VR).

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hmiDisplayLanguageDesired":{"name":"hmiDisplayLanguageDesired","abstract":"

    An enumeration indicating what language the application intends to use for user interaction (Display).

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appHMIType":{"name":"appHMIType","abstract":"

    A list of all applicable app types stating which classifications to be given to the app.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hashID":{"name":"hashID","abstract":"

    ID used to uniquely identify current state of all app data that can persist through connection cycles (e.g. ignition cycles).

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)deviceInfo":{"name":"deviceInfo","abstract":"

    Information about the connecting device

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appID":{"name":"appID","abstract":"

    ID used to validate app with policy table entries

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)fullAppID":{"name":"fullAppID","abstract":"

    A full UUID appID used to validate app with policy table entries.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appInfo":{"name":"appInfo","abstract":"

    Information about the application running

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)dayColorScheme":{"name":"dayColorScheme","abstract":"

    The color scheme to be used on a head unit using a light or day color scheme. The OEM may only support this theme if their head unit only has a light color scheme.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)nightColorScheme":{"name":"nightColorScheme","abstract":"

    The color scheme to be used on a head unit using a dark or night color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithX:y:width:height:":{"name":"-initWithX:y:width:height:","abstract":"

    Create a Rectangle

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithCGRect:":{"name":"-initWithCGRect:","abstract":"

    Create a Rectangle from a CGRect

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)x":{"name":"x","abstract":"

    The X-coordinate of the user control

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)y":{"name":"y","abstract":"

    The Y-coordinate of the user control

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)width":{"name":"width","abstract":"

    The width of the user control’s bounding rectangle

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)height":{"name":"height","abstract":"

    The height of the user control’s bounding rectangle

    ","parent_name":"SDLRectangle"},"Classes/SDLReadDIDResponse.html#/c:objc(cs)SDLReadDIDResponse(py)didResult":{"name":"didResult","abstract":"

    Array of requested DID results (with data if available).

    ","parent_name":"SDLReadDIDResponse"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(im)initWithECUName:didLocation:":{"name":"-initWithECUName:didLocation:","abstract":"

    Undocumented

    ","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)ecuName":{"name":"ecuName","abstract":"

    An ID of the vehicle module","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)didLocation":{"name":"didLocation","abstract":"

    Raw data from vehicle data DID location(s)","parent_name":"SDLReadDID"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyInteger":{"name":"frequencyInteger","abstract":"

    The integer part of the frequency ie for 101.7 this value should be 101

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyFraction":{"name":"frequencyFraction","abstract":"

    The fractional part of the frequency for 101.7 is 7

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)band":{"name":"band","abstract":"

    Radio band value

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)rdsData":{"name":"rdsData","abstract":"

    Read only parameter. See RDSData data type for details.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDs":{"name":"availableHDs","abstract":"

    number of HD sub-channels if available

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdChannel":{"name":"hdChannel","abstract":"

    Current HD sub-channel if available

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalStrength":{"name":"signalStrength","abstract":"

    Signal Strength Value

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalChangeThreshold":{"name":"signalChangeThreshold","abstract":"

    If the signal strength falls below the set value for this parameter, the radio will tune to an alternative frequency

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)radioEnable":{"name":"radioEnable","abstract":"

    True if the radio is on, false is the radio is off. When the radio is disabled, no data other than radioEnable is included in a GetInteriorVehicleData response

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)state":{"name":"state","abstract":"

    Read only parameter. See RadioState data type for details.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdRadioEnable":{"name":"hdRadioEnable","abstract":"

    True if the hd radio is on, false is the radio is off

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)sisData":{"name":"sisData","abstract":"

    Read Read-only Station Information Service (SIS) data provides basic information","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    The short friendly name of the radio control module.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioEnableAvailable":{"name":"radioEnableAvailable","abstract":"

    Availability of the control of enable/disable radio.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioBandAvailable":{"name":"radioBandAvailable","abstract":"

    Availability of the control of radio band.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioFrequencyAvailable":{"name":"radioFrequencyAvailable","abstract":"

    Availability of the control of radio frequency.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdChannelAvailable":{"name":"hdChannelAvailable","abstract":"

    Availability of the control of HD radio channel.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)rdsDataAvailable":{"name":"rdsDataAvailable","abstract":"

    Availability of the getting Radio Data System (RDS) data.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDsAvailable":{"name":"availableHDsAvailable","abstract":"

    Availability of the getting the number of available HD channels.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)stateAvailable":{"name":"stateAvailable","abstract":"

    Availability of the getting the Radio state.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalStrengthAvailable":{"name":"signalStrengthAvailable","abstract":"

    Availability of the getting the signal strength.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalChangeThresholdAvailable":{"name":"signalChangeThresholdAvailable","abstract":"

    Availability of the getting the signal Change Threshold

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdRadioEnableAvailable":{"name":"hdRadioEnableAvailable","abstract":"

    Availability of the control of enable/disable HD radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)siriusXMRadioAvailable":{"name":"siriusXMRadioAvailable","abstract":"

    Availability of sirius XM radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)sisDataAvailable":{"name":"sisDataAvailable","abstract":"

    Availability of the getting HD radio Station Information Service (SIS) data.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct@store":{"name":"store","abstract":"

    Undocumented

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"

    Convenience init

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)init":{"name":"-init","abstract":"

    Init

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)serializeAsDictionary:":{"name":"-serializeAsDictionary:","abstract":"

    Converts struct to JSON formatted data

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(py)response":{"name":"response","abstract":"

    The response to be included within the userinfo dictionary

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)initWithName:object:rpcResponse:":{"name":"-initWithName:object:rpcResponse:","abstract":"

    Create an NSNotification object containing an SDLRPCResponse

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseMemberOfClass:":{"name":"-isResponseMemberOfClass:","abstract":"

    Returns whether or not the containing response is equal to a class, not including subclasses.

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseKindOfClass:":{"name":"-isResponseKindOfClass:","abstract":"

    Returns whether or not the containing response is a kind of class, including subclasses.

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)correlationID":{"name":"correlationID","abstract":"

    The correlation id of the corresponding SDLRPCRequest.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)success":{"name":"success","abstract":"

    Whether or not the SDLRPCRequest was successful.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)resultCode":{"name":"resultCode","abstract":"

    The result of the SDLRPCRequest. If the request failed, the result code contains the failure reason.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)info":{"name":"info","abstract":"

    More detailed success or error message.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(py)request":{"name":"request","abstract":"

    The request to be included in the userinfo dictionary

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)initWithName:object:rpcRequest:":{"name":"-initWithName:object:rpcRequest:","abstract":"

    Create an NSNotification object containing an SDLRPCRequest

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestMemberOfClass:":{"name":"-isRequestMemberOfClass:","abstract":"

    Returns whether or not the containing request is equal to a class, not including subclasses.

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestKindOfClass:":{"name":"-isRequestKindOfClass:","abstract":"

    Returns whether or not the containing request is a kind of class, including subclasses.

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequest.html#/c:objc(cs)SDLRPCRequest(py)correlationID":{"name":"correlationID","abstract":"

    A unique id assigned to message sent to Core. The Correlation ID is used to map a request to its response.

    ","parent_name":"SDLRPCRequest"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(py)notification":{"name":"notification","abstract":"

    The notification within the userinfo dictionary

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)initWithName:object:rpcNotification:":{"name":"-initWithName:object:rpcNotification:","abstract":"

    Create an NSNotification object caontaining an SDLRPCNotification

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationMemberOfClass:":{"name":"-isNotificationMemberOfClass:","abstract":"

    Returns whether or not the containing notification is equal to a class, not including subclasses.

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationKindOfClass:":{"name":"-isNotificationKindOfClass:","abstract":"

    Returns whether or not the containing notification is a kind of class, including subclasses.

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage@function":{"name":"function","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage@parameters":{"name":"parameters","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage@messageType":{"name":"messageType","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithName:":{"name":"-initWithName:","abstract":"

    Convenience init

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"

    Convenience init

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)getFunctionName":{"name":"-getFunctionName","abstract":"

    Returns the function name.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setFunctionName:":{"name":"-setFunctionName:","abstract":"

    Sets the function name.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)getParameters:":{"name":"-getParameters:","abstract":"

    Returns the value associated with the provided key. If the key does not exist, null is returned.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setParameters:value:":{"name":"-setParameters:value:","abstract":"

    Sets a key-value pair using the function name as the key.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)bulkData":{"name":"bulkData","abstract":"

    The data in the message

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)name":{"name":"name","abstract":"

    The name of the message

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)messageType":{"name":"messageType","abstract":"

    The type of data in the message

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithRed:green:blue:":{"name":"-initWithRed:green:blue:","abstract":"

    Create an SDL color object with red / green / blue values between 0-255

    ","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithColor:":{"name":"-initWithColor:","abstract":"

    Create an SDL color object with a UIColor object.

    ","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)red":{"name":"red","abstract":"

    The red value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)green":{"name":"green","abstract":"

    The green value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)blue":{"name":"blue","abstract":"

    The blue value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(im)initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:":{"name":"-initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:","abstract":"

    Undocumented

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programService":{"name":"programService","abstract":"

    Program Service Name

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)radioText":{"name":"radioText","abstract":"

    Radio Text

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)clockText":{"name":"clockText","abstract":"

    The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programIdentification":{"name":"programIdentification","abstract":"

    Program Identification - the call sign for the radio station

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programType":{"name":"programType","abstract":"

    The program type - The region should be used to differentiate between EU","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficProgramIdentification":{"name":"trafficProgramIdentification","abstract":"

    Traffic Program Identification - Identifies a station that offers traffic

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficAnnouncementIdentification":{"name":"trafficAnnouncementIdentification","abstract":"

    Traffic Announcement Identification - Indicates an ongoing traffic announcement

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)region":{"name":"region","abstract":"

    Region

    ","parent_name":"SDLRDSData"},"Classes/SDLPutFileResponse.html#/c:objc(cs)SDLPutFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"

    Provides the total local space available in SDL Core for the registered app. If the transfer has systemFile enabled, then the value will be set to 0 automatically.

    ","parent_name":"SDLPutFileResponse"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)init":{"name":"-init","abstract":"

    Init

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:":{"name":"-initWithFileName:fileType:","abstract":"

    Convenience init for creating a putfile with a name and file format.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:":{"name":"-initWithFileName:fileType:persistentFile:","abstract":"

    Convenience init for creating a putfile with a name, file format, and persistance.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:","abstract":"

    Convenience init for creating a putfile that is part of a multiple frame payload.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:","abstract":"

    Convenience init for creating a putfile that is part of a multiple frame payload.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:","abstract":"

    Convenience init for creating a putfile that is part of a multiple frame payload. A CRC checksum is calculated for the bulk data.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)syncFileName":{"name":"syncFileName","abstract":"

    File reference name

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)fileType":{"name":"fileType","abstract":"

    A FileType value representing a selected file type

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)persistentFile":{"name":"persistentFile","abstract":"

    A value to indicates if the file is meant to persist between sessions / ignition cycles. If set to TRUE, then the system will aim to persist this file through session / cycles. While files with this designation will have priority over others, they are subject to deletion by the system at any time. In the event of automatic deletion by the system, the app will receive a rejection and have to resend the file. If omitted, the value will be set to false.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)systemFile":{"name":"systemFile","abstract":"

    Indicates if the file is meant to be passed through core to elsewhere on the system. If set to TRUE, then the system will instead pass the data thru as it arrives to a predetermined area outside of core.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)offset":{"name":"offset","abstract":"

    Offset in bytes for resuming partial data chunks.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)length":{"name":"length","abstract":"

    Length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)crc":{"name":"crc","abstract":"

    Additional CRC32 checksum to protect data integrity up to 512 Mbits.

    ","parent_name":"SDLPutFile"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(im)initWithAppServiceRecord:":{"name":"-initWithAppServiceRecord:","abstract":"

    Convenience init.

    ","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(py)appServiceRecord":{"name":"appServiceRecord","abstract":"

    If the request was successful, this object will be the current status of the service record for the published service. This will include the Core supplied service ID.

    ","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(im)initWithAppServiceManifest:":{"name":"-initWithAppServiceManifest:","abstract":"

    Convenience init.

    ","parent_name":"SDLPublishAppService"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(py)appServiceManifest":{"name":"appServiceManifest","abstract":"

    The manifest of the service that wishes to be published.

    ","parent_name":"SDLPublishAppService"},"Classes/SDLPresetBankCapabilities.html#/c:objc(cs)SDLPresetBankCapabilities(py)onScreenPresetsAvailable":{"name":"onScreenPresetsAvailable","abstract":"

    If Onscreen custom presets are available.

    ","parent_name":"SDLPresetBankCapabilities"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(im)initWithFirstTouch:secondTouch:":{"name":"-initWithFirstTouch:secondTouch:","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)firstTouch":{"name":"firstTouch","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)secondTouch":{"name":"secondTouch","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)distance":{"name":"distance","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)center":{"name":"center","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)isValid":{"name":"isValid","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(im)initWithDialNumber:":{"name":"-initWithDialNumber:","abstract":"

    Undocumented

    ","parent_name":"SDLPhoneCapability"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(py)dialNumberEnabled":{"name":"dialNumberEnabled","abstract":"

    Whether or not the DialNumber RPC is enabled.

    ","parent_name":"SDLPhoneCapability"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"

    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.

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)stop":{"name":"-stop","abstract":"

    Stop the manager. This method is used internally.

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isRPCAllowed:":{"name":"-isRPCAllowed:","abstract":"

    Determine if an individual RPC is allowed for the current HMI level

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)groupStatusOfRPCs:":{"name":"-groupStatusOfRPCs:","abstract":"

    Determine if all RPCs are allowed for the current HMI level

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)statusOfRPCs:":{"name":"-statusOfRPCs:","abstract":"

    Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber specifying if that RPC is currently allowed

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)addObserverForRPCs:groupType:withHandler:":{"name":"-addObserverForRPCs:groupType:withHandler:","abstract":"

    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.

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeAllObservers":{"name":"-removeAllObservers","abstract":"

    Remove every current observer

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeObserverForIdentifier:":{"name":"-removeObserverForIdentifier:","abstract":"

    Remove block observers for the specified RPC

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)rpcName":{"name":"rpcName","abstract":"

    Name of the individual RPC in the policy table.

    ","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)hmiPermissions":{"name":"hmiPermissions","abstract":"

    HMI Permissions for the individual RPC; i.e. which HMI levels may it be used in

    ","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)parameterPermissions":{"name":"parameterPermissions","abstract":"

    RPC parameters for the individual RPC

    ","parent_name":"SDLPermissionItem"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)choiceID":{"name":"choiceID","abstract":"

    ID of the choice that was selected in response to PerformInteraction. Only is valid if general result is success:true.

    ","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)manualTextEntry":{"name":"manualTextEntry","abstract":"

    Manually entered text selection, e.g. through keyboard. Can be returned in lieu of choiceID, depending on the trigger source.

    ","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)triggerSource":{"name":"triggerSource","abstract":"

    A SDLTriggerSource object which will be shown in the HMI. Only is valid if resultCode is SUCCESS.

    ","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInteractionChoiceSetId:":{"name":"-initWithInteractionChoiceSetId:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInteractionChoiceSetIdList:":{"name":"-initWithInteractionChoiceSetIdList:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialText":{"name":"initialText","abstract":"

    The Text that Displayed when the interaction begins. This text may","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialPrompt":{"name":"initialPrompt","abstract":"

    An array of one or more TTSChunks that, taken together, specify","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionMode":{"name":"interactionMode","abstract":"

    The Indicates mode that indicate how user selects interaction","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionChoiceSetIDList":{"name":"interactionChoiceSetIDList","abstract":"

    A Vector value representing an Array of one or more Choice","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)helpPrompt":{"name":"helpPrompt","abstract":"

    A Vector which taken together, specify the help phrase to","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"

    An array of TTSChunks which, taken together, specify the phrase to","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeout":{"name":"timeout","abstract":"

    An Integer value representing the amount of time, in milliseconds,","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)vrHelp":{"name":"vrHelp","abstract":"

    A Voice recognition Help, which is a suggested VR Help Items to","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionLayout":{"name":"interactionLayout","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)initialPrompt":{"name":"initialPrompt","abstract":"

    initial prompt which will be spoken before opening the audio pass","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText1":{"name":"audioPassThruDisplayText1","abstract":"

    a line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText2":{"name":"audioPassThruDisplayText2","abstract":"

    A line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)samplingRate":{"name":"samplingRate","abstract":"

    A samplingRate

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)maxDuration":{"name":"maxDuration","abstract":"

    the maximum duration of audio recording in milliseconds

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)bitsPerSample":{"name":"bitsPerSample","abstract":"

    the quality the audio is recorded - 8 bit or 16 bit

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioType":{"name":"audioType","abstract":"

    an audioType

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)muteAudio":{"name":"muteAudio","abstract":"

    a Boolean value representing if the current audio source should be","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioDataHandler":{"name":"audioDataHandler","abstract":"

    A handler that will be called whenever an onAudioPassThru notification is received.

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(im)initWithServiceSpecificResult:":{"name":"-initWithServiceSpecificResult:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(py)serviceSpecificResult":{"name":"serviceSpecificResult","abstract":"

    The service can provide specific result strings to the consumer through this param.

    ","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:":{"name":"-initWithServiceUri:serviceID:originApp:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:requestServiceActive:":{"name":"-initWithServiceUri:serviceID:originApp:requestServiceActive:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceUri":{"name":"serviceUri","abstract":"

    Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes no guarantee that this URI is correct.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceID":{"name":"serviceID","abstract":"

    The service ID that the app consumer wishes to send this URI.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)originApp":{"name":"originApp","abstract":"

    This string is the appID of the app requesting the app service provider take the specific action.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)requestServiceActive":{"name":"requestServiceActive","abstract":"

    This flag signals the requesting consumer would like this service to become the active primary service of the destination’s type.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)allowed":{"name":"allowed","abstract":"

    A set of all parameters that are permitted for this given RPC.

    ","parent_name":"SDLParameterPermissions"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"

    A set of all parameters that are prohibited for this given RPC.

    ","parent_name":"SDLParameterPermissions"},"Classes/SDLOnWayPointChange.html#/c:objc(cs)SDLOnWayPointChange(py)waypoints":{"name":"waypoints","abstract":"

    Location address for display purposes only

    ","parent_name":"SDLOnWayPointChange"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gps":{"name":"gps","abstract":"

    The car current GPS coordinates

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)speed":{"name":"speed","abstract":"

    The vehicle speed in kilometers per hour

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)rpm":{"name":"rpm","abstract":"

    The number of revolutions per minute of the engine.

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The fuel level in the tank (percentage)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The fuel level state

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    The estimate range in KM the vehicle can travel based on fuel level and consumption

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The instantaneous fuel consumption in microlitres

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The external temperature in degrees celsius.

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)vin":{"name":"vin","abstract":"

    The Vehicle Identification Number

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)prndl":{"name":"prndl","abstract":"

    The current gear shift state of the user’s vehicle

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    The current pressure warnings for the user’s vehicle

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)odometer":{"name":"odometer","abstract":"

    Odometer reading in km

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    The status of the seat belts

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The body information including power modes

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The IVI system status including signal and battery strength

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    The status of the brake pedal

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The status of the wipers

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    Status of the head lamps

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The estimated percentage (0% - 100%) of remaining oil life of the engine

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    Torque value for engine (in Nm) on non-diesel variants

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    Accelerator pedal position (percentage depressed)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    Current angle of the steering wheel (in deg)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    Emergency Call notification and confirmation data

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The status of the air bags

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    Information related to an emergency event (and if it occurred)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    The status modes of the cluster

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)myKey":{"name":"myKey","abstract":"

    Information related to the MyKey feature

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The status of the electronic parking brake

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    The status of the turn signal

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The cloud app vehicle ID

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)type":{"name":"type","abstract":"

    The type of touch event.

    ","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)event":{"name":"event","abstract":"

    List of all individual touches involved in this event.

    ","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTBTClientState.html#/c:objc(cs)SDLOnTBTClientState(py)state":{"name":"state","abstract":"

    Current State of TBT client

    ","parent_name":"SDLOnTBTClientState"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType":{"name":"requestType","abstract":"

    The type of system request.

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"

    A request subType used when the requestType is OEM_SPECIFIC.

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)url":{"name":"url","abstract":"

    Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If not blank, the binary data shall be forwarded to the url with a provided timeout in seconds.

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)timeout":{"name":"timeout","abstract":"

    Optional timeout for HTTP requests Required if a URL is provided

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)fileType":{"name":"fileType","abstract":"

    Optional file type (meant for HTTP file requests).

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)offset":{"name":"offset","abstract":"

    Optional offset in bytes for resuming partial data chunks

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)length":{"name":"length","abstract":"

    Optional length in bytes for resuming partial data chunks

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(im)initWithSystemCapability:":{"name":"-initWithSystemCapability:","abstract":"

    Convenience init for required parameters

    ","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(py)systemCapability":{"name":"systemCapability","abstract":"

    The system capability that has been updated.

    ","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)URL":{"name":"URL","abstract":"

    Undocumented

    ","parent_name":"SDLOnSyncPData"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)Timeout":{"name":"Timeout","abstract":"

    Undocumented

    ","parent_name":"SDLOnSyncPData"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allocatedModules":{"name":"allocatedModules","abstract":"

    @abstract Contains a list (zero or more) of module types that","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)freeModules":{"name":"freeModules","abstract":"

    @abstract Contains a list (zero or more) of module types that are free to access for the application.

    ","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allowed":{"name":"allowed","abstract":"

    Issued by SDL to notify the application about remote control status change on SDL","parent_name":"SDLOnRCStatus"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)permissionItem":{"name":"permissionItem","abstract":"

    Describes change in permissions for a given set of RPCs

    ","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)driverDistractionStatus":{"name":"driverDistractionStatus","abstract":"

    Get the current driver distraction status(i.e. whether driver distraction rules are in effect, or not)

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)userSelected":{"name":"userSelected","abstract":"

    Get user selection status for the application (has the app been selected via hmi or voice command)

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)lockScreenStatus":{"name":"lockScreenStatus","abstract":"

    Indicates if the lockscreen should be required, optional or off

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"

    Get HMILevel in effect for the application

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)language":{"name":"language","abstract":"

    Current SDL voice engine (VR+TTS) language

    ","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"

    Current display language

    ","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)event":{"name":"event","abstract":"

    The type of keyboard input

    ","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)data":{"name":"data","abstract":"

    The current keyboard string input from the user

    ","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnInteriorVehicleData.html#/c:objc(cs)SDLOnInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"

    The subscribed module data that changed

    ","parent_name":"SDLOnInteriorVehicleData"},"Classes/SDLOnHashChange.html#/c:objc(cs)SDLOnHashChange(py)hashID":{"name":"hashID","abstract":"

    Calculated hash ID to be referenced during RegisterAppInterface request.

    ","parent_name":"SDLOnHashChange"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"

    SDLHMILevel in effect for the application

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)audioStreamingState":{"name":"audioStreamingState","abstract":"

    Current state of audio streaming for the application. When this parameter has a value of NOT_AUDIBLE, the application must stop streaming audio to SDL.

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)videoStreamingState":{"name":"videoStreamingState","abstract":"

    Current availablility of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)systemContext":{"name":"systemContext","abstract":"

    Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)data":{"name":"data","abstract":"

    Contains base64 encoded string of SyncP packets.

    ","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)URL":{"name":"URL","abstract":"

    If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded to the provided URL.

    ","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)Timeout":{"name":"Timeout","abstract":"

    If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded with the provided timeout in seconds.

    ","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)state":{"name":"state","abstract":"

    The driver distraction state (i.e. whether driver distraction rules are in effect, or not)

    ","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)cmdID":{"name":"cmdID","abstract":"

    The command ID of the command the user selected. This is the command ID value provided by the application in the SDLAddCommand operation that created the command.

    ","parent_name":"SDLOnCommand"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)triggerSource":{"name":"triggerSource","abstract":"

    Indicates whether command was selected via voice or via a menu selection (using the OK button).

    ","parent_name":"SDLOnCommand"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonName":{"name":"buttonName","abstract":"

    The button’s name

    ","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"

    Indicates whether this is a LONG or SHORT button press event

    ","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)customButtonID":{"name":"customButtonID","abstract":"

    If ButtonName is CUSTOM_BUTTON, this references the integer ID passed by a custom button. (e.g. softButton ID)

    ","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonName":{"name":"buttonName","abstract":"

    The name of the button

    ","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonEventMode":{"name":"buttonEventMode","abstract":"

    Indicates whether this is an UP or DOWN event

    ","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)customButtonID":{"name":"customButtonID","abstract":"

    If ButtonName is CUSTOM_BUTTON, this references the integer ID passed by a custom button. (e.g. softButton ID)

    ","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(im)initWithServiceData:":{"name":"-initWithServiceData:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(py)serviceData":{"name":"serviceData","abstract":"

    The updated app service data.

    ","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppInterfaceUnregistered.html#/c:objc(cs)SDLOnAppInterfaceUnregistered(py)reason":{"name":"reason","abstract":"

    The reason application’s interface was terminated

    ","parent_name":"SDLOnAppInterfaceUnregistered"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:","abstract":"

    Undocumented

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:","abstract":"

    Undocumented

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryName":{"name":"countryName","abstract":"

    Name of the country (localized)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryCode":{"name":"countryCode","abstract":"

    countryCode of the country(ISO 3166-2)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)postalCode":{"name":"postalCode","abstract":"

    postalCode of location (PLZ, ZIP, PIN, CAP etc.)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)administrativeArea":{"name":"administrativeArea","abstract":"

    Portion of country (e.g. state)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subAdministrativeArea":{"name":"subAdministrativeArea","abstract":"

    Portion of administrativeArea (e.g. county)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)locality":{"name":"locality","abstract":"

    Hypernym for city/village

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subLocality":{"name":"subLocality","abstract":"

    Hypernym for district

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)thoroughfare":{"name":"thoroughfare","abstract":"

    Hypernym for street, road etc.

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subThoroughfare":{"name":"subThoroughfare","abstract":"

    Portion of thoroughfare (e.g. house number)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allResponseNames":{"name":"+allResponseNames","abstract":"

    All of the possible SDL RPC Response notification names

    ","parent_name":"SDLNotificationConstants"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allButtonEventNotifications":{"name":"+allButtonEventNotifications","abstract":"

    All of the possible SDL Button event notification names

    ","parent_name":"SDLNotificationConstants"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(im)initWithAcceptsWayPoints:":{"name":"-initWithAcceptsWayPoints:","abstract":"

    Convenience init.

    ","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(py)acceptsWayPoints":{"name":"acceptsWayPoints","abstract":"

    Informs the subscriber if this service can actually accept way points.

    ","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:":{"name":"-initWithTimestamp:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:":{"name":"-initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)timestamp":{"name":"timestamp","abstract":"

    This is the timestamp of when the data was generated. This is to ensure any time or distance given in the data can accurately be adjusted if necessary.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)origin":{"name":"origin","abstract":"

    The start location.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destination":{"name":"destination","abstract":"

    The final destination location.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destinationETA":{"name":"destinationETA","abstract":"

    The estimated time of arrival at the final destination location.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)instructions":{"name":"instructions","abstract":"

    This array should be ordered with all remaining instructions. The start of this array should always contain the next instruction.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionETA":{"name":"nextInstructionETA","abstract":"

    The estimated time of arrival at the next destination.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistance":{"name":"nextInstructionDistance","abstract":"

    The distance to this instruction from current location. This should only be updated ever .1 unit of distance. For more accuracy the consumer can use the GPS location of itself and the next instruction.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistanceScale":{"name":"nextInstructionDistanceScale","abstract":"

    Distance till next maneuver (starting from) from previous maneuver.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)prompt":{"name":"prompt","abstract":"

    This is a prompt message that should be conveyed to the user through either display or voice (TTS). This param will change often as it should represent the following: approaching instruction, post instruction, alerts that affect the current navigation session, etc.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:":{"name":"-initWithLocationDetails:action:","abstract":"

    Convenience init for required parameters

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:":{"name":"-initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)locationDetails":{"name":"locationDetails","abstract":"

    The location details.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)action":{"name":"action","abstract":"

    The navigation action.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)eta":{"name":"eta","abstract":"

    The estimated time of arrival.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)bearing":{"name":"bearing","abstract":"

    The angle at which this instruction takes place. For example, 0 would mean straight, <=45 is bearing right, >= 135 is sharp right, between 45 and 135 is a regular right, and 180 is a U-Turn, etc.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)junctionType":{"name":"junctionType","abstract":"

    The navigation junction type.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)drivingSide":{"name":"drivingSide","abstract":"

    Used to infer which side of the road this instruction takes place. For a U-Turn (action=TURN, bearing=180) this will determine which direction the turn should take place.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)details":{"name":"details","abstract":"

    This is a string representation of this instruction, used to display instructions to the users. This is not intended to be read aloud to the users, see the param prompt in NavigationServiceData for that.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)image":{"name":"image","abstract":"

    An image representation of this instruction.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(im)initWithSendLocation:waypoints:":{"name":"-initWithSendLocation:waypoints:","abstract":"

    Undocumented

    ","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)sendLocationEnabled":{"name":"sendLocationEnabled","abstract":"

    Whether or not the SendLocation RPC is enabled.

    ","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)getWayPointsEnabled":{"name":"getWayPointsEnabled","abstract":"

    Whether or not Waypoint related RPCs are enabled.

    ","parent_name":"SDLNavigationCapability"},"Classes/SDLMyKey.html#/c:objc(cs)SDLMyKey(py)e911Override":{"name":"e911Override","abstract":"

    Indicates whether e911 override is on. References signal MyKey_e911Override_St. See VehicleDataStatus.

    ","parent_name":"SDLMyKey"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithRadioControlData:":{"name":"-initWithRadioControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with radio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithClimateControlData:":{"name":"-initWithClimateControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with climate control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithAudioControlData:":{"name":"-initWithAudioControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with audio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithLightControlData:":{"name":"-initWithLightControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with light control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithHMISettingsControlData:":{"name":"-initWithHMISettingsControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with hmi settings data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithSeatControlData:":{"name":"-initWithSeatControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with seat control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleType":{"name":"moduleType","abstract":"

    The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)radioControlData":{"name":"radioControlData","abstract":"

    The radio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)climateControlData":{"name":"climateControlData","abstract":"

    The climate control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)seatControlData":{"name":"seatControlData","abstract":"

    The seat control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)audioControlData":{"name":"audioControlData","abstract":"

    The audio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)lightControlData":{"name":"lightControlData","abstract":"

    The light control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)hmiSettingsControlData":{"name":"hmiSettingsControlData","abstract":"

    The hmi control data

    ","parent_name":"SDLModuleData"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:":{"name":"-initWithTextFieldTypes:mainField2:","abstract":"

    Constructs a newly allocated SDLMetadataType object with NSArrays

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:mainField3:mainField4:":{"name":"-initWithTextFieldTypes:mainField2:mainField3:mainField4:","abstract":"

    Undocumented

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField1":{"name":"mainField1","abstract":"

    The type of data contained in the mainField1 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField2":{"name":"mainField2","abstract":"

    The type of data contained in the mainField2 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField3":{"name":"mainField3","abstract":"

    The type of data contained in the mainField3 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField4":{"name":"mainField4","abstract":"

    The type of data contained in the mainField4 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:":{"name":"-initWithMenuName:","abstract":"

    Undocumented

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentId:position:":{"name":"-initWithMenuName:parentId:position:","abstract":"

    Undocumented

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)parentID":{"name":"parentID","abstract":"

    The unique ID of an existing submenu to which a command will be added

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)position":{"name":"position","abstract":"

    The position within the items of the parent Command Menu

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)menuName":{"name":"menuName","abstract":"

    The menu name which appears in menu, representing this command

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title":{"name":"title","abstract":"

    The cell’s text to be displayed

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)icon":{"name":"icon","abstract":"

    The cell’s icon to be displayed

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)voiceCommands":{"name":"voiceCommands","abstract":"

    The strings the user can say to activate this voice command

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)handler":{"name":"handler","abstract":"

    The handler that will be called when the command is activated

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells":{"name":"subCells","abstract":"

    If this is non-nil, this cell will be a sub-menu button, displaying the subcells in a menu when pressed.

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:voiceCommands:handler:":{"name":"-initWithTitle:icon:voiceCommands:handler:","abstract":"

    Create a menu cell that has no subcells.

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:subCells:":{"name":"-initWithTitle:subCells:","abstract":"

    Create a menu cell that has subcells and when selected will go into a deeper part of the menu

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:subCells:":{"name":"-initWithTitle:icon:subCells:","abstract":"

    Create a menu cell that has subcells and when selected will go into a deeper part of the menu

    ","parent_name":"SDLMenuCell"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(im)initWithMediaType:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:","abstract":"

    Convenience init

    ","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaType":{"name":"mediaType","abstract":"

    The type of the currently playing or paused track.

    ","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaTitle":{"name":"mediaTitle","abstract":"

    Music: The name of the current track","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaArtist":{"name":"mediaArtist","abstract":"

    Music: The name of the current album artist","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaAlbum":{"name":"mediaAlbum","abstract":"

    Music: The name of the current album","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)playlistName":{"name":"playlistName","abstract":"

    Music: The name of the playlist or radio station, if the user is playing from a playlist, otherwise, Null","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)isExplicit":{"name":"isExplicit","abstract":"

    Whether or not the content currently playing (e.g. the track, episode, or book) contains explicit content.

    ","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackProgress":{"name":"trackPlaybackProgress","abstract":"

    Music: The current progress of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackDuration":{"name":"trackPlaybackDuration","abstract":"

    Music: The total duration of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackProgress":{"name":"queuePlaybackProgress","abstract":"

    Music: The current progress of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackDuration":{"name":"queuePlaybackDuration","abstract":"

    Music: The total duration of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueCurrentTrackNumber":{"name":"queueCurrentTrackNumber","abstract":"

    Music: The current number (1 based) of the track in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueTotalTrackCount":{"name":"queueTotalTrackCount","abstract":"

    Music: The total number of tracks in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(im)initWithMassageMode:massageZone:":{"name":"-initWithMassageMode:massageZone:","abstract":"

    @abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone

    ","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageMode":{"name":"massageMode","abstract":"

    @abstract mode of a massage zone

    ","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageZone":{"name":"massageZone","abstract":"

    @abstract zone of a multi-contour massage seat.

    ","parent_name":"SDLMassageModeData"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(im)initWithMassageCushion:firmness:":{"name":"-initWithMassageCushion:firmness:","abstract":"

    Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness

    ","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)cushion":{"name":"cushion","abstract":"

    @abstract cushion of a multi-contour massage seat.

    ","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)firmness":{"name":"firmness","abstract":"

    @abstract zone of a multi-contour massage seat.

    ","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)configuration":{"name":"configuration","abstract":"

    The configuration the manager was set up with.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)hmiLevel":{"name":"hmiLevel","abstract":"

    The current HMI level of the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)audioStreamingState":{"name":"audioStreamingState","abstract":"

    The current audio streaming state of the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemContext":{"name":"systemContext","abstract":"

    The current system context of the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)fileManager":{"name":"fileManager","abstract":"

    The file manager to be used by the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)permissionManager":{"name":"permissionManager","abstract":"

    The permission manager monitoring RPC permissions.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)streamManager":{"name":"streamManager","abstract":"

    The streaming media manager to be used for starting video sessions.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)screenManager":{"name":"screenManager","abstract":"

    The screen manager for sending UI related RPCs.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemCapabilityManager":{"name":"systemCapabilityManager","abstract":"

    Centralized manager for retrieving all system capabilities.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)registerResponse":{"name":"registerResponse","abstract":"

    The response of a register call after it has been received.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)authToken":{"name":"authToken","abstract":"

    The auth token, if received. This should be used to log into a user account. Primarily used for cloud apps with companion app stores.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)delegate":{"name":"delegate","abstract":"

    The manager’s delegate.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)pendingRPCTransactions":{"name":"pendingRPCTransactions","abstract":"

    The currently pending RPC request send transactions

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)proxy":{"name":"proxy","abstract":"

    Undocumented

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)initWithConfiguration:delegate:":{"name":"-initWithConfiguration:delegate:","abstract":"

    Initialize the manager with a configuration. Call startWithHandler to begin waiting for a connection.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startWithReadyHandler:":{"name":"-startWithReadyHandler:","abstract":"

    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.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)stop":{"name":"-stop","abstract":"

    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.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRPC:":{"name":"-sendRPC:","abstract":"

    Send an RPC of type Response, Notification or Request. Responses and notifications sent to Core do not a response back from Core. Each request sent to Core does get a response, so if you need the response and/or error, call sendRequest:withResponseHandler: instead.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:":{"name":"-sendRequest:","abstract":"

    Send an RPC request and don’t bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:withResponseHandler:":{"name":"-sendRequest:withResponseHandler:","abstract":"

    Send an RPC request and set a completion handler that will be called with the response when the response returns.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequests:progressHandler:completionHandler:":{"name":"-sendRequests:progressHandler:completionHandler:","abstract":"

    Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendSequentialRequests:progressHandler:completionHandler:":{"name":"-sendSequentialRequests:progressHandler:completionHandler:","abstract":"

    Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.

    ","parent_name":"SDLManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)modules":{"name":"modules","abstract":"

    Active log modules

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)targets":{"name":"targets","abstract":"

    Active log targets

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)filters":{"name":"filters","abstract":"

    Active log filters

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)globalLogLevel":{"name":"globalLogLevel","abstract":"

    Any modules that do not have an explicitly specified level will by default use this log level

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)formatType":{"name":"formatType","abstract":"

    Active log format

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)asynchronous":{"name":"asynchronous","abstract":"

    Whether or not verbose, debug, and warning logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"

    Whether or not error logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)disableAssertions":{"name":"disableAssertions","abstract":"

    Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)dateFormatter":{"name":"dateFormatter","abstract":"

    Active date formatter

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)logQueue":{"name":"logQueue","abstract":"

    The queue asynchronously logged logs are logged on. Say that 10 times fast.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)sharedManager":{"name":"+sharedManager","abstract":"

    The singleton object

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)setConfiguration:":{"name":"+setConfiguration:","abstract":"

    Sets a configuration to be used by the log manager’s sharedManager. This is generally for internal use and you should set your configuration using SDLManager’s startWithConfiguration: method.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)setConfiguration:":{"name":"-setConfiguration:","abstract":"

    Sets a configuration to be used by the log manager. This is generally for internal use and you should set your configuration using SDLManager’s startWithConfiguration: method.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log to the sharedManager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log to this log manager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"

    Log to this sharedManager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"

    Log to this log manager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"+logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"

    Log to this sharedManager’s active log targets. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"-logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"

    Log to this manager’s active log targets. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"+logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log an error to the sharedManager’s active log targets and assert. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"-logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log an error to this manager’s active log targets and assert. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(py)filter":{"name":"filter","abstract":"

    Undocumented

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)initWithCustomFilter:":{"name":"-initWithCustomFilter:","abstract":"

    Create a new filter with a custom filter block. The filter block will take a log model and return a BOOL of pass / fail.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingString:caseSensitive:":{"name":"+filterByDisallowingString:caseSensitive:","abstract":"

    Returns a filter that only allows logs not containing the passed string within their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingString:caseSensitive:":{"name":"+filterByAllowingString:caseSensitive:","abstract":"

    Returns a filter that only allows logs containing the passed string within their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingRegex:":{"name":"+filterByDisallowingRegex:","abstract":"

    Returns a filter that only allows logs not passing the passed regex against their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingRegex:":{"name":"+filterByAllowingRegex:","abstract":"

    Returns a filter that only allows logs passing the passed regex against their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingModules:":{"name":"+filterByDisallowingModules:","abstract":"

    Returns a filter that only allows logs not within the specified file modules to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingModules:":{"name":"+filterByAllowingModules:","abstract":"

    Returns a filter that only allows logs of the specified file modules to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingFileNames:":{"name":"+filterByDisallowingFileNames:","abstract":"

    Returns a filter that only allows logs not within the specified files to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingFileNames:":{"name":"+filterByAllowingFileNames:","abstract":"

    Returns a filter that only allows logs within the specified files to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)name":{"name":"name","abstract":"

    The name of the this module, e.g. Transport

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)files":{"name":"files","abstract":"

    All of the files contained within this module. When a log is logged, the __FILE__ (in Obj-C) or #file (in Swift) is automatically captured and checked to see if any module has a file in this set that matches. If it does, it will be logged using the module’s log level and the module’s name will be printed in the formatted log.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)logLevel":{"name":"logLevel","abstract":"

    The custom level of the log. This is SDLLogLevelDefault (whatever the current global log level is) by default.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)init":{"name":"-init","abstract":"

    This method is unavailable and may not be used.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:level:":{"name":"-initWithName:files:level:","abstract":"

    Returns an initialized SDLLogFileModule that contains a custom name, set of files, and associated log level.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:":{"name":"-initWithName:files:","abstract":"

    Returns an initialized SDLLogFileModule that contains a custom name and set of files. The logging level is the same as the current global logging file by using SDLLogLevelDefault.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(cm)moduleWithName:files:":{"name":"+moduleWithName:files:","abstract":"

    Returns an initialized SDLLogFileModule that contains a custom name and set of files. The logging level is the same as the current global logging file by using SDLLogLevelDefault.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)containsFile:":{"name":"-containsFile:","abstract":"

    Returns whether or not this module contains a given file.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)modules":{"name":"modules","abstract":"

    Any custom logging modules used by the developer’s code. Defaults to none.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)targets":{"name":"targets","abstract":"

    Where the logs will attempt to output. Defaults to Console.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)filters":{"name":"filters","abstract":"

    What log filters will run over this session. Defaults to none.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)formatType":{"name":"formatType","abstract":"

    How detailed of logs will be output. Defaults to Default.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)asynchronous":{"name":"asynchronous","abstract":"

    Whether or not logs will be run on a separate queue, asynchronously, allowing the following code to run before the log completes. Or if it will occur synchronously, which will prevent logs from being missed, but will slow down surrounding code. Defaults to YES.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"

    Whether or not error logs will be dispatched to loggers asynchronously. Defaults to NO.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)disableAssertions":{"name":"disableAssertions","abstract":"

    Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)globalLogLevel":{"name":"globalLogLevel","abstract":"

    Any modules that do not have an explicitly specified level will by default use the global log level. Defaults to Error.","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"

    A default logger for production. This sets the format type to Default, the log level to Error, and only enables the ASL logger.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)debugConfiguration":{"name":"+debugConfiguration","abstract":"

    A debug logger for use in development. This sets the format type to Detailed, the log level to Debug, and enables the Console and ASL loggers.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)appIcon":{"name":"appIcon","abstract":"

    The app’s icon. This will be set by the lock screen configuration.

    ","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)vehicleIcon":{"name":"vehicleIcon","abstract":"

    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.

    ","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)backgroundColor":{"name":"backgroundColor","abstract":"

    The designated background color set in the lock screen configuration, or the default SDL gray-blue.

    ","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)showInOptionalState":{"name":"showInOptionalState","abstract":"

    Whether or not the lock screen should be shown in the lock screen optional state. Defaults to false.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)enableAutomaticLockScreen":{"name":"enableAutomaticLockScreen","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor":{"name":"backgroundColor","abstract":"

    The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)appIcon":{"name":"appIcon","abstract":"

    Your app icon as it will appear on the lock screen.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)customViewController":{"name":"customViewController","abstract":"

    A custom view controller that the lock screen will manage the presentation of.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)disabledConfiguration":{"name":"+disabledConfiguration","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfiguration":{"name":"+enabledConfiguration","abstract":"

    Use this configuration for the basic default lock screen. A custom app icon will not be used.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithAppIcon:backgroundColor:":{"name":"+enabledConfigurationWithAppIcon:backgroundColor:","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithViewController:":{"name":"+enabledConfigurationWithViewController:","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:":{"name":"-initWithCoordinate:","abstract":"

    Convenience init for location coordinate.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:":{"name":"-initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)coordinate":{"name":"coordinate","abstract":"

    Latitude/Longitude of the location

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationName":{"name":"locationName","abstract":"

    Name of location.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)addressLines":{"name":"addressLines","abstract":"

    Location address for display purposes only.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationDescription":{"name":"locationDescription","abstract":"

    Description intended location / establishment.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)phoneNumber":{"name":"phoneNumber","abstract":"

    Phone number of location / establishment.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationImage":{"name":"locationImage","abstract":"

    Image / icon of intended location.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)searchAddress":{"name":"searchAddress","abstract":"

    Address to be used by navigation engines for search.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(im)initWithLatitudeDegrees:longitudeDegrees:":{"name":"-initWithLatitudeDegrees:longitudeDegrees:","abstract":"

    Convenience init for location coordinates

    ","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"

    Latitude of the location

    ","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"

    Latitude of the location

    ","parent_name":"SDLLocationCoordinate"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)filenames":{"name":"filenames","abstract":"

    An array of all filenames resident on the module for the given registered app. If omitted, then no files currently reside on the system.

    ","parent_name":"SDLListFilesResponse"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"

    Provides the total local space available on the module for the registered app.

    ","parent_name":"SDLListFilesResponse"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:":{"name":"-initWithId:status:","abstract":"

    Constructs a newly allocated SDLLightState object with given parameters

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:density:color:":{"name":"-initWithId:status:density:color:","abstract":"

    Constructs a newly allocated SDLLightState object with given parameters

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:lightStatus:lightDensity:lightColor:":{"name":"-initWithId:lightStatus:lightDensity:lightColor:","abstract":"

    Constructs a newly allocated SDLLightState object with given parameters

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)id":{"name":"id","abstract":"

    @abstract The name of a light or a group of lights

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)status":{"name":"status","abstract":"

    @abstract Reflects the status of Light.

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)density":{"name":"density","abstract":"

    @abstract Reflects the density of Light.

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)color":{"name":"color","abstract":"

    @abstract Reflects the color of Light.

    ","parent_name":"SDLLightState"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(im)initWithLightStates:":{"name":"-initWithLightStates:","abstract":"

    Constructs a newly allocated SDLLightControlData object with lightState

    ","parent_name":"SDLLightControlData"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(py)lightState":{"name":"lightState","abstract":"

    @abstract An array of LightNames and their current or desired status.","parent_name":"SDLLightControlData"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(im)initWithModuleName:supportedLights:":{"name":"-initWithModuleName:supportedLights:","abstract":"

    Constructs a newly allocated SDLLightControlCapabilities object with given parameters

    ","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the light control module.","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)supportedLights":{"name":"supportedLights","abstract":"

    @abstract An array of available LightCapabilities that are controllable.

    ","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"

    Constructs a newly allocated SDLLightCapabilities object with the name of the light or group of lights

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:densityAvailable:colorAvailable:statusAvailable:":{"name":"-initWithName:densityAvailable:colorAvailable:statusAvailable:","abstract":"

    Constructs a newly allocated SDLLightCapabilities object with given parameters

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)name":{"name":"name","abstract":"

    @abstract The name of a light or a group of lights

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)densityAvailable":{"name":"densityAvailable","abstract":"

    @abstract Indicates if the light’s density can be set remotely (similar to a dimmer).

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)colorAvailable":{"name":"colorAvailable","abstract":"

    @abstract Indicates if the light’s color can be set remotely by using the RGB color space.

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)statusAvailable":{"name":"statusAvailable","abstract":"

    @abstract Indicates if the status (ON/OFF) can be set remotely.","parent_name":"SDLLightCapabilities"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)appName":{"name":"appName","abstract":"

    The full name of the app to that the configuration should be updated to.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)shortAppName":{"name":"shortAppName","abstract":"

    An abbrevited application name that will be used on the app launching screen if the full one would be truncated.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)ttsName":{"name":"ttsName","abstract":"

    A Text to Speech String for voice recognition of the mobile application name.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"

    Additional voice recognition commands. May not interfere with any other app name or global commands.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(im)initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:":{"name":"-initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:","abstract":"

    Initializes and returns a newly allocated lifecycle configuration update object with the specified app data.","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:appId:":{"name":"+defaultConfigurationWithAppName:appId:","abstract":"

    A production configuration that runs using IAP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:fullAppId:":{"name":"+defaultConfigurationWithAppName:fullAppId:","abstract":"

    A production configuration that runs using IAP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:appId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:appId:ipAddress:port:","abstract":"

    A debug configuration that runs using TCP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:fullAppId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:fullAppId:ipAddress:port:","abstract":"

    A debug configuration that runs using TCP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugMode":{"name":"tcpDebugMode","abstract":"

    Whether or not debug mode is enabled

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugIPAddress":{"name":"tcpDebugIPAddress","abstract":"

    The ip address at which the library will look for a server

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugPort":{"name":"tcpDebugPort","abstract":"

    The port at which the library will look for a server

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appName":{"name":"appName","abstract":"

    The full name of the app

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appId":{"name":"appId","abstract":"

    The app id. This must be the same as the app id received from the SDL developer portal.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)fullAppId":{"name":"fullAppId","abstract":"

    The full app id. This must be the same as the full app id received from the SDL developer portal.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)resumeHash":{"name":"resumeHash","abstract":"

    A hash id which should be passed to the remote system in the RegisterAppInterface

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)isMedia":{"name":"isMedia","abstract":"

    This is an automatically set based on the app type

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType":{"name":"appType","abstract":"

    The application type

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)additionalAppTypes":{"name":"additionalAppTypes","abstract":"

    Additional application types beyond appType

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)language":{"name":"language","abstract":"

    The default language to use

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)languagesSupported":{"name":"languagesSupported","abstract":"

    An array of all the supported languages

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appIcon":{"name":"appIcon","abstract":"

    The application icon to be used on an app launching screen

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)shortAppName":{"name":"shortAppName","abstract":"

    An abbrevited application name that will be used on the app launching screen if the full one would be truncated

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)ttsName":{"name":"ttsName","abstract":"

    A Text to Speech String for voice recognition of the mobile application name.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"

    Additional voice recognition commands. May not interfere with any other app name or global commands.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"

    The color scheme to use when the head unit is in a light / day situation.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"

    The color scheme to use when the head unit is in a dark / night situation.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumProtocolVersion":{"name":"minimumProtocolVersion","abstract":"

    The minimum protocol version that will be permitted to connect. This defaults to 1.0.0. If the protocol version of the head unit connected is below this version, the app will disconnect with an EndService protocol message and will not register.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumRPCVersion":{"name":"minimumRPCVersion","abstract":"

    The minimum RPC version that will be permitted to connect. This defaults to 1.0.0. If the RPC version of the head unit connected is below this version, an UnregisterAppInterface will be sent.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:","abstract":"

    Undocumented

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)language":{"name":"language","abstract":"

    The keyboard language

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keyboardLayout":{"name":"keyboardLayout","abstract":"

    Desired keyboard layout

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keypressMode":{"name":"keypressMode","abstract":"

    Desired keypress mode.

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)limitedCharacterList":{"name":"limitedCharacterList","abstract":"

    Array of keyboard characters to enable. All omitted characters will be greyed out (disabled) on the keyboard. If omitted, the entire keyboard will be enabled.

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteText":{"name":"autoCompleteText","abstract":"

    Allows an app to prepopulate the text field with a suggested or completed entry as the user types

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionWidth":{"name":"resolutionWidth","abstract":"

    Resolution width

    ","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionHeight":{"name":"resolutionHeight","abstract":"

    Resolution height

    ","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(im)initWithWidth:height:":{"name":"-initWithWidth:height:","abstract":"

    Undocumented

    ","parent_name":"SDLImageResolution"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)name":{"name":"name","abstract":"

    The name that identifies the field.

    ","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"

    The image types that are supported in this field.

    ","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageResolution":{"name":"imageResolution","abstract":"

    The image resolution of this field

    ","parent_name":"SDLImageField"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:":{"name":"-initWithName:ofType:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:isTemplate:":{"name":"-initWithName:ofType:isTemplate:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:":{"name":"-initWithName:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:isTemplate:":{"name":"-initWithName:isTemplate:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticImageValue:":{"name":"-initWithStaticImageValue:","abstract":"

    Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image’s value.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticIconName:":{"name":"-initWithStaticIconName:","abstract":"

    Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image’s value.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)value":{"name":"value","abstract":"

    The static hex icon value or the binary image file name identifier (sent by SDLPutFile)

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)imageType":{"name":"imageType","abstract":"

    Describes whether the image is static or dynamic

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)isTemplate":{"name":"isTemplate","abstract":"

    Indicates that this image can be (re)colored by the HMI to best fit the current color scheme.

    ","parent_name":"SDLImage"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)lowBeamsOn":{"name":"lowBeamsOn","abstract":"

    Low beams are on or off.

    ","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)highBeamsOn":{"name":"highBeamsOn","abstract":"

    High beams are on or off

    ","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)ambientLightSensorStatus":{"name":"ambientLightSensorStatus","abstract":"

    Status of the ambient light senser

    ","parent_name":"SDLHeadLampStatus"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(im)initWithId:rect:":{"name":"-initWithId:rect:","abstract":"

    Undocumented

    ","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)id":{"name":"id","abstract":"

    A user control spatial identifier

    ","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)rect":{"name":"rect","abstract":"

    The position of the haptic rectangle to be highlighted. The center of this rectangle will be touched when a press occurs.

    ","parent_name":"SDLHapticRect"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(im)initWithDisplaymode:temperatureUnit:distanceUnit:":{"name":"-initWithDisplaymode:temperatureUnit:distanceUnit:","abstract":"

    Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)displayMode":{"name":"displayMode","abstract":"

    @abstract Display the Display Mode used HMI setting

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)temperatureUnit":{"name":"temperatureUnit","abstract":"

    @abstract Display the temperature unit used HMI setting

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)distanceUnit":{"name":"distanceUnit","abstract":"

    @abstract Display the distance unit used HMI setting

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:":{"name":"-initWithModuleName:","abstract":"

    Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:","abstract":"

    Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the hmi setting module.","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)distanceUnitAvailable":{"name":"distanceUnitAvailable","abstract":"

    @abstract Availability of the control of distance unit.

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)temperatureUnitAvailable":{"name":"temperatureUnitAvailable","abstract":"

    @abstract Availability of the control of temperature unit.

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)displayModeUnitAvailable":{"name":"displayModeUnitAvailable","abstract":"

    @abstract Availability of the control of HMI display mode.

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)allowed":{"name":"allowed","abstract":"

    A set of all HMI levels that are permitted for this given RPC

    ","parent_name":"SDLHMIPermissions"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"

    A set of all HMI levels that are prohibited for this given RPC

    ","parent_name":"SDLHMIPermissions"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)navigation":{"name":"navigation","abstract":"

    Availability of built in Nav. True: Available, False: Not Available

    ","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)phoneCall":{"name":"phoneCall","abstract":"

    Availability of built in phone. True: Available, False: Not Available

    ","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)videoStreaming":{"name":"videoStreaming","abstract":"

    Availability of built in video streaming. True: Available, False: Not Available

    ","parent_name":"SDLHMICapabilities"},"Classes/SDLGetWayPointsResponse.html#/c:objc(cs)SDLGetWayPointsResponse(py)waypoints":{"name":"waypoints","abstract":"

    Provides additional human readable info regarding the result.

    ","parent_name":"SDLGetWayPointsResponse"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(im)initWithType:":{"name":"-initWithType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetWayPoints"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(py)waypointType":{"name":"waypointType","abstract":"

    To request for either the destination","parent_name":"SDLGetWayPoints"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gps":{"name":"gps","abstract":"

    The car current GPS coordinates

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)speed":{"name":"speed","abstract":"

    The vehicle speed in kilometers per hour

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"

    The number of revolutions per minute of the engine.

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The fuel level in the tank (percentage)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The fuel level state

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"

    The estimate range in KM the vehicle can travel based on fuel level and consumption

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The instantaneous fuel consumption in microlitres

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The external temperature in degrees celsius.

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)vin":{"name":"vin","abstract":"

    The Vehicle Identification Number

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"

    The current gear shift state of the user’s vehicle

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"

    The current pressure warnings for the user’s vehicle

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"

    Odometer reading in km

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"

    The status of the seat belts

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The body information including power modes

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The IVI system status including signal and battery strength

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"

    The status of the brake pedal

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The status of the wipers

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"

    Status of the head lamps

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The estimated percentage (0% - 100%) of remaining oil life of the engine

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"

    Torque value for engine (in Nm) on non-diesel variants

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    Accelerator pedal position (percentage depressed)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    Current angle of the steering wheel (in deg)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"

    Emergency Call notification and confirmation data

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The status of the air bags

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    Information related to an emergency event (and if it occurred)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    The status modes of the cluster

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"

    Information related to the MyKey feature

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The status of the electronic parking brake

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"

    The status of the turn signal

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The cloud app vehicle ID

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus:","abstract":"

    Convenience init for getting data for all possible vehicle data items.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"

    Convenience init for getting data for all possible vehicle data items.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"

    Convenience init for getting data for all possible vehicle data items.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gps":{"name":"gps","abstract":"

    A boolean value. If true, requests GPS data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)speed":{"name":"speed","abstract":"

    A boolean value. If true, requests Speed data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)rpm":{"name":"rpm","abstract":"

    A boolean value. If true, requests RPM data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    A boolean value. If true, requests Fuel Level data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    A boolean value. If true, requests Fuel Level State data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    A boolean value. If true, requests Fuel Range data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    A boolean value. If true, requests Instant Fuel Consumption data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    A boolean value. If true, requests External Temperature data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)vin":{"name":"vin","abstract":"

    A boolean value. If true, requests the Vehicle Identification Number.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)prndl":{"name":"prndl","abstract":"

    A boolean value. If true, requests PRNDL data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    A boolean value. If true, requests Tire Pressure data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)odometer":{"name":"odometer","abstract":"

    A boolean value. If true, requests Odometer data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    A boolean value. If true, requests Belt Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    A boolean value. If true, requests Body Information data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    A boolean value. If true, requests Device Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    A boolean value. If true, requests Driver Braking data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    A boolean value. If true, requests Wiper Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    A boolean value. If true, requests Head Lamp Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    A boolean value. If true, requests Engine Oil Life data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    A boolean value. If true, requests Engine Torque data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    A boolean value. If true, requests Acc Pedal Position data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    A boolean value. If true, requests Steering Wheel Angle data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    A boolean value. If true, requests Emergency Call Info data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    A boolean value. If true, requests Air Bag Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    A boolean value. If true, requests Emergency Event (if it occurred) data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    A boolean value. If true, requests Cluster Mode Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)myKey":{"name":"myKey","abstract":"

    A boolean value. If true, requests MyKey data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    A boolean value. If true, requests Electronic Parking Brake status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    A boolean value. If true, requests Turn Signal data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    A boolean value. If true, requests the Cloud App Vehicle ID.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetSystemCapabilityResponse.html#/c:objc(cs)SDLGetSystemCapabilityResponse(py)systemCapability":{"name":"systemCapability","abstract":"

    The requested system capability, of the type that was sent in the request

    ","parent_name":"SDLGetSystemCapabilityResponse"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:":{"name":"-initWithType:","abstract":"

    Convenience init

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:subscribe:":{"name":"-initWithType:subscribe:","abstract":"

    Convenience init

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"

    The type of system capability to get more information on

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)subscribe":{"name":"subscribe","abstract":"

    Flag to subscribe to updates of the supplied service capability type. If true, the requester will be subscribed. If false, the requester will not be subscribed and be removed as a subscriber if it was previously subscribed.

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"

    The requested data

    ","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)isSubscribed":{"name":"isSubscribed","abstract":"

    It is a conditional-mandatory parameter: must be returned in case subscribe parameter was present in the related request.

    ","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initWithModuleType:":{"name":"-initWithModuleType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:":{"name":"-initAndSubscribeToModuleType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:":{"name":"-initAndUnsubscribeToModuleType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleType":{"name":"moduleType","abstract":"

    The type of a RC module to retrieve module data from the vehicle.

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)subscribe":{"name":"subscribe","abstract":"

    If subscribe is true, the head unit will register onInteriorVehicleData notifications for the requested moduelType.","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(im)initWithOffset:length:fileType:crc:":{"name":"-initWithOffset:length:fileType:crc:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)offset":{"name":"offset","abstract":"

    Optional offset in bytes for resuming partial data chunks.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)length":{"name":"length","abstract":"

    Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)fileType":{"name":"fileType","abstract":"

    File type that is being sent in response.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)crc":{"name":"crc","abstract":"

    Additional CRC32 checksum to protect data integrity up to 512 Mbits.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:":{"name":"-initWithFileName:appServiceId:fileType:","abstract":"

    Convenience init for sending a small file.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:offset:length:":{"name":"-initWithFileName:appServiceId:fileType:offset:length:","abstract":"

    Convenience init for sending a large file in multiple data chunks.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileName":{"name":"fileName","abstract":"

    File name that should be retrieved.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)appServiceId":{"name":"appServiceId","abstract":"

    ID of the service that should have uploaded the requested file.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileType":{"name":"fileType","abstract":"

    Selected file type.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)offset":{"name":"offset","abstract":"

    Optional offset in bytes for resuming partial data chunks.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)length":{"name":"length","abstract":"

    Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)ecuHeader":{"name":"ecuHeader","abstract":"

    2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf)

    ","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)dtc":{"name":"dtc","abstract":"

    Array of all reported DTCs on module (ecuHeader contains information if list is truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as defined in VHR_Layout_Specification_DTCs.pdf).

    ","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:":{"name":"-initWithECUName:","abstract":"

    Undocumented

    ","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:mask:":{"name":"-initWithECUName:mask:","abstract":"

    Undocumented

    ","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)ecuName":{"name":"ecuName","abstract":"

    a name of the module to receive the DTC form","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)dtcMask":{"name":"dtcMask","abstract":"

    DTC Mask Byte to be sent in diagnostic request to module. NSNumber* dtcMask Minvalue:0; Maxvalue:255

    ","parent_name":"SDLGetDTCs"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"

    Convenience init.

    ","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(py)properties":{"name":"properties","abstract":"

    The requested cloud application properties.

    ","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"

    Convenience init.

    ","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(py)appID":{"name":"appID","abstract":"

    The id of the cloud app.

    ","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(im)initWithAppServiceData:":{"name":"-initWithAppServiceData:","abstract":"

    Convenience init.

    ","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(py)serviceData":{"name":"serviceData","abstract":"

    Contains all the current data of the app service.

    ","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"

    Convenience init for service type.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndSubscribeToAppServiceType:":{"name":"-initAndSubscribeToAppServiceType:","abstract":"

    Convenience init for subscribing to a service type.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndUnsubscribeToAppServiceType:":{"name":"-initAndUnsubscribeToAppServiceType:","abstract":"

    Convenience init for unsubscribing to a service type

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)serviceType":{"name":"serviceType","abstract":"

    The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)subscribe":{"name":"subscribe","abstract":"

    If true, the consumer is requesting to subscribe to all future updates from the service publisher. If false, the consumer doesn’t wish to subscribe and should be unsubscribed if it was previously subscribed.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"

    longitude degrees

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"

    latitude degrees

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcYear":{"name":"utcYear","abstract":"

    utc year

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMonth":{"name":"utcMonth","abstract":"

    utc month

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcDay":{"name":"utcDay","abstract":"

    utc day

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcHours":{"name":"utcHours","abstract":"

    utc hours

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMinutes":{"name":"utcMinutes","abstract":"

    utc minutes

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcSeconds":{"name":"utcSeconds","abstract":"

    utc seconds

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)compassDirection":{"name":"compassDirection","abstract":"

    Optional, Potential Compass Directions

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)pdop":{"name":"pdop","abstract":"

    The 3D positional dilution of precision.

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)hdop":{"name":"hdop","abstract":"

    The horizontal dilution of precision

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)vdop":{"name":"vdop","abstract":"

    the vertical dilution of precision

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)actual":{"name":"actual","abstract":"

    What the coordinates are based on

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)satellites":{"name":"satellites","abstract":"

    The number of satellites in view

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)dimension":{"name":"dimension","abstract":"

    The supported dimensions of the GPS

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)altitude":{"name":"altitude","abstract":"

    Altitude in meters

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)heading":{"name":"heading","abstract":"

    Heading based on the GPS data.

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)speed":{"name":"speed","abstract":"

    Speed in KPH

    ","parent_name":"SDLGPSData"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(cm)sharedInstance":{"name":"+sharedInstance","abstract":"

    Undocumented

    ","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionNameForId:":{"name":"-functionNameForId:","abstract":"

    Undocumented

    ","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionIdForName:":{"name":"-functionIdForName:","abstract":"

    Undocumented

    ","parent_name":"SDLFunctionID"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)type":{"name":"type","abstract":"

    The vehicle’s fuel type

    ","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)range":{"name":"range","abstract":"

    The estimate range in KM the vehicle can travel based on fuel level and consumption.

    ","parent_name":"SDLFuelRange"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)artworkRetryCount":{"name":"artworkRetryCount","abstract":"

    Defines the number of times the file manager will attempt to reupload SDLArtwork files in the event of a failed upload to Core.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)fileRetryCount":{"name":"fileRetryCount","abstract":"

    Defines the number of times the file manager will attempt to reupload general SDLFiles in the event of a failed upload to Core.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"

    Creates a default file manager configuration.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)init":{"name":"-init","abstract":"

    Use defaultConfiguration instead

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)initWithArtworkRetryCount:fileRetryCount:":{"name":"-initWithArtworkRetryCount:fileRetryCount:","abstract":"

    Creates a file manager configuration with customized upload retry counts.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)remoteFileNames":{"name":"remoteFileNames","abstract":"

    A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)bytesAvailable":{"name":"bytesAvailable","abstract":"

    The number of bytes still available for files for this app.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)currentState":{"name":"currentState","abstract":"

    The state of the file manager.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)pendingTransactions":{"name":"pendingTransactions","abstract":"

    The currently pending transactions (Upload, Delete, and List Files) in the file manager

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)suspended":{"name":"suspended","abstract":"

    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.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)init":{"name":"-init","abstract":"

    Initialize the class…or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"

    Creates a new file manager with a specified connection manager

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"

    Creates a new file manager with a specified connection manager and configuration

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"

    The manager stars up and attempts to fetch its initial list and transfer initial files.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)stop":{"name":"-stop","abstract":"

    Cancels all file manager operations and deletes all associated data.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)hasUploadedFile:":{"name":"-hasUploadedFile:","abstract":"

    Check if the remote system contains a file

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFileWithName:completionHandler:":{"name":"-deleteRemoteFileWithName:completionHandler:","abstract":"

    Delete a file stored on the remote system

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFilesWithNames:completionHandler:":{"name":"-deleteRemoteFilesWithNames:completionHandler:","abstract":"

    Deletes an array of files on the remote file system. The files are deleted in the order in which they are added to the array, with the first file to be deleted at index 0. The delete queue is sequential, meaning that once a delete request is sent to Core, the queue waits until a response is received from Core before the next the next delete request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFile:completionHandler:":{"name":"-uploadFile:completionHandler:","abstract":"

    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.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:progressHandler:completionHandler:":{"name":"-uploadFiles:progressHandler:completionHandler:","abstract":"

    Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:completionHandler:":{"name":"-uploadFiles:completionHandler:","abstract":"

    Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtwork:completionHandler:":{"name":"-uploadArtwork:completionHandler:","abstract":"

    Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:completionHandler:":{"name":"-uploadArtworks:completionHandler:","abstract":"

    Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:progressHandler:completionHandler:":{"name":"-uploadArtworks:progressHandler:completionHandler:","abstract":"

    Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(cm)temporaryFileDirectory":{"name":"+temporaryFileDirectory","abstract":"

    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.

    ","parent_name":"SDLFileManager"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)persistent":{"name":"persistent","abstract":"

    Whether or not the file should persist on disk between car ignition cycles.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)overwrite":{"name":"overwrite","abstract":"

    Whether or not the file should overwrite an existing file on the remote disk with the same name.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)name":{"name":"name","abstract":"

    The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL":{"name":"fileURL","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)data":{"name":"data","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileSize":{"name":"fileSize","abstract":"

    The size of the binary data of the SDLFile.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileType":{"name":"fileType","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)inputStream":{"name":"inputStream","abstract":"

    A stream to pull binary data from a SDLFile. The stream only pulls required data from the file on disk or in memory. This reduces memory usage while uploading a large file to the remote system as each chunk of data can be released immediately after it is uploaded.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)isStaticIcon":{"name":"isStaticIcon","abstract":"

    Describes whether or not this file is represented by static icon data. The head unit will present its representation of the static icon concept when sent this data.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithFileURL:name:persistent:":{"name":"-initWithFileURL:name:persistent:","abstract":"

    The designated initializer for an SDL File. The only major property that is not set using this is overwrite, which defaults to NO.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileAtFileURL:name:":{"name":"+persistentFileAtFileURL:name:","abstract":"

    Create an SDL file using a local file URL.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileAtFileURL:name:":{"name":"+fileAtFileURL:name:","abstract":"

    Create an SDL file using a local file URL.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithData:name:fileExtension:persistent:":{"name":"-initWithData:name:fileExtension:persistent:","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileWithData:name:fileExtension:":{"name":"+persistentFileWithData:name:fileExtension:","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileWithData:name:fileExtension:":{"name":"+fileWithData:name:fileExtension:","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(im)initWithChannelId:channelSetting:":{"name":"-initWithChannelId:channelSetting:","abstract":"

    Undocumented

    ","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelName":{"name":"channelName","abstract":"

    @abstract Read-only channel / frequency name","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelSetting":{"name":"channelSetting","abstract":"

    @abstract Reflects the setting, from 0%-100%.

    ","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelId":{"name":"channelId","abstract":"

    @abstract id of the channel.

    ","parent_name":"SDLEqualizerSettings"},"Classes/SDLEncodedSyncPData.html#/c:objc(cs)SDLEncodedSyncPData(py)data":{"name":"data","abstract":"

    Contains base64 encoded string of SyncP packets.

    ","parent_name":"SDLEncodedSyncPData"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)emergencyEventType":{"name":"emergencyEventType","abstract":"

    References signal VedsEvntType_D_Ltchd. See EmergencyEventType.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)fuelCutoffStatus":{"name":"fuelCutoffStatus","abstract":"

    References signal RCM_FuelCutoff. See FuelCutoffStatus.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)rolloverEvent":{"name":"rolloverEvent","abstract":"

    References signal VedsEvntRoll_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)maximumChangeVelocity":{"name":"maximumChangeVelocity","abstract":"

    References signal VedsMaxDeltaV_D_Ltchd. Change in velocity in KPH.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)multipleEvents":{"name":"multipleEvents","abstract":"

    References signal VedsMultiEvnt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallNotificationStatus":{"name":"eCallNotificationStatus","abstract":"

    References signal eCallNotification_4A. See VehicleDataNotificationStatus.

    ","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)auxECallNotificationStatus":{"name":"auxECallNotificationStatus","abstract":"

    References signal eCallNotification. See VehicleDataNotificationStatus.

    ","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallConfirmationStatus":{"name":"eCallConfirmationStatus","abstract":"

    References signal eCallConfirmation. See ECallConfirmationStatus.

    ","parent_name":"SDLECallInfo"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayType":{"name":"displayType","abstract":"

    The type of display

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayName":{"name":"displayName","abstract":"

    The name of the connected display

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)textFields":{"name":"textFields","abstract":"

    An array of SDLTextField structures, each of which describes a field in the HMI which the application can write to using operations such as SDLShow, SDLSetMediaClockTimer, etc.

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)imageFields":{"name":"imageFields","abstract":"

    An array of SDLImageField elements

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)mediaClockFormats":{"name":"mediaClockFormats","abstract":"

    An array of SDLMediaClockFormat elements, defining the valid string formats used in specifying the contents of the media clock field

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)graphicSupported":{"name":"graphicSupported","abstract":"

    The display’s persistent screen supports.

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)templatesAvailable":{"name":"templatesAvailable","abstract":"

    Number of presets the screen supports

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)screenParams":{"name":"screenParams","abstract":"

    A set of all parameters related to a prescribed screen area (e.g. for video / touch input)

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"

    The number of on-screen custom presets available (if any); otherwise omitted

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(im)initWithNumber:":{"name":"-initWithNumber:","abstract":"

    Undocumented

    ","parent_name":"SDLDialNumber"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(py)number":{"name":"number","abstract":"

    Up to 40 character string representing the phone number. All characters stripped except for ‘0’-‘9’, ‘*’, ‘#’, ‘,’, ‘;’, and ‘+’

    ","parent_name":"SDLDialNumber"},"Classes/SDLDiagnosticMessageResponse.html#/c:objc(cs)SDLDiagnosticMessageResponse(py)messageDataResult":{"name":"messageDataResult","abstract":"

    Array of bytes comprising CAN message result.

    ","parent_name":"SDLDiagnosticMessageResponse"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(im)initWithTargetId:length:data:":{"name":"-initWithTargetId:length:data:","abstract":"

    Undocumented

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)targetID":{"name":"targetID","abstract":"

    Name of target ECU

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageLength":{"name":"messageLength","abstract":"

    Length of message (in bytes)

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageData":{"name":"messageData","abstract":"

    Array of bytes comprising CAN message.

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)voiceRecOn":{"name":"voiceRecOn","abstract":"

    Indicates whether the voice recognition is on or off

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)btIconOn":{"name":"btIconOn","abstract":"

    Indicates whether the bluetooth connection established

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)callActive":{"name":"callActive","abstract":"

    Indicates whether a call is being active

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)phoneRoaming":{"name":"phoneRoaming","abstract":"

    Indicates whether the phone is in roaming mode

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)textMsgAvailable":{"name":"textMsgAvailable","abstract":"

    Indicates whether a textmessage is available

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)battLevelStatus":{"name":"battLevelStatus","abstract":"

    Battery level status

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)stereoAudioOutputMuted":{"name":"stereoAudioOutputMuted","abstract":"

    The status of the stereo audio output channel

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)monoAudioOutputMuted":{"name":"monoAudioOutputMuted","abstract":"

    The status of the mono audio output channel

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)signalLevelStatus":{"name":"signalLevelStatus","abstract":"

    Signal level status

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)primaryAudioSource":{"name":"primaryAudioSource","abstract":"

    The current primary audio source of SDL (if selected).

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)eCallEventActive":{"name":"eCallEventActive","abstract":"

    Indicates if an emergency call is active

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(cm)currentDevice":{"name":"+currentDevice","abstract":"

    Undocumented

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)hardware":{"name":"hardware","abstract":"

    Device model

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)firmwareRev":{"name":"firmwareRev","abstract":"

    Device firmware version

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)os":{"name":"os","abstract":"

    Device OS

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)osVersion":{"name":"osVersion","abstract":"

    Device OS version

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)carrier":{"name":"carrier","abstract":"

    Device mobile carrier

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)maxNumberRFCOMMPorts":{"name":"maxNumberRFCOMMPorts","abstract":"

    Number of bluetooth RFCOMM ports available.

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(im)initWithId:":{"name":"-initWithId:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(py)menuID":{"name":"menuID","abstract":"

    the MenuID that identifies the SDLSubMenu to be delete","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(im)initWithId:":{"name":"-initWithId:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"

    a unique ID that identifies the Choice Set","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteFileResponse.html#/c:objc(cs)SDLDeleteFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"

    The remaining available space for your application to store data on the remote system.

    ","parent_name":"SDLDeleteFileResponse"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(py)syncFileName":{"name":"syncFileName","abstract":"

    a file reference name","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(im)initWithId:":{"name":"-initWithId:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteCommand"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(py)cmdID":{"name":"cmdID","abstract":"

    the Command ID that identifies the Command to be deleted from Command Menu","parent_name":"SDLDeleteCommand"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:":{"name":"-initWithHour:minute:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:":{"name":"-initWithHour:minute:second:millisecond:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)millisecond":{"name":"millisecond","abstract":"

    Milliseconds part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)second":{"name":"second","abstract":"

    Seconds part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)minute":{"name":"minute","abstract":"

    Minutes part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)hour":{"name":"hour","abstract":"

    Hour part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)day":{"name":"day","abstract":"

    Day of the month

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)month":{"name":"month","abstract":"

    Month of the year

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)year":{"name":"year","abstract":"

    The year in YYYY format

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneMinuteOffset":{"name":"timezoneMinuteOffset","abstract":"

    Time zone offset in Min with regard to UTC

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneHourOffset":{"name":"timezoneHourOffset","abstract":"

    Time zone offset in Hours with regard to UTC

    ","parent_name":"SDLDateTime"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)resultCode":{"name":"resultCode","abstract":"

    Individual DID result code.

    ","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)didLocation":{"name":"didLocation","abstract":"

    Location of raw data from vehicle data DID

    ","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)data":{"name":"data","abstract":"

    Raw DID-based data returned for requested element.

    ","parent_name":"SDLDIDResult"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(im)initWithId:choiceSet:":{"name":"-initWithId:choiceSet:","abstract":"

    Undocumented

    ","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"

    A unique ID that identifies the Choice Set

    ","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)choiceSet":{"name":"choiceSet","abstract":"

    Array of choices, which the user can select by menu or voice recognition

    ","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lifecycleConfig":{"name":"lifecycleConfig","abstract":"

    The lifecycle configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lockScreenConfig":{"name":"lockScreenConfig","abstract":"

    The lock screen configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)loggingConfig":{"name":"loggingConfig","abstract":"

    The log configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig":{"name":"streamingMediaConfig","abstract":"

    The streaming media configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig":{"name":"fileManagerConfig","abstract":"

    The file manager configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:":{"name":"-initWithLifecycle:lockScreen:logging:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:":{"name":"+configurationWithLifecycle:lockScreen:logging:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeActive":{"name":"powerModeActive","abstract":"

    References signal PowerMode_UB.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeQualificationStatus":{"name":"powerModeQualificationStatus","abstract":"

    References signal PowerModeQF. See PowerModeQualificationStatus.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)carModeStatus":{"name":"carModeStatus","abstract":"

    References signal CarMode. See CarMode.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeStatus":{"name":"powerModeStatus","abstract":"

    References signal PowerMode. See PowerMode.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:":{"name":"-initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)nicknames":{"name":"nicknames","abstract":"

    An array of app names a cloud app is allowed to register with. If included in a SetCloudAppProperties request, this value will overwrite the existing nicknames field in the app policies section of the policy table.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)appID":{"name":"appID","abstract":"

    The id of the cloud app.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)enabled":{"name":"enabled","abstract":"

    If true, the cloud app will appear in the HMI’s app list; if false, the cloud app will not appear in the HMI’s app list.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)authToken":{"name":"authToken","abstract":"

    Used to authenticate websocket connection on app activation.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)cloudTransportType":{"name":"cloudTransportType","abstract":"

    Specifies the connection type Core should use. Currently the ones that work in SDL Core are WS or WSS, but an OEM can implement their own transport adapter to handle different values.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)hybridAppPreference":{"name":"hybridAppPreference","abstract":"

    Specifies the user preference to use the cloud app version or mobile app version when both are available.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)endpoint":{"name":"endpoint","abstract":"

    The websocket endpoint.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)fanSpeed":{"name":"fanSpeed","abstract":"

    Speed of Fan in integer

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)currentTemperature":{"name":"currentTemperature","abstract":"

    The Current Temperature in SDLTemperature

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)desiredTemperature":{"name":"desiredTemperature","abstract":"

    Desired Temperature in SDLTemperature

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acEnable":{"name":"acEnable","abstract":"

    Represents if AC is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)circulateAirEnable":{"name":"circulateAirEnable","abstract":"

    Represents if circulation of air is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)autoModeEnable":{"name":"autoModeEnable","abstract":"

    Represents if auto mode is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)defrostZone":{"name":"defrostZone","abstract":"

    Represents the kind of defrost zone

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)dualModeEnable":{"name":"dualModeEnable","abstract":"

    Represents if dual mode is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acMaxEnable":{"name":"acMaxEnable","abstract":"

    Represents if ac max is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)ventilationMode":{"name":"ventilationMode","abstract":"

    Represents the kind of Ventilation zone

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedSteeringWheelEnable":{"name":"heatedSteeringWheelEnable","abstract":"

    @abstract value false means disabled/turn off, value true means enabled/turn on.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedWindshieldEnable":{"name":"heatedWindshieldEnable","abstract":"

    @abstract value false means disabled, value true means enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedRearWindowEnable":{"name":"heatedRearWindowEnable","abstract":"

    @abstract value false means disabled, value true means enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedMirrorsEnable":{"name":"heatedMirrorsEnable","abstract":"

    @abstract Value false means disabled, value true means enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleName":{"name":"moduleName","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)fanSpeedAvailable":{"name":"fanSpeedAvailable","abstract":"

    Availability of the control of fan speed.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)desiredTemperatureAvailable":{"name":"desiredTemperatureAvailable","abstract":"

    Availability of the control of desired temperature.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acEnableAvailable":{"name":"acEnableAvailable","abstract":"

    Availability of the control of turn on/off AC.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acMaxEnableAvailable":{"name":"acMaxEnableAvailable","abstract":"

    Availability of the control of enable/disable air conditioning is ON on the maximum level.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)circulateAirEnableAvailable":{"name":"circulateAirEnableAvailable","abstract":"

    Availability of the control of enable/disable circulate Air mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)autoModeEnableAvailable":{"name":"autoModeEnableAvailable","abstract":"

    Availability of the control of enable/disable auto mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)dualModeEnableAvailable":{"name":"dualModeEnableAvailable","abstract":"

    Availability of the control of enable/disable dual mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZoneAvailable":{"name":"defrostZoneAvailable","abstract":"

    Availability of the control of defrost zones.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZone":{"name":"defrostZone","abstract":"

    A set of all defrost zones that are controllable.

    ","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationModeAvailable":{"name":"ventilationModeAvailable","abstract":"

    Availability of the control of air ventilation mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationMode":{"name":"ventilationMode","abstract":"

    A set of all ventilation modes that are controllable.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedSteeringWheelAvailable":{"name":"heatedSteeringWheelAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Steering Wheel.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedWindshieldAvailable":{"name":"heatedWindshieldAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Windshield.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedRearWindowAvailable":{"name":"heatedRearWindowAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Rear Window.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedMirrorsAvailable":{"name":"heatedMirrorsAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Mirrors.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"

    Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See timeout for more details. If this is not set by you, it will default to 10 seconds.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultLayout":{"name":"defaultLayout","abstract":"

    Set this to change the default layout for all choice sets. If a layout is not set on an individual choice set object, then it will use this layout instead. See layout for more details. If this is not set by you, it will default to SDLChoiceSetLayoutList.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)title":{"name":"title","abstract":"

    Maps to PerformInteraction.initialText. The title of the choice set, and/or the initial text on a keyboard prompt.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)initialPrompt":{"name":"initialPrompt","abstract":"

    Maps to PerformInteraction.initialPrompt. The initial prompt spoken to the user at the start of an interaction.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout":{"name":"layout","abstract":"

    Maps to PerformInteraction.interactionLayout. Whether the presented choices are arranged as a set of tiles or a list.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout":{"name":"timeout","abstract":"

    Maps to PerformInteraction.timeout. This applies only to a manual selection (not a voice selection, which has its timeout handled by the system). Defaults to defaultTimeout.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"

    Maps to PerformInteraction.timeoutPrompt. This text is spoken when a VR interaction times out. If this set is presented in a manual (non-voice) only interaction, this will be ignored.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpPrompt":{"name":"helpPrompt","abstract":"

    Maps to PerformInteraction.helpPrompt. This is the spoken string when a user speaks help when the interaction is occurring.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpList":{"name":"helpList","abstract":"

    Maps to PerformInteraction.vrHelp. This is a list of help text presented to the user when they are in a voice recognition interaction from your choice set of options. If this set is presented in a touch only interaction, this will be ignored.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)delegate":{"name":"delegate","abstract":"

    The delegate of this choice set, called when the user interacts with it.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)choices":{"name":"choices","abstract":"

    The choices to be displayed to the user within this choice set. These choices could match those already preloaded via SDLScreenManager preloadChoices:withCompletionHandler:.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:choices:":{"name":"-initWithTitle:delegate:choices:","abstract":"

    Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be nil.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:","abstract":"

    Initializer with all possible properties.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:","abstract":"

    Initializer with all possible properties.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text":{"name":"text","abstract":"

    Maps to Choice.menuName. The primary text of the cell. Duplicates within an SDLChoiceSet are not permitted and will result in the SDLChoiceSet failing to initialize.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryText":{"name":"secondaryText","abstract":"

    Maps to Choice.secondaryText. Optional secondary text of the cell, if available. Duplicates within an SDLChoiceSet are permitted.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)tertiaryText":{"name":"tertiaryText","abstract":"

    Maps to Choice.tertiaryText. Optional tertitary text of the cell, if available. Duplicates within an SDLChoiceSet are permitted.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)voiceCommands":{"name":"voiceCommands","abstract":"

    Maps to Choice.vrCommands. Optional voice commands the user can speak to activate the cell. If not set and the head unit requires it, this will be set to the number in the list that this item appears. However, this would be a very poor experience for a user if the choice set is presented as a voice only interaction or both interaction mode. Therefore, consider not setting this only when you know the choice set will be presented as a touch only interaction.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)artwork":{"name":"artwork","abstract":"

    Maps to Choice.image. Optional image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"

    Maps to Choice.secondaryImage. Optional secondary image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)init":{"name":"-init","abstract":"

    Initialize the cell with nothing. This is unavailable

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:":{"name":"-initWithText:","abstract":"

    Initialize the cell with text and nothing else.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:artwork:voiceCommands:":{"name":"-initWithText:artwork:voiceCommands:","abstract":"

    Initialize the cell with text, optional artwork, and optional voice commands

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:":{"name":"-initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:","abstract":"

    Initialize the cell with all optional items

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:":{"name":"-initWithId:menuName:vrCommands:","abstract":"

    Undocumented

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:":{"name":"-initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:","abstract":"

    Undocumented

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)choiceID":{"name":"choiceID","abstract":"

    The application-scoped identifier that uniquely identifies this choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)menuName":{"name":"menuName","abstract":"

    Text which appears in menu, representing this choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)vrCommands":{"name":"vrCommands","abstract":"

    VR synonyms for this choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)image":{"name":"image","abstract":"

    The image of the choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryText":{"name":"secondaryText","abstract":"

    Secondary text to display; e.g. address of POI in a search result entry

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)tertiaryText":{"name":"tertiaryText","abstract":"

    Tertiary text to display; e.g. distance to POI for a search result entry

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryImage":{"name":"secondaryImage","abstract":"

    Secondary image for choice

    ","parent_name":"SDLChoice"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:":{"name":"-initWithLanguage:hmiDisplayLanguage:","abstract":"

    Undocumented

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:":{"name":"-initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:","abstract":"

    Undocumented

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)language":{"name":"language","abstract":"

    The language the app wants to change to

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"

    HMI display language

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)appName":{"name":"appName","abstract":"

    Request a new app name registration

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ttsName":{"name":"ttsName","abstract":"

    Request a new TTSName registration.

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"

    Request a new app short name registration

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)vrSynonyms":{"name":"vrSynonyms","abstract":"

    Request a new VR synonyms registration

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLCarWindowViewController.html#/c:objc(cs)SDLCarWindowViewController(py)supportedOrientation":{"name":"supportedOrientation","abstract":"

    The supported interface orientation you wish to use. Defaults to MaskPortrait.

    ","parent_name":"SDLCarWindowViewController"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:":{"name":"-initWithButtonName:moduleType:","abstract":"

    Undocumented

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleType":{"name":"moduleType","abstract":"

    The module where the button should be pressed.

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonName":{"name":"buttonName","abstract":"

    The name of supported RC climate or radio button.

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"

    Indicates whether this is a LONG or SHORT button press event.

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)name":{"name":"name","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"

    A NSNumber value indicates whether the button supports a SHORT press

    ","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"

    A NSNumber value indicates whether the button supports a LONG press

    ","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"

    A NSNumber value indicates whether the button supports button down and button up

    ","parent_name":"SDLButtonCapabilities"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)parkBrakeActive":{"name":"parkBrakeActive","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStableStatus":{"name":"ignitionStableStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStatus":{"name":"ignitionStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)driverDoorAjar":{"name":"driverDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)passengerDoorAjar":{"name":"passengerDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearLeftDoorAjar":{"name":"rearLeftDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearRightDoorAjar":{"name":"rearRightDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBeltDeployed":{"name":"driverBeltDeployed","abstract":"

    References signal VedsDrvBelt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBeltDeployed":{"name":"passengerBeltDeployed","abstract":"

    References signal VedsPasBelt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBuckleBelted":{"name":"passengerBuckleBelted","abstract":"

    References signal VedsRw1PasBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBuckleBelted":{"name":"driverBuckleBelted","abstract":"

    References signal VedsRw1DrvBckl_D_Ltchd. See VehicleDataEventStatus

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow2BuckleBelted":{"name":"leftRow2BuckleBelted","abstract":"

    References signal VedsRw2lBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerChildDetected":{"name":"passengerChildDetected","abstract":"

    References signal VedsRw1PasChld_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow2BuckleBelted":{"name":"rightRow2BuckleBelted","abstract":"

    References signal VedsRw2rBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow2BuckleBelted":{"name":"middleRow2BuckleBelted","abstract":"

    References signal VedsRw2mBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow3BuckleBelted":{"name":"middleRow3BuckleBelted","abstract":"

    References signal VedsRw3mBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow3BuckleBelted":{"name":"leftRow3BuckleBelted","abstract":"

    References signal VedsRw3lBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow3BuckleBelted":{"name":"rightRow3BuckleBelted","abstract":"

    References signal VedsRw3rBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRearInflatableBelted":{"name":"leftRearInflatableBelted","abstract":"

    References signal VedsRw2lRib_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRearInflatableBelted":{"name":"rightRearInflatableBelted","abstract":"

    References signal VedsRw2rRib_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BeltDeployed":{"name":"middleRow1BeltDeployed","abstract":"

    References signal VedsRw1mBelt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BuckleBelted":{"name":"middleRow1BuckleBelted","abstract":"

    References signal VedsRw1mBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)delegate":{"name":"delegate","abstract":"

    The delegate describing when files are done playing or any errors that occur

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)playing":{"name":"playing","abstract":"

    Whether or not we are currently playing audio

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)queue":{"name":"queue","abstract":"

    The queue of audio files that will be played in sequence

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)init":{"name":"-init","abstract":"

    Init should only occur with dependencies. use initWithManager:

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)initWithManager:":{"name":"-initWithManager:","abstract":"

    Create an audio stream manager with a reference to the parent stream manager.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithFileURL:":{"name":"-pushWithFileURL:","abstract":"

    Push a new file URL onto the queue after converting it into the correct PCM format for streaming binary data. Call playNextWhenReady to start playing the next completed pushed file.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)playNextWhenReady":{"name":"-playNextWhenReady","abstract":"

    Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)stop":{"name":"-stop","abstract":"

    Stop playing the queue after the current item completes and clear the queue. If nothing is playing, the queue will be cleared.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)samplingRate":{"name":"samplingRate","abstract":"

    The sampling rate for AudioPassThru

    ","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)bitsPerSample":{"name":"bitsPerSample","abstract":"

    The sample depth in bit for AudioPassThru

    ","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)audioType":{"name":"audioType","abstract":"

    The audiotype for AudioPassThru

    ","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(im)initWithSource:keepContext:volume:equalizerSettings:":{"name":"-initWithSource:keepContext:volume:equalizerSettings:","abstract":"

    Constructs a newly allocated SDLAudioControlData object with given parameters

    ","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)source":{"name":"source","abstract":"

    @abstract In a getter response or a notification,","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)keepContext":{"name":"keepContext","abstract":"

    @abstract This parameter shall not be present in any getter responses or notifications.","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)volume":{"name":"volume","abstract":"

    @abstract Reflects the volume of audio, from 0%-100%.

    ","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)equalizerSettings":{"name":"equalizerSettings","abstract":"

    @abstract Defines the list of supported channels (band) and their current/desired settings on HMI

    ","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:":{"name":"-initWithModuleName:","abstract":"

    Constructs a newly allocated SDLAudioControlCapabilities object with audio control module name (max 100 chars)

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:","abstract":"

    Constructs a newly allocated SDLAudioControlCapabilities object with given parameters

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the audio control module.","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)sourceAvailable":{"name":"sourceAvailable","abstract":"

    @abstract Availability of the control of audio source.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)keepContextAvailable":{"name":"keepContextAvailable","abstract":"

    Availability of the keepContext parameter.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)volumeAvailable":{"name":"volumeAvailable","abstract":"

    @abstract Availability of the control of audio volume.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerAvailable":{"name":"equalizerAvailable","abstract":"

    @abstract Availability of the control of Equalizer Settings.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerMaxChannelId":{"name":"equalizerMaxChannelId","abstract":"

    @abstract Must be included if equalizerAvailable=true,","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)isTemplate":{"name":"isTemplate","abstract":"

    Describes whether or not the image is a template that can be (re)colored by the SDL HMI. To make the artwork a template, set the UIImages rendering mode to UIImageRenderingModeAlwaysTemplate. In order for templates to work successfully, the icon must be one solid color with a clear background. The artwork should be created using the PNG image format.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)imageRPC":{"name":"imageRPC","abstract":"

    The Image RPC representing this artwork. Generally for use internally, you should instead pass an artwork to a Screen Manager method.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:name:asImageFormat:":{"name":"+artworkWithImage:name:asImageFormat:","abstract":"

    Convenience helper to create an ephemeral artwork from an image.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:asImageFormat:":{"name":"+artworkWithImage:asImageFormat:","abstract":"

    Convenience helper to create an ephemeral artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image’s data which is created by hashing the data using the MD5 algorithm.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithStaticIcon:":{"name":"+artworkWithStaticIcon:","abstract":"

    Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:name:asImageFormat:":{"name":"+persistentArtworkWithImage:name:asImageFormat:","abstract":"

    Convenience helper to create a persistent artwork from an image.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:asImageFormat:":{"name":"+persistentArtworkWithImage:asImageFormat:","abstract":"

    Convenience helper to create a persistent artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image’s data which is created by hashing the data using the MD5 algorithm.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:name:persistent:asImageFormat:":{"name":"-initWithImage:name:persistent:asImageFormat:","abstract":"

    Create a file for transmission to the remote system from a UIImage.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:persistent:asImageFormat:":{"name":"-initWithImage:persistent:asImageFormat:","abstract":"

    Create a file for transmission to the remote system from a UIImage. A unique name will be assigned to the image. This name is a string representation of the image’s data which is created by hashing the data using the MD5 algorithm.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithStaticIcon:":{"name":"-initWithStaticIcon:","abstract":"

    Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.

    ","parent_name":"SDLArtwork"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(im)initWithAppServices:":{"name":"-initWithAppServices:","abstract":"

    Convenience init.

    ","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(py)appServices":{"name":"appServices","abstract":"

    An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item.

    ","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(im)initWithServiceID:serviceManifest:servicePublished:serviceActive:":{"name":"-initWithServiceID:serviceManifest:servicePublished:serviceActive:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceID":{"name":"serviceID","abstract":"

    A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceManifest":{"name":"serviceManifest","abstract":"

    Manifest for the service that this record is for.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)servicePublished":{"name":"servicePublished","abstract":"

    If true, the service is published and available. If false, the service has likely just been unpublished, and should be considered unavailable.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceActive":{"name":"serviceActive","abstract":"

    If true, the service is the active primary service of the supplied service type. It will receive all potential RPCs that are passed through to that service type. If false, it is not the primary service of the supplied type. See servicePublished for its availability.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"

    Convenience init for serviceType.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithMediaServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"

    Convenience init for a media service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithWeatherServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"

    Convenience init for a weather service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithNavigationServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"

    Convenience init for a navigation service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithServiceName:serviceType:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceName":{"name":"serviceName","abstract":"

    Unique name of this service.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceType":{"name":"serviceType","abstract":"

    The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceIcon":{"name":"serviceIcon","abstract":"

    The file name of the icon to be associated with this service. Most likely the same as the appIcon.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)allowAppConsumers":{"name":"allowAppConsumers","abstract":"

    If true, app service consumers beyond the IVI system will be able to access this service. If false, only the IVI system will be able consume the service. If not provided, it is assumed to be false.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)rpcSpecVersion":{"name":"rpcSpecVersion","abstract":"

    This is the max RPC Spec version the app service understands. This is important during the RPC passthrough functionality. If not included, it is assumed the max version of the module is acceptable.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)handledRPCs":{"name":"handledRPCs","abstract":"

    This field contains the Function IDs for the RPCs that this service intends to handle correctly. This means the service will provide meaningful responses. See FunctionID for enum equivalent values. This parameter is an integer to allow for new function IDs to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)mediaServiceManifest":{"name":"mediaServiceManifest","abstract":"

    A media service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)weatherServiceManifest":{"name":"weatherServiceManifest","abstract":"

    A weather service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)navigationServiceManifest":{"name":"navigationServiceManifest","abstract":"

    A navigation service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:":{"name":"-initWithAppServiceType:serviceId:","abstract":"

    Convenience init for service type and service id.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithMediaServiceData:serviceId:":{"name":"-initWithMediaServiceData:serviceId:","abstract":"

    Convenience init for media service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithWeatherServiceData:serviceId:":{"name":"-initWithWeatherServiceData:serviceId:","abstract":"

    Convenience init for weather service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithNavigationServiceData:serviceId:":{"name":"-initWithNavigationServiceData:serviceId:","abstract":"

    Convenience init for navigation service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:":{"name":"-initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceType":{"name":"serviceType","abstract":"

    The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceId":{"name":"serviceId","abstract":"

    A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)mediaServiceData":{"name":"mediaServiceData","abstract":"

    The media service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)weatherServiceData":{"name":"weatherServiceData","abstract":"

    The weather service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)navigationServiceData":{"name":"navigationServiceData","abstract":"

    The navigation service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdatedAppServiceRecord:":{"name":"-initWithUpdatedAppServiceRecord:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdateReason:updatedAppServiceRecord:":{"name":"-initWithUpdateReason:updatedAppServiceRecord:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updateReason":{"name":"updateReason","abstract":"

    Only included in OnSystemCapbilityUpdated. Update reason for this service record.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updatedAppServiceRecord":{"name":"updatedAppServiceRecord","abstract":"

    Service record for a specific app service provider.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(cm)currentAppInfo":{"name":"+currentAppInfo","abstract":"

    Undocumented

    ","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appDisplayName":{"name":"appDisplayName","abstract":"

    The name displayed for the mobile application on the mobile device (can differ from the app name set in the initial RAI request).

    ","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appBundleID":{"name":"appBundleID","abstract":"

    The AppBundleID of an iOS application or package name of the Android application. This supports App Launch strategies for each platform.

    ","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appVersion":{"name":"appVersion","abstract":"

    Represents the build version number of this particular mobile app.

    ","parent_name":"SDLAppInfo"},"Classes/SDLAlertResponse.html#/c:objc(cs)SDLAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"

    Undocumented

    ","parent_name":"SDLAlertResponse"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTS:softButtons:":{"name":"-initWithTTS:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTSChunks:softButtons:":{"name":"-initWithTTSChunks:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)ttsChunks":{"name":"ttsChunks","abstract":"

    An array of text chunks.

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)softButtons":{"name":"softButtons","abstract":"

    An arry of soft buttons. If omitted on supported displays, only the system defined Close SoftButton shall be displayed.

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:duration:":{"name":"-initWithAlertText1:alertText2:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:":{"name":"-initWithAlertText1:alertText2:alertText3:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:softButtons:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:playTone:":{"name":"-initWithTTS:playTone:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:playTone:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:alertText3:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:alertText3:playTone:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:playTone:":{"name":"-initWithTTSChunks:playTone:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText1":{"name":"alertText1","abstract":"

    The String to be displayed in the first field of the display during the Alert

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText2":{"name":"alertText2","abstract":"

    The String to be displayed in the second field of the display during the Alert

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText3":{"name":"alertText3","abstract":"

    the String to be displayed in the third field of the display during the Alert","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"

    An array which, taken together, specify what is to be spoken to the user

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)duration":{"name":"duration","abstract":"

    The duration of the displayed portion of the alert, in milliseconds.

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)playTone":{"name":"playTone","abstract":"

    Whether the alert tone should be played before the TTS (if any) is spoken.

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)progressIndicator":{"name":"progressIndicator","abstract":"

    If supported on the given platform, the alert GUI will include some sort of animation indicating that loading of a feature is progressing. e.g. a spinning wheel or hourglass, etc.

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)softButtons":{"name":"softButtons","abstract":"

    App defined SoftButtons.

    ","parent_name":"SDLAlert"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverAirbagDeployed":{"name":"driverAirbagDeployed","abstract":"

    References signal VedsDrvBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverSideAirbagDeployed":{"name":"driverSideAirbagDeployed","abstract":"

    References signal VedsDrvSideBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverCurtainAirbagDeployed":{"name":"driverCurtainAirbagDeployed","abstract":"

    References signal VedsDrvCrtnBag_D_Ltchd. See VehicleDataEventStatus

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerAirbagDeployed":{"name":"passengerAirbagDeployed","abstract":"

    References signal VedsPasBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerCurtainAirbagDeployed":{"name":"passengerCurtainAirbagDeployed","abstract":"

    References signal VedsPasCrtnBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverKneeAirbagDeployed":{"name":"driverKneeAirbagDeployed","abstract":"

    References signal VedsKneeDrvBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerSideAirbagDeployed":{"name":"passengerSideAirbagDeployed","abstract":"

    References signal VedsPasSideBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerKneeAirbagDeployed":{"name":"passengerKneeAirbagDeployed","abstract":"

    References signal VedsKneePasBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:":{"name":"-initWithId:menuName:","abstract":"

    Undocumented

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:position:":{"name":"-initWithId:menuName:position:","abstract":"

    Undocumented

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:menuIcon:position:":{"name":"-initWithId:menuName:menuIcon:position:","abstract":"

    Undocumented

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuID":{"name":"menuID","abstract":"

    a Menu ID that identifies a sub menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)position":{"name":"position","abstract":"

    a position of menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuName":{"name":"menuName","abstract":"

    a menuName which is displayed representing this submenu item","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuIcon":{"name":"menuIcon","abstract":"

    An image that is displayed alongside this submenu item

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"

    Constructs a SDLAddCommand with a handler callback when an event occurs.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:handler:":{"name":"-initWithId:vrCommands:handler:","abstract":"

    Convenience init for creating a voice command menu item.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:handler:":{"name":"-initWithId:vrCommands:menuName:handler:","abstract":"

    Convenience init for creating a menu item with text.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:handler:","abstract":"

    Convenience init for creating a menu item with text and a custom icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:","abstract":"

    Convenience init for creating a menu item with text and a custom icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:icon:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:icon:handler:","abstract":"

    Convenience init for creating a menu item with text and a custom icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)handler":{"name":"handler","abstract":"

    A handler that will let you know when the button you created is subscribed.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdID":{"name":"cmdID","abstract":"

    A unique id that identifies the command.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)menuParams":{"name":"menuParams","abstract":"

    A SDLMenuParams pointer which defines the command and how it is added to the command menu.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)vrCommands":{"name":"vrCommands","abstract":"

    An array of strings to be used as VR synonyms for this command.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdIcon":{"name":"cmdIcon","abstract":"

    Image struct containing a static or dynamic icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html":{"name":"SDLAddCommand","abstract":"

    This class will add a command to the application’s Command Menu

    "},"Classes.html#/c:objc(cs)SDLAddCommandResponse":{"name":"SDLAddCommandResponse","abstract":"

    Response to SDLAddCommand

    "},"Classes/SDLAddSubMenu.html":{"name":"SDLAddSubMenu","abstract":"

    Add a SDLSubMenu to the Command Menu"},"Classes.html#/c:objc(cs)SDLAddSubMenuResponse":{"name":"SDLAddSubMenuResponse","abstract":"

    Response to SDLAddSubMenu

    "},"Classes/SDLAirbagStatus.html":{"name":"SDLAirbagStatus","abstract":"

    A vehicle data status struct for airbags

    "},"Classes/SDLAlert.html":{"name":"SDLAlert","abstract":"

    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.

    "},"Classes/SDLAlertManeuver.html":{"name":"SDLAlertManeuver","abstract":"

    Shows a SDLShowConstantTBT message with an optional voice command. This message is shown as an overlay over the display’s base screen.

    "},"Classes.html#/c:objc(cs)SDLAlertManeuverResponse":{"name":"SDLAlertManeuverResponse","abstract":"

    Response to SDLAlertManeuver

    "},"Classes/SDLAlertResponse.html":{"name":"SDLAlertResponse","abstract":"

    Response to SDLAlert

    "},"Classes/SDLAppInfo.html":{"name":"SDLAppInfo","abstract":"

    A struct used in register app interface. Contains detailed information about the registered application.

    "},"Classes/SDLAppServiceCapability.html":{"name":"SDLAppServiceCapability","abstract":"

    Undocumented

    "},"Classes/SDLAppServiceData.html":{"name":"SDLAppServiceData","abstract":"

    Undocumented

    "},"Classes/SDLAppServiceManifest.html":{"name":"SDLAppServiceManifest","abstract":"

    This manifest contains all the information necessary for the service to be published, activated, and allow consumers to interact with it

    "},"Classes/SDLAppServiceRecord.html":{"name":"SDLAppServiceRecord","abstract":"

    Undocumented

    "},"Classes/SDLAppServicesCapabilities.html":{"name":"SDLAppServicesCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLArtwork.html":{"name":"SDLArtwork","abstract":"

    Undocumented

    "},"Classes/SDLAudioControlCapabilities.html":{"name":"SDLAudioControlCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLAudioControlData.html":{"name":"SDLAudioControlData","abstract":"

    Undocumented

    "},"Classes/SDLAudioPassThruCapabilities.html":{"name":"SDLAudioPassThruCapabilities","abstract":"

    Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}

    "},"Classes/SDLAudioStreamManager.html":{"name":"SDLAudioStreamManager","abstract":"

    Undocumented

    "},"Classes/SDLBeltStatus.html":{"name":"SDLBeltStatus","abstract":"

    Vehicle data struct for the seat belt status

    "},"Classes/SDLBodyInformation.html":{"name":"SDLBodyInformation","abstract":"

    The body information including power modes.

    "},"Classes/SDLButtonCapabilities.html":{"name":"SDLButtonCapabilities","abstract":"

    Provides information about the capabilities of a SDL HMI button.

    "},"Classes/SDLButtonPress.html":{"name":"SDLButtonPress","abstract":"

    This RPC allows a remote control type mobile application to simulate a hardware button press event.

    "},"Classes.html#/c:objc(cs)SDLButtonPressResponse":{"name":"SDLButtonPressResponse","abstract":"

    Response to SDLButtonPress

    "},"Classes/SDLCarWindowViewController.html":{"name":"SDLCarWindowViewController","abstract":"

    Note that if this is embedded in a UINavigationController and UITabBarController, it will not lock orientation. You must lock your container controller to a specific orientation.

    "},"Classes/SDLChangeRegistration.html":{"name":"SDLChangeRegistration","abstract":"

    If the app recognizes during the app registration that the SDL HMI language (voice/TTS and/or display) does not match the app language, the app will be able (but does not need) to change this registration with changeRegistration prior to app being brought into focus.

    "},"Classes.html#/c:objc(cs)SDLChangeRegistrationResponse":{"name":"SDLChangeRegistrationResponse","abstract":"

    Response to SDLChangeRegistrations

    "},"Classes/SDLChoice.html":{"name":"SDLChoice","abstract":"

    A choice is an option which a user can select either via the menu or via voice recognition (VR) during an application initiated interaction.

    "},"Classes/SDLChoiceCell.html":{"name":"SDLChoiceCell","abstract":"

    Undocumented

    "},"Classes/SDLChoiceSet.html":{"name":"SDLChoiceSet","abstract":"

    Undocumented

    "},"Classes/SDLClimateControlCapabilities.html":{"name":"SDLClimateControlCapabilities","abstract":"

    Contains information about a climate control module’s capabilities.

    "},"Classes/SDLClimateControlData.html":{"name":"SDLClimateControlData","abstract":"

    The current information for the Climate Remote Control Module

    "},"Classes/SDLCloudAppProperties.html":{"name":"SDLCloudAppProperties","abstract":"

    Undocumented

    "},"Classes/SDLClusterModeStatus.html":{"name":"SDLClusterModeStatus","abstract":"

    A vehicle data struct for the cluster mode and power status

    "},"Classes/SDLConfiguration.html":{"name":"SDLConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLCreateInteractionChoiceSet.html":{"name":"SDLCreateInteractionChoiceSet","abstract":"

    Creates a Choice Set which can be used in subsequent SDLPerformInteraction Operations.

    "},"Classes.html#/c:objc(cs)SDLCreateInteractionChoiceSetResponse":{"name":"SDLCreateInteractionChoiceSetResponse","abstract":"

    Response to SDLCreateInteractionChoiceSet has been called

    "},"Classes/SDLDIDResult.html":{"name":"SDLDIDResult","abstract":"

    A vehicle data struct

    "},"Classes/SDLDateTime.html":{"name":"SDLDateTime","abstract":"

    A struct referenced in SendLocation for an absolute date

    "},"Classes/SDLDeleteCommand.html":{"name":"SDLDeleteCommand","abstract":"

    Removes a command from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteCommandResponse":{"name":"SDLDeleteCommandResponse","abstract":"

    Response to SDLDeleteCommand

    "},"Classes/SDLDeleteFile.html":{"name":"SDLDeleteFile","abstract":"

    Used to delete a file resident on the SDL module in the app’s local cache."},"Classes/SDLDeleteFileResponse.html":{"name":"SDLDeleteFileResponse","abstract":"

    Response to SDLDeleteFile

    "},"Classes/SDLDeleteInteractionChoiceSet.html":{"name":"SDLDeleteInteractionChoiceSet","abstract":"

    Deletes an existing Choice Set identified by the parameter"},"Classes.html#/c:objc(cs)SDLDeleteInteractionChoiceSetResponse":{"name":"SDLDeleteInteractionChoiceSetResponse","abstract":"

    SDLDeleteInteractionChoiceSetResponse is sent, when SDLDeleteInteractionChoiceSet has been called

    "},"Classes/SDLDeleteSubMenu.html":{"name":"SDLDeleteSubMenu","abstract":"

    Deletes a submenu from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteSubMenuResponse":{"name":"SDLDeleteSubMenuResponse","abstract":"

    Response to SDLDeleteSubMenu

    "},"Classes/SDLDeviceInfo.html":{"name":"SDLDeviceInfo","abstract":"

    Various information about connecting device. Referenced in RegisterAppInterface

    "},"Classes/SDLDeviceStatus.html":{"name":"SDLDeviceStatus","abstract":"

    Describes the status related to a connected mobile device or SDL and if or how it is represented in the vehicle.

    "},"Classes/SDLDiagnosticMessage.html":{"name":"SDLDiagnosticMessage","abstract":"

    Non periodic vehicle diagnostic request

    "},"Classes/SDLDiagnosticMessageResponse.html":{"name":"SDLDiagnosticMessageResponse","abstract":"

    Response to SDLDiagnosticMessage

    "},"Classes/SDLDialNumber.html":{"name":"SDLDialNumber","abstract":"

    This RPC is used to tell the head unit to use bluetooth to dial a phone number using the phone.

    "},"Classes.html#/c:objc(cs)SDLDialNumberResponse":{"name":"SDLDialNumberResponse","abstract":"

    The response to SDLDialNumber

    "},"Classes/SDLDisplayCapabilities.html":{"name":"SDLDisplayCapabilities","abstract":"

    Contains information about the display for the SDL system to which the application is currently connected.

    "},"Classes/SDLECallInfo.html":{"name":"SDLECallInfo","abstract":"

    A vehicle data struct for emergency call information

    "},"Classes/SDLEmergencyEvent.html":{"name":"SDLEmergencyEvent","abstract":"

    A vehicle data struct for an emergency event

    "},"Classes/SDLEncodedSyncPData.html":{"name":"SDLEncodedSyncPData","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLEncodedSyncPDataResponse":{"name":"SDLEncodedSyncPDataResponse","abstract":"

    The response to SDLEncodedSyncPData

    "},"Classes.html#/c:objc(cs)SDLEndAudioPassThru":{"name":"SDLEndAudioPassThru","abstract":"

    When this request is invoked, the audio capture stops

    "},"Classes.html#/c:objc(cs)SDLEndAudioPassThruResponse":{"name":"SDLEndAudioPassThruResponse","abstract":"

    Response to SDLEndAudioPassThru

    "},"Classes/SDLEqualizerSettings.html":{"name":"SDLEqualizerSettings","abstract":"

    Defines the each Equalizer channel settings.

    "},"Classes/SDLFile.html":{"name":"SDLFile","abstract":"

    Undocumented

    "},"Classes/SDLFileManager.html":{"name":"SDLFileManager","abstract":"

    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.

    "},"Classes/SDLFileManagerConfiguration.html":{"name":"SDLFileManagerConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLFuelRange.html":{"name":"SDLFuelRange","abstract":"

    Describes the distance a vehicle can travel with the current level of fuel.

    "},"Classes/SDLFunctionID.html":{"name":"SDLFunctionID","abstract":"

    Undocumented

    "},"Classes/SDLGPSData.html":{"name":"SDLGPSData","abstract":"

    Describes the GPS data. Not all data will be available on all carlines.

    "},"Classes.html#/c:objc(cs)SDLGenericResponse":{"name":"SDLGenericResponse","abstract":"

    Generic Response is sent when the name of a received request is unknown. It is only used in case of an error. It will have an INVALID_DATA result code.

    "},"Classes/SDLGetAppServiceData.html":{"name":"SDLGetAppServiceData","abstract":"

    This request asks the module for current data related to the specific service. It also includes an option to subscribe to that service for future updates.

    "},"Classes/SDLGetAppServiceDataResponse.html":{"name":"SDLGetAppServiceDataResponse","abstract":"

    Undocumented

    "},"Classes/SDLGetCloudAppProperties.html":{"name":"SDLGetCloudAppProperties","abstract":"

    RPC used to get the current properties of a cloud application.

    "},"Classes/SDLGetCloudAppPropertiesResponse.html":{"name":"SDLGetCloudAppPropertiesResponse","abstract":"

    The response to GetCloudAppProperties

    "},"Classes/SDLGetDTCs.html":{"name":"SDLGetDTCs","abstract":"

    This RPC allows to request diagnostic module trouble codes from a certain"},"Classes/SDLGetDTCsResponse.html":{"name":"SDLGetDTCsResponse","abstract":"

    Response to SDLGetDTCs

    "},"Classes/SDLGetFile.html":{"name":"SDLGetFile","abstract":"

    This request is sent to the module to retrieve a file.

    "},"Classes/SDLGetFileResponse.html":{"name":"SDLGetFileResponse","abstract":"

    Undocumented

    "},"Classes/SDLGetInteriorVehicleData.html":{"name":"SDLGetInteriorVehicleData","abstract":"

    Reads the current status value of specified remote control module (type)."},"Classes/SDLGetInteriorVehicleDataResponse.html":{"name":"SDLGetInteriorVehicleDataResponse","abstract":"

    A response to SDLGetInteriorVehicleData

    "},"Classes/SDLGetSystemCapability.html":{"name":"SDLGetSystemCapability","abstract":"

    Undocumented

    "},"Classes/SDLGetSystemCapabilityResponse.html":{"name":"SDLGetSystemCapabilityResponse","abstract":"

    Response to SDLGetSystemCapability

    "},"Classes/SDLGetVehicleData.html":{"name":"SDLGetVehicleData","abstract":"

    Requests current values of specific published vehicle data items.

    "},"Classes/SDLGetVehicleDataResponse.html":{"name":"SDLGetVehicleDataResponse","abstract":"

    Response to SDLGetVehicleData

    "},"Classes/SDLGetWayPoints.html":{"name":"SDLGetWayPoints","abstract":"

    Undocumented

    "},"Classes/SDLGetWayPointsResponse.html":{"name":"SDLGetWayPointsResponse","abstract":"

    Response to SDLGetWayPoints

    "},"Classes/SDLHMICapabilities.html":{"name":"SDLHMICapabilities","abstract":"

    Undocumented

    "},"Classes/SDLHMIPermissions.html":{"name":"SDLHMIPermissions","abstract":"

    Defining sets of HMI levels, which are permitted or prohibited for a given RPC.

    "},"Classes/SDLHMISettingsControlCapabilities.html":{"name":"SDLHMISettingsControlCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLHMISettingsControlData.html":{"name":"SDLHMISettingsControlData","abstract":"

    Corresponds to HMI_SETTINGS ModuleType

    "},"Classes/SDLHapticRect.html":{"name":"SDLHapticRect","abstract":"

    Defines spatial for each user control object for video streaming application

    "},"Classes/SDLHeadLampStatus.html":{"name":"SDLHeadLampStatus","abstract":"

    Vehicle data struct for status of head lamps

    "},"Classes/SDLImage.html":{"name":"SDLImage","abstract":"

    Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.

    "},"Classes/SDLImageField.html":{"name":"SDLImageField","abstract":"

    A struct used in DisplayCapabilities describing the capability of an image field

    "},"Classes/SDLImageResolution.html":{"name":"SDLImageResolution","abstract":"

    The resolution of an image

    "},"Classes/SDLKeyboardProperties.html":{"name":"SDLKeyboardProperties","abstract":"

    Configuration of on-screen keyboard (if available)

    "},"Classes/SDLLifecycleConfiguration.html":{"name":"SDLLifecycleConfiguration","abstract":"

    Configuration options for SDLManager

    "},"Classes/SDLLifecycleConfigurationUpdate.html":{"name":"SDLLifecycleConfigurationUpdate","abstract":"

    Configuration update options for SDLManager. This class can be used to update the lifecycle configuration in"},"Classes/SDLLightCapabilities.html":{"name":"SDLLightCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLLightControlCapabilities.html":{"name":"SDLLightControlCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLLightControlData.html":{"name":"SDLLightControlData","abstract":"

    Undocumented

    "},"Classes/SDLLightState.html":{"name":"SDLLightState","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLListFiles":{"name":"SDLListFiles","abstract":"

    Requests the current list of resident filenames for the registered app. Not"},"Classes/SDLListFilesResponse.html":{"name":"SDLListFilesResponse","abstract":"

    Response to SDLListFiles

    "},"Classes/SDLLocationCoordinate.html":{"name":"SDLLocationCoordinate","abstract":"

    Describes a coordinate on earth

    "},"Classes/SDLLocationDetails.html":{"name":"SDLLocationDetails","abstract":"

    Describes a location, including its coordinate, name, etc. Used in WayPoints.

    "},"Classes/SDLLockScreenConfiguration.html":{"name":"SDLLockScreenConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLLockScreenViewController.html":{"name":"SDLLockScreenViewController","abstract":"

    Undocumented

    "},"Classes/SDLLogConfiguration.html":{"name":"SDLLogConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLLogFileModule.html":{"name":"SDLLogFileModule","abstract":"

    Undocumented

    "},"Classes/SDLLogFilter.html":{"name":"SDLLogFilter","abstract":"

    Undocumented

    "},"Classes/SDLLogManager.html":{"name":"SDLLogManager","abstract":"

    This is the central manager of logging. A developer should not have to interact with this class, it is exclusively used internally.

    "},"Classes.html#/c:objc(cs)SDLLogTargetAppleSystemLog":{"name":"SDLLogTargetAppleSystemLog","abstract":"

    The Apple System Log target is an iOS 2.0+ compatible log target that logs to both the Console and to the System Log.

    "},"Classes.html#/c:objc(cs)SDLLogTargetFile":{"name":"SDLLogTargetFile","abstract":"

    The File log will log to a text file on the iPhone in Documents/smartdevicelink/log/#appName##datetime##.log. It will log up to 3 logs which will rollover.

    "},"Classes.html#/c:objc(cs)SDLLogTargetOSLog":{"name":"SDLLogTargetOSLog","abstract":"

    OS_LOG is an iOS 10+ only logging system that logs to the Console and the Apple system console. This is an improved replacement for Apple SysLog (SDLLogTargetAppleSystemLog).

    "},"Classes/SDLManager.html":{"name":"SDLManager","abstract":"

    Undocumented

    "},"Classes/SDLMassageCushionFirmness.html":{"name":"SDLMassageCushionFirmness","abstract":"

    The intensity or firmness of a cushion.

    "},"Classes/SDLMassageModeData.html":{"name":"SDLMassageModeData","abstract":"

    Specify the mode of a massage zone.

    "},"Classes/SDLMediaServiceData.html":{"name":"SDLMediaServiceData","abstract":"

    This data is related to what a media service should provide.

    "},"Classes.html#/c:objc(cs)SDLMediaServiceManifest":{"name":"SDLMediaServiceManifest","abstract":"

    A media service manifest.

    "},"Classes/SDLMenuCell.html":{"name":"SDLMenuCell","abstract":"

    Undocumented

    "},"Classes/SDLMenuParams.html":{"name":"SDLMenuParams","abstract":"

    Used when adding a sub menu to an application menu or existing sub menu.

    "},"Classes/SDLMetadataTags.html":{"name":"SDLMetadataTags","abstract":"

    Undocumented

    "},"Classes/SDLModuleData.html":{"name":"SDLModuleData","abstract":"

    Describes a remote control module’s data

    "},"Classes/SDLMyKey.html":{"name":"SDLMyKey","abstract":"

    Vehicle Data struct

    "},"Classes/SDLNavigationCapability.html":{"name":"SDLNavigationCapability","abstract":"

    Extended capabilities for an onboard navigation system

    "},"Classes/SDLNavigationInstruction.html":{"name":"SDLNavigationInstruction","abstract":"

    Undocumented

    "},"Classes/SDLNavigationServiceData.html":{"name":"SDLNavigationServiceData","abstract":"

    Undocumented

    "},"Classes/SDLNavigationServiceManifest.html":{"name":"SDLNavigationServiceManifest","abstract":"

    Undocumented

    "},"Classes/SDLNotificationConstants.html":{"name":"SDLNotificationConstants","abstract":"

    Undocumented

    "},"Classes/SDLOasisAddress.html":{"name":"SDLOasisAddress","abstract":"

    Struct used in SendLocation describing an address

    "},"Classes/SDLOnAppInterfaceUnregistered.html":{"name":"SDLOnAppInterfaceUnregistered","abstract":"

    Notifies an application that its interface registration has been terminated. This means that all SDL resources associated with the application are discarded, including the Command Menu, Choice Sets, button subscriptions, etc.

    "},"Classes/SDLOnAppServiceData.html":{"name":"SDLOnAppServiceData","abstract":"

    This notification includes the data that is updated from the specific service.

    "},"Classes.html#/c:objc(cs)SDLOnAudioPassThru":{"name":"SDLOnAudioPassThru","abstract":"

    Binary data is in binary part of hybrid msg.

    "},"Classes/SDLOnButtonEvent.html":{"name":"SDLOnButtonEvent","abstract":"

    Notifies application that user has depressed or released a button to which"},"Classes/SDLOnButtonPress.html":{"name":"SDLOnButtonPress","abstract":"

    Notifies application of button press events for buttons to which the application is subscribed. SDL supports two button press events defined as follows:

    "},"Classes/SDLOnCommand.html":{"name":"SDLOnCommand","abstract":"

    This is called when a command was selected via VR after pressing the PTT button, or selected from the menu after pressing the MENU button.

    "},"Classes/SDLOnDriverDistraction.html":{"name":"SDLOnDriverDistraction","abstract":"

    Notifies the application of the current driver distraction state (whether driver distraction rules are in effect, or not).

    "},"Classes/SDLOnEncodedSyncPData.html":{"name":"SDLOnEncodedSyncPData","abstract":"

    Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED ***

    "},"Classes/SDLOnHMIStatus.html":{"name":"SDLOnHMIStatus"},"Classes/SDLOnHashChange.html":{"name":"SDLOnHashChange","abstract":"

    Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of all persisted app data.

    "},"Classes/SDLOnInteriorVehicleData.html":{"name":"SDLOnInteriorVehicleData","abstract":"

    Notifications when subscribed vehicle data changes.

    "},"Classes/SDLOnKeyboardInput.html":{"name":"SDLOnKeyboardInput","abstract":"

    Sent when a keyboard presented by a PerformInteraction has a keyboard input.

    "},"Classes/SDLOnLanguageChange.html":{"name":"SDLOnLanguageChange","abstract":"

    Provides information to what language the SDL HMI language was changed

    "},"Classes/SDLOnLockScreenStatus.html":{"name":"SDLOnLockScreenStatus","abstract":"

    To help prevent driver distraction, any SmartDeviceLink application is required to implement a lockscreen that must be enforced while the application is active on the system while the vehicle is in motion.

    "},"Classes/SDLOnPermissionsChange.html":{"name":"SDLOnPermissionsChange","abstract":"

    Provides update to app of which sets of functions are available

    "},"Classes/SDLOnRCStatus.html":{"name":"SDLOnRCStatus","abstract":"

    OnRCStatus notifications to all registered mobile applications and the HMI whenever"},"Classes/SDLOnSyncPData.html":{"name":"SDLOnSyncPData","abstract":"

    DEPRECATED

    "},"Classes/SDLOnSystemCapabilityUpdated.html":{"name":"SDLOnSystemCapabilityUpdated","abstract":"

    A notification to inform the connected device that a specific system capability has changed.

    "},"Classes/SDLOnSystemRequest.html":{"name":"SDLOnSystemRequest","abstract":"

    An asynchronous request from the system for specific data from the device or the cloud or response to a request from the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication request responses)

    "},"Classes/SDLOnTBTClientState.html":{"name":"SDLOnTBTClientState","abstract":"

    Provides applications with notifications specific to the current TBT client status on the module

    "},"Classes/SDLOnTouchEvent.html":{"name":"SDLOnTouchEvent","abstract":"

    Notifies about touch events on the screen’s prescribed area during video streaming

    "},"Classes/SDLOnVehicleData.html":{"name":"SDLOnVehicleData","abstract":"

    Callback for the periodic and non periodic vehicle data read function.

    "},"Classes/SDLOnWayPointChange.html":{"name":"SDLOnWayPointChange","abstract":"

    Notification which provides the entire LocationDetails when there is a change to any waypoints or destination.

    "},"Classes/SDLParameterPermissions.html":{"name":"SDLParameterPermissions","abstract":"

    Defining sets of parameters, which are permitted or prohibited for a given RPC.

    "},"Classes/SDLPerformAppServiceInteraction.html":{"name":"SDLPerformAppServiceInteraction","abstract":"

    App service providers will likely have different actions exposed to the module and app service consumers. It will be difficult to standardize these actions by RPC versions and can easily become stale. Therefore, we introduce a best-effort attempt to take actions on a service.

    "},"Classes/SDLPerformAppServiceInteractionResponse.html":{"name":"SDLPerformAppServiceInteractionResponse","abstract":"

    Undocumented

    "},"Classes/SDLPerformAudioPassThru.html":{"name":"SDLPerformAudioPassThru","abstract":"

    This will open an audio pass thru session. By doing so the app can receive"},"Classes.html#/c:objc(cs)SDLPerformAudioPassThruResponse":{"name":"SDLPerformAudioPassThruResponse","abstract":"

    Response to SDLPerformAudioPassThru

    "},"Classes/SDLPerformInteraction.html":{"name":"SDLPerformInteraction","abstract":"

    Performs an application-initiated interaction in which the user can select a"},"Classes/SDLPerformInteractionResponse.html":{"name":"SDLPerformInteractionResponse","abstract":"

    PerformInteraction Response is sent, when SDLPerformInteraction has been called

    "},"Classes/SDLPermissionItem.html":{"name":"SDLPermissionItem","abstract":"

    Undocumented

    "},"Classes/SDLPermissionManager.html":{"name":"SDLPermissionManager","abstract":"

    Undocumented

    "},"Classes/SDLPhoneCapability.html":{"name":"SDLPhoneCapability","abstract":"

    Extended capabilities of the module’s phone feature

    "},"Classes/SDLPinchGesture.html":{"name":"SDLPinchGesture","abstract":"

    Undocumented

    "},"Classes/SDLPresetBankCapabilities.html":{"name":"SDLPresetBankCapabilities","abstract":"

    Contains information about on-screen preset capabilities.

    "},"Classes/SDLPublishAppService.html":{"name":"SDLPublishAppService","abstract":"

    Registers a service offered by this app on the module.

    "},"Classes/SDLPublishAppServiceResponse.html":{"name":"SDLPublishAppServiceResponse","abstract":"

    Undocumented

    "},"Classes/SDLPutFile.html":{"name":"SDLPutFile","abstract":"

    Used to push a binary data onto the SDL module from a mobile device, such as icons and album art.

    "},"Classes/SDLPutFileResponse.html":{"name":"SDLPutFileResponse","abstract":"

    Response to SDLPutFile

    "},"Classes/SDLRDSData.html":{"name":"SDLRDSData","abstract":"

    Include the data defined in Radio Data System, which is a communications protocol standard for embedding small amounts of digital information in conventional FM radio broadcasts.

    "},"Classes/SDLRGBColor.html":{"name":"SDLRGBColor","abstract":"

    Undocumented

    "},"Classes/SDLRPCMessage.html":{"name":"SDLRPCMessage","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLRPCNotification":{"name":"SDLRPCNotification","abstract":"

    An RPC sent from the head unit to the app about some data change, such as a button was pressed

    "},"Classes/SDLRPCNotificationNotification.html":{"name":"SDLRPCNotificationNotification","abstract":"

    An NSNotification object that makes retrieving internal SDLRPCNotification data easier

    "},"Classes/SDLRPCRequest.html":{"name":"SDLRPCRequest","abstract":"

    Undocumented

    "},"Classes/SDLRPCRequestNotification.html":{"name":"SDLRPCRequestNotification","abstract":"

    A NSNotification object that makes retrieving internal SDLRPCRequest data easier

    "},"Classes/SDLRPCResponse.html":{"name":"SDLRPCResponse","abstract":"

    Undocumented

    "},"Classes/SDLRPCResponseNotification.html":{"name":"SDLRPCResponseNotification","abstract":"

    A NSNotification object that makes retrieving internal SDLRPCResponse data easier

    "},"Classes/SDLRPCStruct.html":{"name":"SDLRPCStruct","abstract":"

    Undocumented

    "},"Classes/SDLRadioControlCapabilities.html":{"name":"SDLRadioControlCapabilities","abstract":"

    Contains information about a radio control module’s capabilities.

    "},"Classes/SDLRadioControlData.html":{"name":"SDLRadioControlData","abstract":"

    Include information (both read-only and changeable data) about a remote control radio module.

    "},"Classes/SDLReadDID.html":{"name":"SDLReadDID","abstract":"

    Non periodic vehicle data read request. This is an RPC to get diagnostics"},"Classes/SDLReadDIDResponse.html":{"name":"SDLReadDIDResponse","abstract":"

    A response to ReadDID

    "},"Classes/SDLRectangle.html":{"name":"SDLRectangle","abstract":"

    A struct describing a rectangle

    "},"Classes/SDLRegisterAppInterface.html":{"name":"SDLRegisterAppInterface","abstract":"

    Registers the application’s interface with SDL. The RegisterAppInterface RPC declares the properties of the app, including the messaging interface version, the app name, etc. The mobile application must establish its interface registration with SDL before any other interaction with SDL can take place. The registration lasts until it is terminated either by the application calling the SDLUnregisterAppInterface method, or by SDL sending an SDLOnAppInterfaceUnregistered notification, or by loss of the underlying transport connection, or closing of the underlying message transmission protocol RPC session.

    "},"Classes/SDLRegisterAppInterfaceResponse.html":{"name":"SDLRegisterAppInterfaceResponse","abstract":"

    Response to SDLRegisterAppInterface

    "},"Classes/SDLRemoteControlCapabilities.html":{"name":"SDLRemoteControlCapabilities","abstract":"

    Capabilities of the remote control feature

    "},"Classes/SDLResetGlobalProperties.html":{"name":"SDLResetGlobalProperties","abstract":"

    Resets the passed global properties to their default values as defined by"},"Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse":{"name":"SDLResetGlobalPropertiesResponse","abstract":"

    Response to ResetGlobalProperties

    "},"Classes/SDLSISData.html":{"name":"SDLSISData","abstract":"

    HD radio Station Information Service (SIS) data.

    "},"Classes/SDLScreenManager.html":{"name":"SDLScreenManager","abstract":"

    Undocumented

    "},"Classes/SDLScreenParams.html":{"name":"SDLScreenParams","abstract":"

    A struct in DisplayCapabilities describing parameters related to a video / touch input area

    "},"Classes/SDLScrollableMessage.html":{"name":"SDLScrollableMessage","abstract":"

    Creates a full screen overlay containing a large block of formatted text that"},"Classes.html#/c:objc(cs)SDLScrollableMessageResponse":{"name":"SDLScrollableMessageResponse","abstract":"

    Response to SDLScrollableMessage

    "},"Classes/SDLSeatControlCapabilities.html":{"name":"SDLSeatControlCapabilities","abstract":"

    Include information about a seat control capabilities.

    "},"Classes/SDLSeatControlData.html":{"name":"SDLSeatControlData","abstract":"

    Seat control data corresponds to SEAT ModuleType.

    "},"Classes/SDLSeatMemoryAction.html":{"name":"SDLSeatMemoryAction","abstract":"

    Specify the action to be performed.

    "},"Classes/SDLSendHapticData.html":{"name":"SDLSendHapticData","abstract":"

    Sends the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by the HMI to determine how and when haptic events should occur.

    "},"Classes.html#/c:objc(cs)SDLSendHapticDataResponse":{"name":"SDLSendHapticDataResponse","abstract":"

    Response to SDLSendHapticData

    "},"Classes/SDLSendLocation.html":{"name":"SDLSendLocation","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLSendLocationResponse":{"name":"SDLSendLocationResponse","abstract":"

    Response to SDLSendLocation

    "},"Classes/SDLSetAppIcon.html":{"name":"SDLSetAppIcon","abstract":"

    Used to set existing local file on SDL as the app’s icon. Not supported on"},"Classes.html#/c:objc(cs)SDLSetAppIconResponse":{"name":"SDLSetAppIconResponse","abstract":"

    Response to SDLSetAppIcon

    "},"Classes/SDLSetCloudAppProperties.html":{"name":"SDLSetCloudAppProperties","abstract":"

    RPC used to enable/disable a cloud application and set authentication data

    "},"Classes.html#/c:objc(cs)SDLSetCloudAppPropertiesResponse":{"name":"SDLSetCloudAppPropertiesResponse","abstract":"

    The response to SetCloudAppProperties

    "},"Classes/SDLSetDisplayLayout.html":{"name":"SDLSetDisplayLayout","abstract":"

    Used to set an alternate display layout. If not sent, default screen for"},"Classes/SDLSetDisplayLayoutResponse.html":{"name":"SDLSetDisplayLayoutResponse","abstract":"

    Response to SDLSetDisplayLayout

    "},"Classes/SDLSetGlobalProperties.html":{"name":"SDLSetGlobalProperties","abstract":"

    Sets global property values

    "},"Classes.html#/c:objc(cs)SDLSetGlobalPropertiesResponse":{"name":"SDLSetGlobalPropertiesResponse","abstract":"

    Response to SDLSetGlobalProperties

    "},"Classes/SDLSetInteriorVehicleData.html":{"name":"SDLSetInteriorVehicleData","abstract":"

    This RPC allows a remote control type mobile application to"},"Classes/SDLSetInteriorVehicleDataResponse.html":{"name":"SDLSetInteriorVehicleDataResponse","abstract":"

    Response to SDLSetInteriorVehicleData

    "},"Classes/SDLSetMediaClockTimer.html":{"name":"SDLSetMediaClockTimer","abstract":"

    Sets the media clock/timer value and the update method (e.g.count-up,"},"Classes.html#/c:objc(cs)SDLSetMediaClockTimerResponse":{"name":"SDLSetMediaClockTimerResponse","abstract":"

    Response to SDLSetMediaClockTimer

    "},"Classes/SDLShow.html":{"name":"SDLShow","abstract":"

    Updates the application’s display text area, regardless of whether or not"},"Classes/SDLShowConstantTBT.html":{"name":"SDLShowConstantTBT","abstract":"

    This RPC is used to update the user with navigation information for the constantly shown screen (base screen), but also for the alert maneuver screen.

    "},"Classes.html#/c:objc(cs)SDLShowConstantTBTResponse":{"name":"SDLShowConstantTBTResponse","abstract":"

    Response to SDLShowConstantTBT

    "},"Classes.html#/c:objc(cs)SDLShowResponse":{"name":"SDLShowResponse","abstract":"

    Response to SDLShow

    "},"Classes/SDLSingleTireStatus.html":{"name":"SDLSingleTireStatus","abstract":"

    Tire pressure status of a single tire.

    "},"Classes/SDLSlider.html":{"name":"SDLSlider","abstract":"

    Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider

    "},"Classes/SDLSliderResponse.html":{"name":"SDLSliderResponse","abstract":"

    Response to SDLSlider

    "},"Classes/SDLSoftButton.html":{"name":"SDLSoftButton","abstract":"

    Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts

    "},"Classes/SDLSoftButtonCapabilities.html":{"name":"SDLSoftButtonCapabilities","abstract":"

    Contains information about a SoftButton’s capabilities.

    "},"Classes/SDLSoftButtonObject.html":{"name":"SDLSoftButtonObject","abstract":"

    A soft button wrapper object that is capable of storing and switching between states

    "},"Classes/SDLSoftButtonState.html":{"name":"SDLSoftButtonState","abstract":"

    Undocumented

    "},"Classes/SDLSpeak.html":{"name":"SDLSpeak","abstract":"

    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.

    "},"Classes.html#/c:objc(cs)SDLSpeakResponse":{"name":"SDLSpeakResponse","abstract":"

    Response to SDLSpeak

    "},"Classes/SDLStartTime.html":{"name":"SDLStartTime","abstract":"

    Describes the hour, minute and second values used to set the media clock.

    "},"Classes/SDLStationIDNumber.html":{"name":"SDLStationIDNumber","abstract":"

    Describes the hour, minute and second values used to set the media clock.

    "},"Classes/SDLStreamingMediaConfiguration.html":{"name":"SDLStreamingMediaConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLStreamingMediaManager.html":{"name":"SDLStreamingMediaManager","abstract":"

    Undocumented

    "},"Classes/SDLSubscribeButton.html":{"name":"SDLSubscribeButton","abstract":"

    Establishes a subscription to button notifications for HMI buttons. Buttons"},"Classes.html#/c:objc(cs)SDLSubscribeButtonResponse":{"name":"SDLSubscribeButtonResponse","abstract":"

    Response to SDLSubscribeButton

    "},"Classes/SDLSubscribeVehicleData.html":{"name":"SDLSubscribeVehicleData","abstract":"

    Subscribes to specific published vehicle data items. The data will be only sent if it has changed. The application will be notified by the onVehicleData notification whenever new data is available. The update rate is dependent on sensors, vehicle architecture and vehicle type.

    "},"Classes/SDLSubscribeVehicleDataResponse.html":{"name":"SDLSubscribeVehicleDataResponse","abstract":"

    Response to SDLSubscribeVehicleData

    "},"Classes.html#/c:objc(cs)SDLSubscribeWayPoints":{"name":"SDLSubscribeWayPoints","abstract":"

    A SDLSubscribeWaypoints can be sent to subscribe"},"Classes.html#/c:objc(cs)SDLSubscribeWayPointsResponse":{"name":"SDLSubscribeWayPointsResponse","abstract":"

    Response to SubscribeWayPoints

    "},"Classes/SDLSyncMsgVersion.html":{"name":"SDLSyncMsgVersion","abstract":"

    Specifies the version number of the SDL V4 interface. This is used by both the application and SDL to declare what interface version each is using.

    "},"Classes.html#/c:objc(cs)SDLSyncPData":{"name":"SDLSyncPData","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLSyncPDataResponse":{"name":"SDLSyncPDataResponse","abstract":"

    Response to SyncPData

    "},"Classes/SDLSystemCapability.html":{"name":"SDLSystemCapability","abstract":"

    The systemCapabilityType indicates which type of data should be changed and identifies which data object exists in this struct. For example, if the SystemCapability Type is NAVIGATION then a navigationCapability should exist.

    "},"Classes/SDLSystemCapabilityManager.html":{"name":"SDLSystemCapabilityManager","abstract":"

    Undocumented

    "},"Classes/SDLSystemRequest.html":{"name":"SDLSystemRequest","abstract":"

    Undocumented

    "},"Classes/SDLTTSChunk.html":{"name":"SDLTTSChunk","abstract":"

    Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).

    "},"Classes/SDLTemperature.html":{"name":"SDLTemperature","abstract":"

    Struct representing a temperature.

    "},"Classes/SDLTemplateColorScheme.html":{"name":"SDLTemplateColorScheme","abstract":"

    Undocumented

    "},"Classes/SDLTextField.html":{"name":"SDLTextField","abstract":"

    Struct defining the characteristics of a displayed field on the HMI.

    "},"Classes/SDLTireStatus.html":{"name":"SDLTireStatus","abstract":"

    Struct used in Vehicle Data; the status and pressure of the tires.

    "},"Classes/SDLTouch.html":{"name":"SDLTouch","abstract":"

    Undocumented

    "},"Classes/SDLTouchCoord.html":{"name":"SDLTouchCoord","abstract":"

    The coordinate of a touch, used in a touch event

    "},"Classes/SDLTouchEvent.html":{"name":"SDLTouchEvent","abstract":"

    A touch which occurred on the IVI system during projection

    "},"Classes/SDLTouchEventCapabilities.html":{"name":"SDLTouchEventCapabilities","abstract":"

    The capabilities of touches during projection applications

    "},"Classes/SDLTouchManager.html":{"name":"SDLTouchManager","abstract":"

    Undocumented

    "},"Classes/SDLTurn.html":{"name":"SDLTurn","abstract":"

    A struct used in UpdateTurnList for Turn-by-Turn navigation applications

    "},"Classes.html#/c:objc(cs)SDLUnregisterAppInterface":{"name":"SDLUnregisterAppInterface","abstract":"

    Terminates an application’s interface registration. This causes SDL® to"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterfaceResponse":{"name":"SDLUnregisterAppInterfaceResponse","abstract":"

    Response to UnregisterAppInterface

    "},"Classes/SDLUnsubscribeButton.html":{"name":"SDLUnsubscribeButton","abstract":"

    Deletes a subscription to button notifications for the specified button. For"},"Classes.html#/c:objc(cs)SDLUnsubscribeButtonResponse":{"name":"SDLUnsubscribeButtonResponse","abstract":"

    Response to UnsubscribeButton

    "},"Classes/SDLUnsubscribeVehicleData.html":{"name":"SDLUnsubscribeVehicleData","abstract":"

    This function is used to unsubscribe the notifications from the"},"Classes/SDLUnsubscribeVehicleDataResponse.html":{"name":"SDLUnsubscribeVehicleDataResponse","abstract":"

    Response to UnsubscribeVehicleData

    "},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPoints":{"name":"SDLUnsubscribeWayPoints","abstract":"

    Request to unsubscribe from navigation WayPoints and Destination

    "},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPointsResponse":{"name":"SDLUnsubscribeWayPointsResponse","abstract":"

    Response to UnsubscribeWayPoints

    "},"Classes/SDLUpdateTurnList.html":{"name":"SDLUpdateTurnList","abstract":"

    Updates the list of next maneuvers, which can be requested by the user pressing the softbutton

    "},"Classes.html#/c:objc(cs)SDLUpdateTurnListResponse":{"name":"SDLUpdateTurnListResponse","abstract":"

    Response to UpdateTurnList

    "},"Classes/SDLVehicleDataResult.html":{"name":"SDLVehicleDataResult","abstract":"

    Individual published data request result

    "},"Classes/SDLVehicleType.html":{"name":"SDLVehicleType","abstract":"

    Describes the type of vehicle the mobile phone is connected with.

    "},"Classes/SDLVersion.html":{"name":"SDLVersion","abstract":"

    Undocumented

    "},"Classes/SDLVideoStreamingCapability.html":{"name":"SDLVideoStreamingCapability","abstract":"

    Contains information about this system’s video streaming capabilities

    "},"Classes/SDLVideoStreamingFormat.html":{"name":"SDLVideoStreamingFormat","abstract":"

    An available format for video streaming in projection applications

    "},"Classes/SDLVoiceCommand.html":{"name":"SDLVoiceCommand","abstract":"

    Undocumented

    "},"Classes/SDLVRHelpItem.html":{"name":"SDLVRHelpItem","abstract":"

    A help item for voice commands, used locally in interaction lists and globally

    "},"Classes/SDLWeatherAlert.html":{"name":"SDLWeatherAlert","abstract":"

    Undocumented

    "},"Classes/SDLWeatherData.html":{"name":"SDLWeatherData","abstract":"

    Undocumented

    "},"Classes/SDLWeatherServiceData.html":{"name":"SDLWeatherServiceData","abstract":"

    This data is related to what a weather service would provide.

    "},"Classes/SDLWeatherServiceManifest.html":{"name":"SDLWeatherServiceManifest","abstract":"

    A weather service manifest.

    "},"Categories/NSString(SDLEnum).html#/c:objc(cs)NSString(im)isEqualToEnum:":{"name":"-isEqualToEnum:","abstract":"

    Returns whether or not two enums are equal.

    ","parent_name":"NSString(SDLEnum)"},"Categories/NSString(SDLEnum).html":{"name":"NSString(SDLEnum)","abstract":"

    Undocumented

    "},"Categories.html":{"name":"Categories","abstract":"

    The following categories are available globally.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Constants.html":{"name":"Constants","abstract":"

    The following constants are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Type Definitions.html":{"name":"Type Definitions","abstract":"

    The following type definitions are available globally.

    "}} \ No newline at end of file +{"Type Definitions/SDLTouchIdentifier/.html#/c:@EA@SDLTouchIdentifier@SDLTouchIdentifierFirstFinger":{"name":"SDLTouchIdentifierFirstFinger","abstract":"

    Undocumented

    "},"Type Definitions/SDLTouchIdentifier/.html#/c:@EA@SDLTouchIdentifier@SDLTouchIdentifierSecondFinger":{"name":"SDLTouchIdentifierSecondFinger","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLAmbientLightStatus.h@T@SDLAmbientLightStatus":{"name":"SDLAmbientLightStatus","abstract":"

    Reflects the status of the ambient light sensor for headlamps

    "},"Type Definitions.html#/c:SDLAppHMIType.h@T@SDLAppHMIType":{"name":"SDLAppHMIType","abstract":"

    Enumeration listing possible app hmi types.

    "},"Type Definitions.html#/c:SDLAppInterfaceUnregisteredReason.h@T@SDLAppInterfaceUnregisteredReason":{"name":"SDLAppInterfaceUnregisteredReason","abstract":"

    Indicates reason why app interface was unregistered. The application is being disconnected by SDL.

    "},"Type Definitions.html#/c:SDLAppServiceType.h@T@SDLAppServiceType":{"name":"SDLAppServiceType","abstract":"

    Enumeration listing possible app service types.

    "},"Type Definitions.html#/c:SDLAudioStreamingIndicator.h@T@SDLAudioStreamingIndicator":{"name":"SDLAudioStreamingIndicator","abstract":"

    Enumeration listing possible indicators of audio streaming changes

    "},"Type Definitions.html#/c:SDLAudioStreamingState.h@T@SDLAudioStreamingState":{"name":"SDLAudioStreamingState","abstract":"

    Describes whether or not streaming audio is currently audible to the user. Though provided in every OnHMIStatus notification, this information is only relevant for applications that declare themselves as media apps in RegisterAppInterface

    "},"Type Definitions.html#/c:SDLAudioType.h@T@SDLAudioType":{"name":"SDLAudioType","abstract":"

    Describes different audio type options for PerformAudioPassThru

    "},"Type Definitions.html#/c:SDLBitsPerSample.h@T@SDLBitsPerSample":{"name":"SDLBitsPerSample","abstract":"

    Describes different bit depth options for PerformAudioPassThru

    "},"Type Definitions.html#/c:SDLButtonEventMode.h@T@SDLButtonEventMode":{"name":"SDLButtonEventMode","abstract":"

    Indicates whether the button was depressed or released. A BUTTONUP event will always be preceded by a BUTTONDOWN event.

    "},"Type Definitions.html#/c:SDLButtonName.h@T@SDLButtonName":{"name":"SDLButtonName","abstract":"

    Defines logical buttons which, on a given SDL unit, would correspond to either physical or soft (touchscreen) buttons. These logical buttons present a standard functional abstraction which the developer can rely upon, independent of the SDL unit. For example, the developer can rely upon the OK button having the same meaning to the user across SDL platforms.

    "},"Type Definitions.html#/c:SDLButtonPressMode.h@T@SDLButtonPressMode":{"name":"SDLButtonPressMode","abstract":"

    Indicates whether this is a LONG or SHORT button press

    "},"Type Definitions.html#/c:SDLCarModeStatus.h@T@SDLCarModeStatus":{"name":"SDLCarModeStatus","abstract":"

    Describes the carmode the vehicle is in. Used in ClusterModeStatus

    "},"Type Definitions.html#/c:SDLCharacterSet.h@T@SDLCharacterSet":{"name":"SDLCharacterSet","abstract":"

    Character sets supported by SDL. Used to describe text field capabilities.

    "},"Type Definitions.html#/c:SDLCompassDirection.h@T@SDLCompassDirection":{"name":"SDLCompassDirection","abstract":"

    The list of potential compass directions. Used in GPS data

    "},"Type Definitions.html#/c:SDLComponentVolumeStatus.h@T@SDLComponentVolumeStatus":{"name":"SDLComponentVolumeStatus","abstract":"

    The volume status of a vehicle component. Used in SingleTireStatus and VehicleData Fuel Level

    "},"Type Definitions.html#/c:SDLDefrostZone.h@T@SDLDefrostZone":{"name":"SDLDefrostZone","abstract":"

    Enumeration listing possible defrost zones. Used in ClimateControlCapabilities and Data.

    "},"Type Definitions.html#/c:SDLDeliveryMode.h@T@SDLDeliveryMode":{"name":"SDLDeliveryMode","abstract":"

    Specifies the mode in which the sendLocation request is sent. Used in SendLocation.

    "},"Type Definitions.html#/c:SDLDeviceLevelStatus.h@T@SDLDeviceLevelStatus":{"name":"SDLDeviceLevelStatus","abstract":"

    Reflects the reported battery status of the connected device, if reported. Used in DeviceStatus.

    "},"Type Definitions.html#/c:SDLDimension.h@T@SDLDimension":{"name":"SDLDimension","abstract":"

    The supported dimensions of the GPS. Used in GPSData

    "},"Type Definitions.html#/c:SDLDirection.h@T@SDLDirection":{"name":"SDLDirection","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLDisplayMode.h@T@SDLDisplayMode":{"name":"SDLDisplayMode","abstract":"

    Identifies the various display types used by SDL.

    "},"Type Definitions.html#/c:SDLDisplayType.h@T@SDLDisplayType":{"name":"SDLDisplayType","abstract":"

    Identifies the various display types used by SDL. Used in DisplayCapabilities.

    "},"Type Definitions.html#/c:SDLDistanceUnit.h@T@SDLDistanceUnit":{"name":"SDLDistanceUnit","abstract":"

    Wiper Status

    "},"Type Definitions.html#/c:SDLDriverDistractionState.h@T@SDLDriverDistractionState":{"name":"SDLDriverDistractionState","abstract":"

    Enumeration that describes possible states of driver distraction. Used in OnDriverDistraction.

    "},"Type Definitions.html#/c:SDLECallConfirmationStatus.h@T@SDLECallConfirmationStatus":{"name":"SDLECallConfirmationStatus","abstract":"

    Reflects the status of the eCall Notification. Used in ECallInfo

    "},"Type Definitions.html#/c:SDLElectronicParkBrakeStatus.h@T@SDLElectronicParkBrakeStatus":{"name":"SDLElectronicParkBrakeStatus","abstract":"

    Reflects the status of the Electronic Parking Brake. A Vehicle Data Type.

    "},"Type Definitions.html#/c:SDLEmergencyEventType.h@T@SDLEmergencyEventType":{"name":"SDLEmergencyEventType","abstract":"

    Reflects the emergency event status of the vehicle. Used in EmergencyEvent

    "},"Type Definitions.html#/c:SDLEnum.h@T@SDLEnum":{"name":"SDLEnum","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLFileManager.h@T@SDLFileManagerStartupCompletionHandler":{"name":"SDLFileManagerStartupCompletionHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileName":{"name":"SDLFileName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadCompletionHandler":{"name":"SDLFileManagerUploadCompletionHandler","abstract":"

    A completion handler called after a response from Core to a upload request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadCompletionHandler":{"name":"SDLFileManagerMultiUploadCompletionHandler","abstract":"

    A completion handler called after a set of upload requests has completed.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadProgressHandler":{"name":"SDLFileManagerMultiUploadProgressHandler","abstract":"

    In a multiple request send, a handler called after each response from Core to a upload request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerDeleteCompletionHandler":{"name":"SDLFileManagerDeleteCompletionHandler","abstract":"

    A completion handler called after a response from Core to a delete request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiDeleteCompletionHandler":{"name":"SDLFileManagerMultiDeleteCompletionHandler","abstract":"

    A completion handler called after a set of delete requests has completed.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerListFilesCompletionHandler":{"name":"SDLFileManagerListFilesCompletionHandler","abstract":"

    A completion handler called after response from Core to a list files request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerUploadArtworkCompletionHandler":{"name":"SDLFileManagerUploadArtworkCompletionHandler","abstract":"

    A completion handler called after a response from Core to a artwork upload request.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkCompletionHandler":{"name":"SDLFileManagerMultiUploadArtworkCompletionHandler","abstract":"

    A completion handler called after a set of upload artwork requests has completed.

    "},"Type Definitions.html#/c:SDLFileManagerConstants.h@T@SDLFileManagerMultiUploadArtworkProgressHandler":{"name":"SDLFileManagerMultiUploadArtworkProgressHandler","abstract":"

    In a multiple request send, a handler called after each response from Core to an artwork upload request.

    "},"Type Definitions.html#/c:SDLFileType.h@T@SDLFileType":{"name":"SDLFileType","abstract":"

    Enumeration listing possible file types. Used in SDLFile, PutFile, ImageField, OnSystemRequest

    "},"Type Definitions.html#/c:SDLFuelCutoffStatus.h@T@SDLFuelCutoffStatus":{"name":"SDLFuelCutoffStatus","abstract":"

    Reflects the status of the Restraints Control Module fuel pump cutoff. The fuel pump is cut off typically after the vehicle has had a collision. Used in EmergencyEvent.

    "},"Type Definitions.html#/c:SDLFuelType.h@T@SDLFuelType":{"name":"SDLFuelType","abstract":"

    Enumeration listing possible fuel types.

    "},"Type Definitions.html#/c:SDLGlobalProperty.h@T@SDLGlobalProperty":{"name":"SDLGlobalProperty","abstract":"

    Properties of a user-initiated VR interaction (i.e. interactions started by the user pressing the PTT button). Used in RPCs related to ResetGlobalProperties

    "},"Type Definitions.html#/c:SDLHMILevel.h@T@SDLHMILevel":{"name":"SDLHMILevel","abstract":"

    Specifies current level of the HMI. An HMI level indicates the degree of user interaction possible through the HMI (e.g. TTS only, display only, VR, etc.). The HMI level varies for an application based on the type of display (i.e. Nav or non-Nav) and the user directing focus to other applications (e.g. phone, other mobile applications, etc.). Used in OnHMIStatus

    "},"Type Definitions.html#/c:SDLHMIZoneCapabilities.h@T@SDLHMIZoneCapabilities":{"name":"SDLHMIZoneCapabilities","abstract":"

    Specifies HMI Zones in the vehicle. Used in RegisterAppInterfaceResponse

    "},"Type Definitions.html#/c:SDLHybridAppPreference.h@T@SDLHybridAppPreference":{"name":"SDLHybridAppPreference","abstract":"

    Enumeration for the user’s preference of which app type to use when both are available.

    "},"Type Definitions.html#/c:SDLIgnitionStableStatus.h@T@SDLIgnitionStableStatus":{"name":"SDLIgnitionStableStatus","abstract":"

    Reflects the ignition switch stability. Used in BodyInformation

    "},"Type Definitions.html#/c:SDLIgnitionStatus.h@T@SDLIgnitionStatus":{"name":"SDLIgnitionStatus","abstract":"

    Reflects the status of ignition. Used in BodyInformation.

    "},"Type Definitions.html#/c:SDLImageFieldName.h@T@SDLImageFieldName":{"name":"SDLImageFieldName","abstract":"

    The name that identifies the filed. Used in DisplayCapabilities.

    "},"Type Definitions.html#/c:SDLImageType.h@T@SDLImageType":{"name":"SDLImageType","abstract":"

    Contains information about the type of image. Used in Image.

    "},"Type Definitions.html#/c:SDLInteractionMode.h@T@SDLInteractionMode":{"name":"SDLInteractionMode","abstract":"

    For application-initiated interactions (SDLPerformInteraction), this specifies the mode by which the user is prompted and by which the user’s selection is indicated. Used in PerformInteraction.

    "},"Type Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardAutocompleteCompletionHandler":{"name":"SDLKeyboardAutocompleteCompletionHandler","abstract":"

    This handler is called when you wish to update your autocomplete text in response to the user’s input

    "},"Type Definitions.html#/c:SDLKeyboardDelegate.h@T@SDLKeyboardCharacterSetCompletionHandler":{"name":"SDLKeyboardCharacterSetCompletionHandler","abstract":"

    This handler is called when you wish to update your keyboard’s limitedCharacterSet in response to the user’s input

    "},"Type Definitions.html#/c:SDLKeyboardEvent.h@T@SDLKeyboardEvent":{"name":"SDLKeyboardEvent","abstract":"

    Enumeration listing possible keyboard events. Used in OnKeyboardInput.

    "},"Type Definitions.html#/c:SDLKeyboardLayout.h@T@SDLKeyboardLayout":{"name":"SDLKeyboardLayout","abstract":"

    Enumeration listing possible keyboard layouts. Used in KeyboardProperties.

    "},"Type Definitions.html#/c:SDLKeypressMode.h@T@SDLKeypressMode":{"name":"SDLKeypressMode","abstract":"

    Enumeration listing possible keyboard events.

    "},"Type Definitions.html#/c:SDLLanguage.h@T@SDLLanguage":{"name":"SDLLanguage","abstract":"

    Specifies the language to be used for TTS, VR, displayed messages/menus. Used in ChangeRegistration and RegisterAppInterface.

    "},"Type Definitions.html#/c:SDLLayoutMode.h@T@SDLLayoutMode":{"name":"SDLLayoutMode","abstract":"

    For touchscreen interactions, the mode of how the choices are presented. Used in PerformInteraction.

    "},"Type Definitions.html#/c:SDLLightName.h@T@SDLLightName":{"name":"SDLLightName","abstract":"

    The name that identifies the Light

    "},"Type Definitions.html#/c:SDLLightStatus.h@T@SDLLightStatus":{"name":"SDLLightStatus","abstract":"

    Reflects the status of Light.

    "},"Type Definitions.html#/c:SDLLockScreenStatus.h@T@SDLLockScreenStatus":{"name":"SDLLockScreenStatus","abstract":"

    Describes what the status of the lock screen should be

    "},"Type Definitions.html#/c:SDLLogConstants.h@T@SDLLogFilterBlock":{"name":"SDLLogFilterBlock","abstract":"

    A block that takes in a log model and returns whether or not the log passes the filter and should therefore be logged.

    "},"Type Definitions.html#/c:SDLMaintenanceModeStatus.h@T@SDLMaintenanceModeStatus":{"name":"SDLMaintenanceModeStatus","abstract":"

    Describes the maintenence mode. Used in nothing.

    "},"Type Definitions.html#/c:SDLManager.h@T@SDLManagerReadyBlock":{"name":"SDLManagerReadyBlock","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLManager.h@T@SDLRPCUpdatedBlock":{"name":"SDLRPCUpdatedBlock","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLMassageCushion.h@T@SDLMassageCushion":{"name":"SDLMassageCushion","abstract":"

    The List possible cushions of a multi-contour massage seat.

    "},"Type Definitions.html#/c:SDLMassageMode.h@T@SDLMassageMode":{"name":"SDLMassageMode","abstract":"

    The List possible modes of a massage zone.

    "},"Type Definitions.html#/c:SDLMassageZone.h@T@SDLMassageZone":{"name":"SDLMassageZone","abstract":"

    List possible zones of a multi-contour massage seat.

    "},"Type Definitions.html#/c:SDLMediaClockFormat.h@T@SDLMediaClockFormat":{"name":"SDLMediaClockFormat","abstract":"

    Indicates the format of the time displayed on the connected SDL unit.

    "},"Type Definitions.html#/c:SDLMediaType.h@T@SDLMediaType":{"name":"SDLMediaType","abstract":"

    Enumeration listing possible media types.

    "},"Type Definitions.html#/c:SDLMenuCell.h@T@SDLMenuCellSelectionHandler":{"name":"SDLMenuCellSelectionHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLMetadataType.h@T@SDLMetadataType":{"name":"SDLMetadataType","abstract":"

    Text Field metadata types. Used in Show.

    "},"Type Definitions.html#/c:SDLModuleType.h@T@SDLModuleType":{"name":"SDLModuleType","abstract":"

    The type of remote control data. Used in ButtonPress, GetInteriorVehicleData, and ModuleData

    "},"Type Definitions.html#/c:SDLNavigationAction.h@T@SDLNavigationAction":{"name":"SDLNavigationAction","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNavigationJunction.h@T@SDLNavigationJunction":{"name":"SDLNavigationJunction","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationName":{"name":"SDLNotificationName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLNotificationUserInfoKey":{"name":"SDLNotificationUserInfoKey","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLAudioPassThruHandler":{"name":"SDLAudioPassThruHandler","abstract":"

    A handler used on SDLPerformAudioPassThru.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLResponseHandler":{"name":"SDLResponseHandler","abstract":"

    A handler used on all RPC requests which fires when the response is received.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleRequestCompletionHandler":{"name":"SDLMultipleRequestCompletionHandler","abstract":"

    A completion handler called after a sequential or simultaneous set of requests have completed sending.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleSequentialRequestProgressHandler":{"name":"SDLMultipleSequentialRequestProgressHandler","abstract":"

    A handler called after each response to a request comes in in a multiple request send.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLMultipleAsyncRequestProgressHandler":{"name":"SDLMultipleAsyncRequestProgressHandler","abstract":"

    A handler called after each response to a request comes in in a multiple request send.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCButtonNotificationHandler":{"name":"SDLRPCButtonNotificationHandler","abstract":"

    A handler that may optionally be run when an SDLSubscribeButton or SDLSoftButton has a corresponding notification occur.

    "},"Type Definitions.html#/c:SDLNotificationConstants.h@T@SDLRPCCommandNotificationHandler":{"name":"SDLRPCCommandNotificationHandler","abstract":"

    A handler that may optionally be run when an SDLAddCommand has a corresponding notification occur.

    "},"Type Definitions.html#/c:SDLPRNDL.h@T@SDLPRNDL":{"name":"SDLPRNDL","abstract":"

    The selected gear the car is in. Used in retrieving vehicle data.

    "},"Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionRPCName":{"name":"SDLPermissionRPCName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionObserverIdentifier":{"name":"SDLPermissionObserverIdentifier","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLPermissionConstants.h@T@SDLPermissionsChangedHandler":{"name":"SDLPermissionsChangedHandler","abstract":"

    The PermissionObserver is a block that is passed in to some methods that will be stored and called when specified permissions change.

    "},"Type Definitions.html#/c:SDLPermissionStatus.h@T@SDLPermissionStatus":{"name":"SDLPermissionStatus","abstract":"

    Enumeration that describes possible permission states of a policy table entry. Used in nothing.

    "},"Type Definitions.html#/c:SDLPowerModeQualificationStatus.h@T@SDLPowerModeQualificationStatus":{"name":"SDLPowerModeQualificationStatus","abstract":"

    Describes the power mode qualification status. Used in ClusterModeStatus.

    "},"Type Definitions.html#/c:SDLPowerModeStatus.h@T@SDLPowerModeStatus":{"name":"SDLPowerModeStatus","abstract":"

    The status of the car’s power. Used in ClusterModeStatus.

    "},"Type Definitions.html#/c:SDLPredefinedLayout.h@T@SDLPredefinedLayout":{"name":"SDLPredefinedLayout","abstract":"

    A template layout an app uses to display information. The broad details of the layout are defined, but the details depend on the IVI system. Used in SetDisplayLayout.

    "},"Type Definitions.html#/c:SDLPrerecordedSpeech.h@T@SDLPrerecordedSpeech":{"name":"SDLPrerecordedSpeech","abstract":"

    Contains information about the speech capabilities on the SDL platform. Used in RegisterAppInterfaceResponse to indicate capability.

    "},"Type Definitions.html#/c:SDLPrimaryAudioSource.h@T@SDLPrimaryAudioSource":{"name":"SDLPrimaryAudioSource","abstract":"

    Reflects the current primary audio source of SDL (if selected). Used in DeviceStatus.

    "},"Type Definitions.html#/c:SDLRPCFunctionNames.h@T@SDLRPCFunctionName":{"name":"SDLRPCFunctionName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLRadioBand.h@T@SDLRadioBand":{"name":"SDLRadioBand","abstract":"

    Radio bands, such as AM and FM, used in RadioControlData

    "},"Type Definitions.html#/c:SDLRadioState.h@T@SDLRadioState":{"name":"SDLRadioState","abstract":"

    List possible states of a remote control radio module. Used in RadioControlData.

    "},"Type Definitions.html#/c:SDLRequestType.h@T@SDLRequestType":{"name":"SDLRequestType","abstract":"

    A type of system request. Used in SystemRequest.

    "},"Type Definitions.html#/c:SDLResult.h@T@SDLResult":{"name":"SDLResult","abstract":"

    Defines the possible result codes returned by SDL to the application in a response to a requested operation. Used in RPC responses

    "},"Type Definitions.html#/c:SDLSamplingRate.h@T@SDLSamplingRate":{"name":"SDLSamplingRate","abstract":"

    Describes different sampling rates for PerformAudioPassThru and AudioPassThruCapabilities

    "},"Type Definitions.html#/c:SDLScreenManager.h@T@SDLScreenManagerUpdateCompletionHandler":{"name":"SDLScreenManagerUpdateCompletionHandler","abstract":"

    The handler run when the update has completed

    "},"Type Definitions.html#/c:SDLScreenManager.h@T@SDLPreloadChoiceCompletionHandler":{"name":"SDLPreloadChoiceCompletionHandler","abstract":"

    Return an error with userinfo [key: SDLChoiceCell, value: NSError] if choices failed to upload

    "},"Type Definitions.html#/c:SDLSeatMemoryActionType.h@T@SDLSeatMemoryActionType":{"name":"SDLSeatMemoryActionType","abstract":"

    List of possible actions on Seat Meomry

    "},"Type Definitions.html#/c:SDLServiceUpdateReason.h@T@SDLServiceUpdateReason":{"name":"SDLServiceUpdateReason","abstract":"

    Enumeration listing possible service update reasons.

    "},"Type Definitions.html#/c:SDLSoftButtonType.h@T@SDLSoftButtonType":{"name":"SDLSoftButtonType","abstract":"

    SoftButtonType (TEXT / IMAGE / BOTH). Used by SoftButton.

    "},"Type Definitions.html#/c:SDLSpeechCapabilities.h@T@SDLSpeechCapabilities":{"name":"SDLSpeechCapabilities","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStaticIconName.h@T@SDLStaticIconName":{"name":"SDLStaticIconName","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLVideoStreamManagerState":{"name":"SDLVideoStreamManagerState","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAudioStreamManagerState":{"name":"SDLAudioStreamManagerState","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLStreamingMediaManagerConstants.h@T@SDLAppState":{"name":"SDLAppState","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLSupportedSeat.h@T@SDLSupportedSeat":{"name":"SDLSupportedSeat","abstract":"

    List possible seats that is a remote controllable seat.

    "},"Type Definitions.html#/c:SDLSystemAction.h@T@SDLSystemAction":{"name":"SDLSystemAction","abstract":"

    Enumeration that describes system actions that can be triggered. Used in SoftButton.

    "},"Type Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLUpdateCapabilityHandler":{"name":"SDLUpdateCapabilityHandler","abstract":"

    A completion handler called after a request for the capability type is returned from the remote system.

    "},"Type Definitions.html#/c:SDLSystemCapabilityManager.h@T@SDLCapabilityUpdateHandler":{"name":"SDLCapabilityUpdateHandler","abstract":"

    An observer block for whenever a subscription is called.

    "},"Type Definitions.html#/c:SDLSystemCapabilityType.h@T@SDLSystemCapabilityType":{"name":"SDLSystemCapabilityType","abstract":"

    The type of system capability to get more information on. Used in GetSystemCapability.

    "},"Type Definitions.html#/c:SDLSystemContext.h@T@SDLSystemContext":{"name":"SDLSystemContext","abstract":"

    Indicates whether or not a user-initiated interaction is in progress, and if so, in what mode (i.e. MENU or VR). Used in OnHMIStatus

    "},"Type Definitions.html#/c:SDLTBTState.h@T@SDLTBTState":{"name":"SDLTBTState","abstract":"

    The turn-by-turn state, used in OnTBTClientState.

    "},"Type Definitions.html#/c:SDLTPMS.h@T@SDLTPMS":{"name":"SDLTPMS","abstract":"

    An enum representing values of the tire pressure monitoring system

    "},"Type Definitions.html#/c:SDLTemperatureUnit.h@T@SDLTemperatureUnit":{"name":"SDLTemperatureUnit","abstract":"

    The unit of temperature to display. Used in Temperature.

    "},"Type Definitions.html#/c:SDLTextAlignment.h@T@SDLTextAlignment":{"name":"SDLTextAlignment","abstract":"

    The list of possible alignments of text in a field. May only work on some display types. used in Show.

    "},"Type Definitions.html#/c:SDLTextFieldName.h@T@SDLTextFieldName":{"name":"SDLTextFieldName","abstract":"

    Names of the text fields that can appear on a SDL display. Used in TextFieldName.

    "},"Type Definitions.html#/c:SDLTimerMode.h@T@SDLTimerMode":{"name":"SDLTimerMode","abstract":"

    The direction of a timer. Used in nothing.

    "},"Type Definitions/SDLTouchIdentifier.html":{"name":"SDLTouchIdentifier","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLTouchManager.h@T@SDLTouchEventHandler":{"name":"SDLTouchEventHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLTouchType.h@T@SDLTouchType":{"name":"SDLTouchType","abstract":"

    The type of a touch in a projection application. Used in OnTouchEvent.

    "},"Type Definitions.html#/c:SDLTriggerSource.h@T@SDLTriggerSource":{"name":"SDLTriggerSource","abstract":"

    Indicates whether choice/command was selected via VR or via a menu selection (using SEEKRIGHT/SEEKLEFT, TUNEUP, TUNEDOWN, OK buttons). Used in PerformInteractionResponse and OnCommand.

    "},"Type Definitions.html#/c:SDLTurnSignal.h@T@SDLTurnSignal":{"name":"SDLTurnSignal","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLUpdateMode.h@T@SDLUpdateMode":{"name":"SDLUpdateMode","abstract":"

    Specifies what function should be performed on the media clock/counter. Used in SetMediaClockTimer.

    "},"Type Definitions.html#/c:SDLVehicleDataActiveStatus.h@T@SDLVehicleDataActiveStatus":{"name":"SDLVehicleDataActiveStatus","abstract":"

    Vehicle Data Activity Status. Used in nothing.

    "},"Type Definitions.html#/c:SDLVehicleDataEventStatus.h@T@SDLVehicleDataEventStatus":{"name":"SDLVehicleDataEventStatus","abstract":"

    Reflects the status of a vehicle data event; e.g. a seat belt event status. Used in retrieving vehicle data.

    "},"Type Definitions.html#/c:SDLVehicleDataNotificationStatus.h@T@SDLVehicleDataNotificationStatus":{"name":"SDLVehicleDataNotificationStatus","abstract":"

    Reflects the status of a vehicle data notification. Used in ECallInfo

    "},"Type Definitions.html#/c:SDLVehicleDataResultCode.h@T@SDLVehicleDataResultCode":{"name":"SDLVehicleDataResultCode","abstract":"

    Vehicle Data Result Code. Used in DIDResult.

    "},"Type Definitions.html#/c:SDLVehicleDataStatus.h@T@SDLVehicleDataStatus":{"name":"SDLVehicleDataStatus","abstract":"

    Reflects the status of a binary vehicle data item. Used in MyKey.

    "},"Type Definitions.html#/c:SDLVehicleDataType.h@T@SDLVehicleDataType":{"name":"SDLVehicleDataType","abstract":"

    Defines the vehicle data types that can be published and/or subscribed to using SDLSubscribeVehicleData. Used in VehicleDataResult

    "},"Type Definitions.html#/c:SDLVentilationMode.h@T@SDLVentilationMode":{"name":"SDLVentilationMode","abstract":"

    The ventilation mode. Used in ClimateControlCapabilities

    "},"Type Definitions.html#/c:SDLVideoStreamingCodec.h@T@SDLVideoStreamingCodec":{"name":"SDLVideoStreamingCodec","abstract":"

    Enum for each type of video streaming codec. Used in VideoStreamingFormat.

    "},"Type Definitions.html#/c:SDLVideoStreamingProtocol.h@T@SDLVideoStreamingProtocol":{"name":"SDLVideoStreamingProtocol","abstract":"

    Enum for each type of video streaming protocol, used in VideoStreamingFormat

    "},"Type Definitions.html#/c:SDLVideoStreamingState.h@T@SDLVideoStreamingState":{"name":"SDLVideoStreamingState","abstract":"

    Enum for each type of video streaming protocol, used in VideoStreamingFormat

    "},"Type Definitions.html#/c:SDLVoiceCommand.h@T@SDLVoiceCommandSelectionHandler":{"name":"SDLVoiceCommandSelectionHandler","abstract":"

    Undocumented

    "},"Type Definitions.html#/c:SDLVrCapabilities.h@T@SDLVRCapabilities":{"name":"SDLVRCapabilities","abstract":"

    The VR capabilities of the connected SDL platform. Used in RegisterAppInterfaceResponse.

    "},"Type Definitions.html#/c:SDLWarningLightStatus.h@T@SDLWarningLightStatus":{"name":"SDLWarningLightStatus","abstract":"

    Reflects the status of a cluster instrument warning light. Used in TireStatus

    "},"Type Definitions.html#/c:SDLWayPointType.h@T@SDLWayPointType":{"name":"SDLWayPointType","abstract":"

    The type of a navigation waypoint. Used in GetWayPoints.

    "},"Type Definitions.html#/c:SDLWiperStatus.h@T@SDLWiperStatus":{"name":"SDLWiperStatus","abstract":"

    The status of the windshield wipers. Used in retrieving vehicle data.

    "},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveSingleTapForView:atPoint:":{"name":"-touchManager:didReceiveSingleTapForView:atPoint:","abstract":"

    A single tap was received

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceiveDoubleTapForView:atPoint:":{"name":"-touchManager:didReceiveDoubleTapForView:atPoint:","abstract":"

    A double tap was received

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidStartInView:atPoint:":{"name":"-touchManager:panningDidStartInView:atPoint:","abstract":"

    Panning started

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePanningFromPoint:toPoint:":{"name":"-touchManager:didReceivePanningFromPoint:toPoint:","abstract":"

    Panning moved between points

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningDidEndInView:atPoint:":{"name":"-touchManager:panningDidEndInView:atPoint:","abstract":"

    Panning ended

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:panningCanceledAtPoint:":{"name":"-touchManager:panningCanceledAtPoint:","abstract":"

    Panning canceled

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidStartInView:atCenterPoint:":{"name":"-touchManager:pinchDidStartInView:atCenterPoint:","abstract":"

    Pinch did start

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchAtCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchAtCenterPoint:withScale:","abstract":"

    @abstract","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:didReceivePinchInView:atCenterPoint:withScale:":{"name":"-touchManager:didReceivePinchInView:atCenterPoint:withScale:","abstract":"

    Pinch moved and changed scale

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchDidEndInView:atCenterPoint:":{"name":"-touchManager:pinchDidEndInView:atCenterPoint:","abstract":"

    Pinch did end

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLTouchManagerDelegate.html#/c:objc(pl)SDLTouchManagerDelegate(im)touchManager:pinchCanceledAtCenterPoint:":{"name":"-touchManager:pinchCanceledAtCenterPoint:","abstract":"

    Pinch canceled

    ","parent_name":"SDLTouchManagerDelegate"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)preferredVideoFormatOrderFromHeadUnitPreferredOrder:":{"name":"-preferredVideoFormatOrderFromHeadUnitPreferredOrder:","abstract":"

    Implement to return a different preferred order of attempted format usage than the head unit’s preferred order. In nearly all cases, it’s best to simply return the head unit’s preferred order, or not implement this method (which does the same thing).

    ","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingMediaManagerDataSource.html#/c:objc(pl)SDLStreamingMediaManagerDataSource(im)resolutionFromHeadUnitPreferredResolution:":{"name":"-resolutionFromHeadUnitPreferredResolution:","abstract":"

    Implement to return a different resolution to use for video streaming than the head unit’s requested resolution. If you return a resolution that the head unit does not like, the manager will fail to start up. In nearly all cases, it’s best to simply return the head unit’s preferred order, or not implement this method (which does the same thing), and adapt your UI to the head unit’s preferred resolution instead.

    ","parent_name":"SDLStreamingMediaManagerDataSource"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(py)audioConnected":{"name":"audioConnected","abstract":"

    Whether or not the audio byte stream is currently connected

    ","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLStreamingAudioManagerType.html#/c:objc(pl)SDLStreamingAudioManagerType(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"

    Send audio data bytes over the audio byte stream

    ","parent_name":"SDLStreamingAudioManagerType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(py)appId":{"name":"appId","abstract":"

    The app id of the app

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)initializeWithAppId:completionHandler:":{"name":"-initializeWithAppId:completionHandler:","abstract":"

    Initialize the SDL security library with the app’s id and a completion handler

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)stop":{"name":"-stop","abstract":"

    Stop the security library

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)runHandshakeWithClientData:error:":{"name":"-runHandshakeWithClientData:error:","abstract":"

    Run the SSL/TLS handshake

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)encryptData:withError:":{"name":"-encryptData:withError:","abstract":"

    Encrypt data using SSL/TLS

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(im)decryptData:withError:":{"name":"-decryptData:withError:","abstract":"

    Decrypt data using SSL/TLS

    ","parent_name":"SDLSecurityType"},"Protocols/SDLSecurityType.html#/c:objc(pl)SDLSecurityType(cm)availableMakes":{"name":"+availableMakes","abstract":"

    The vehicle makes this security library covers

    ","parent_name":"SDLSecurityType"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerDidDisconnect":{"name":"-managerDidDisconnect","abstract":"

    Called upon a disconnection from the remote system.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)hmiLevel:didChangeToLevel:":{"name":"-hmiLevel:didChangeToLevel:","abstract":"

    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.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)audioStreamingState:didChangeToState:":{"name":"-audioStreamingState:didChangeToState:","abstract":"

    Called when the audio streaming state of this application changes on the remote system. This refers to when streaming audio is audible to the user.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)systemContext:didChangeToContext:":{"name":"-systemContext:didChangeToContext:","abstract":"

    Called when the system context of this application changes on the remote system. This refers to whether or not a user-initiated interaction is in progress, and if so, what it is.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLManagerDelegate.html#/c:objc(pl)SDLManagerDelegate(im)managerShouldUpdateLifecycleToLanguage:":{"name":"-managerShouldUpdateLifecycleToLanguage:","abstract":"

    Called when the lifecycle manager detected a language mismatch. In case of a language mismatch the manager should change the apps registration by updating the lifecycle configuration to the specified language. If the app can support the specified language it should return an Object of SDLLifecycleConfigurationUpdate, otherwise it should return nil to indicate that the language is not supported.

    ","parent_name":"SDLManagerDelegate"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(cm)logger":{"name":"+logger","abstract":"

    A simple convenience initializer to create the object. This should not start up the logger.

    ","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)setupLogger":{"name":"-setupLogger","abstract":"

    A call to setup the logger in whatever manner it needs to do so.

    ","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)logWithLog:formattedLog:":{"name":"-logWithLog:formattedLog:","abstract":"

    Log a particular log using the model and the formatted log message to the target.

    ","parent_name":"SDLLogTarget"},"Protocols/SDLLogTarget.html#/c:objc(pl)SDLLogTarget(im)teardownLogger":{"name":"-teardownLogger","abstract":"

    The log target should be torn down. e.g. file handles should be closed

    ","parent_name":"SDLLogTarget"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)userDidSubmitInput:withEvent:":{"name":"-userDidSubmitInput:withEvent:","abstract":"

    The keyboard session completed with some input.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidAbortWithReason:":{"name":"-keyboardDidAbortWithReason:","abstract":"

    The keyboard session aborted.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)customKeyboardConfiguration":{"name":"-customKeyboardConfiguration","abstract":"

    Implement this in order to provide a custom keyboard configuration to just this keyboard. To apply default settings to all keyboards, see SDLScreenManager.keyboardConfiguration

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateAutocompleteWithInput:completionHandler:":{"name":"-updateAutocompleteWithInput:completionHandler:","abstract":"

    Implement this if you wish to update the KeyboardProperties.autoCompleteText as the user updates their input. This is called upon a KEYPRESS event.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)updateCharacterSetWithInput:completionHandler:":{"name":"-updateCharacterSetWithInput:completionHandler:","abstract":"

    Implement this if you wish to update the limitedCharacterSet as the user updates their input. This is called upon a KEYPRESS event.

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLKeyboardDelegate.html#/c:objc(pl)SDLKeyboardDelegate(im)keyboardDidSendEvent:text:":{"name":"-keyboardDidSendEvent:text:","abstract":"

    Implement this to be notified of all events occurring on the keyboard

    ","parent_name":"SDLKeyboardDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didSelectChoice:withSource:atRowIndex:":{"name":"-choiceSet:didSelectChoice:withSource:atRowIndex:","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLChoiceSetDelegate.html#/c:objc(pl)SDLChoiceSetDelegate(im)choiceSet:didReceiveError:":{"name":"-choiceSet:didReceiveError:","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:fileDidFinishPlaying:successfully:":{"name":"-audioStreamManager:fileDidFinishPlaying:successfully:","abstract":"

    Called when a file from the SDLAudioStreamManager finishes playing

    ","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForFile:error:":{"name":"-audioStreamManager:errorDidOccurForFile:error:","abstract":"

    Called when a file from the SDLAudioStreamManager could not play

    ","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:dataBufferDidFinishPlayingSuccessfully:":{"name":"-audioStreamManager:dataBufferDidFinishPlayingSuccessfully:","abstract":"

    Called when a data buffer from the SDLAudioStreamManager finishes playing

    ","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols/SDLAudioStreamManagerDelegate.html#/c:objc(pl)SDLAudioStreamManagerDelegate(im)audioStreamManager:errorDidOccurForDataBuffer:":{"name":"-audioStreamManager:errorDidOccurForDataBuffer:","abstract":"

    Called when a data buffer from the SDLAudioStreamManager could not play

    ","parent_name":"SDLAudioStreamManagerDelegate"},"Protocols.html#/c:objc(pl)SDLInt":{"name":"SDLInt","abstract":"

    A declaration that this NSNumber contains an NSInteger.

    "},"Protocols.html#/c:objc(pl)SDLUInt":{"name":"SDLUInt","abstract":"

    A declaration that this NSNumber contains an NSUInteger.

    "},"Protocols.html#/c:objc(pl)SDLBool":{"name":"SDLBool","abstract":"

    A declaration that this NSNumber contains a BOOL.

    "},"Protocols.html#/c:objc(pl)SDLFloat":{"name":"SDLFloat","abstract":"

    A declaration that this NSNumber contains a float.

    "},"Protocols/SDLAudioStreamManagerDelegate.html":{"name":"SDLAudioStreamManagerDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLChoiceSetDelegate.html":{"name":"SDLChoiceSetDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLKeyboardDelegate.html":{"name":"SDLKeyboardDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLLogTarget.html":{"name":"SDLLogTarget","abstract":"

    A protocol describing a place logs from SDLLogManager are logged to

    "},"Protocols/SDLManagerDelegate.html":{"name":"SDLManagerDelegate","abstract":"

    Undocumented

    "},"Protocols/SDLSecurityType.html":{"name":"SDLSecurityType","abstract":"

    A protocol used by SDL Security libraries.

    "},"Protocols/SDLStreamingAudioManagerType.html":{"name":"SDLStreamingAudioManagerType","abstract":"

    Undocumented

    "},"Protocols/SDLStreamingMediaManagerDataSource.html":{"name":"SDLStreamingMediaManagerDataSource","abstract":"

    Undocumented

    "},"Protocols/SDLTouchManagerDelegate.html":{"name":"SDLTouchManagerDelegate","abstract":"

    Undocumented

    "},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagNone":{"name":"SDLStreamingEncryptionFlagNone","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateOnly":{"name":"SDLStreamingEncryptionFlagAuthenticateOnly","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLStreamingEncryptionFlag.html#/c:@E@SDLStreamingEncryptionFlag@SDLStreamingEncryptionFlagAuthenticateAndEncrypt":{"name":"SDLStreamingEncryptionFlagAuthenticateAndEncrypt","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingEncryptionFlag"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeLayer":{"name":"SDLCarWindowRenderingTypeLayer","abstract":"

    Undocumented

    ","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewAfterScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewAfterScreenUpdates","abstract":"

    Undocumented

    ","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLCarWindowRenderingType.html#/c:@E@SDLCarWindowRenderingType@SDLCarWindowRenderingTypeViewBeforeScreenUpdates":{"name":"SDLCarWindowRenderingTypeViewBeforeScreenUpdates","abstract":"

    Undocumented

    ","parent_name":"SDLCarWindowRenderingType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeRequest":{"name":"SDLRPCMessageTypeRequest","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeResponse":{"name":"SDLRPCMessageTypeResponse","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessageType"},"Enums/SDLRPCMessageType.html#/c:@E@SDLRPCMessageType@SDLRPCMessageTypeNotification":{"name":"SDLRPCMessageTypeNotification","abstract":"

    Undocumented

    ","parent_name":"SDLRPCMessageType"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusAllowed":{"name":"SDLPermissionGroupStatusAllowed","abstract":"

    Every RPC in the group is currently allowed.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusDisallowed":{"name":"SDLPermissionGroupStatusDisallowed","abstract":"

    Every RPC in the group is currently disallowed.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusMixed":{"name":"SDLPermissionGroupStatusMixed","abstract":"

    Some RPCs in the group are allowed and some disallowed.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupStatus.html#/c:@E@SDLPermissionGroupStatus@SDLPermissionGroupStatusUnknown":{"name":"SDLPermissionGroupStatusUnknown","abstract":"

    The current status of the group is unknown.

    ","parent_name":"SDLPermissionGroupStatus"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAllAllowed":{"name":"SDLPermissionGroupTypeAllAllowed","abstract":"

    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.

    ","parent_name":"SDLPermissionGroupType"},"Enums/SDLPermissionGroupType.html#/c:@E@SDLPermissionGroupType@SDLPermissionGroupTypeAny":{"name":"SDLPermissionGroupTypeAny","abstract":"

    Be notified when any change in availability occurs among the group.

    ","parent_name":"SDLPermissionGroupType"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateDelete":{"name":"MenuCellStateDelete","abstract":"

    Undocumented

    ","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateAdd":{"name":"MenuCellStateAdd","abstract":"

    Undocumented

    ","parent_name":"MenuCellState"},"Enums/MenuCellState.html#/c:@E@MenuCellState@MenuCellStateKeep":{"name":"MenuCellStateKeep","abstract":"

    Undocumented

    ","parent_name":"MenuCellState"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOn":{"name":"SDLDynamicMenuUpdatesModeForceOn","abstract":"

    Undocumented

    ","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeForceOff":{"name":"SDLDynamicMenuUpdatesModeForceOff","abstract":"

    Undocumented

    ","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLDynamicMenuUpdatesMode.html#/c:@E@SDLDynamicMenuUpdatesMode@SDLDynamicMenuUpdatesModeOnWithCompatibility":{"name":"SDLDynamicMenuUpdatesModeOnWithCompatibility","abstract":"

    Undocumented

    ","parent_name":"SDLDynamicMenuUpdatesMode"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeSimple":{"name":"SDLLogFormatTypeSimple","abstract":"

    Undocumented

    ","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDefault":{"name":"SDLLogFormatTypeDefault","abstract":"

    Undocumented

    ","parent_name":"SDLLogFormatType"},"Enums/SDLLogFormatType.html#/c:@E@SDLLogFormatType@SDLLogFormatTypeDetailed":{"name":"SDLLogFormatTypeDetailed","abstract":"

    Undocumented

    ","parent_name":"SDLLogFormatType"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDefault":{"name":"SDLLogLevelDefault","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelOff":{"name":"SDLLogLevelOff","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelError":{"name":"SDLLogLevelError","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelWarning":{"name":"SDLLogLevelWarning","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelDebug":{"name":"SDLLogLevelDebug","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogLevel.html#/c:@E@SDLLogLevel@SDLLogLevelVerbose":{"name":"SDLLogLevelVerbose","abstract":"

    Undocumented

    ","parent_name":"SDLLogLevel"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagError":{"name":"SDLLogFlagError","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagWarning":{"name":"SDLLogFlagWarning","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagDebug":{"name":"SDLLogFlagDebug","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogFlag.html#/c:@E@SDLLogFlag@SDLLogFlagVerbose":{"name":"SDLLogFlagVerbose","abstract":"

    Undocumented

    ","parent_name":"SDLLogFlag"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionTransmit":{"name":"SDLLogBytesDirectionTransmit","abstract":"

    Undocumented

    ","parent_name":"SDLLogBytesDirection"},"Enums/SDLLogBytesDirection.html#/c:@E@SDLLogBytesDirection@SDLLogBytesDirectionReceive":{"name":"SDLLogBytesDirectionReceive","abstract":"

    Undocumented

    ","parent_name":"SDLLogBytesDirection"},"Enums/SDLRPCStoreError.html#/c:@E@SDLRPCStoreError@SDLRPCStoreErrorGetInvalidObject":{"name":"SDLRPCStoreErrorGetInvalidObject","abstract":"

    In dictionary stored value with unexpected type

    ","parent_name":"SDLRPCStoreError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorUnknown":{"name":"SDLTransportErrorUnknown","abstract":"

    Connection cannot be established due to a reason not listed here.

    ","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionRefused":{"name":"SDLTransportErrorConnectionRefused","abstract":"

    TCP connection is refused.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorConnectionTimedOut":{"name":"SDLTransportErrorConnectionTimedOut","abstract":"

    TCP connection cannot be established within given time.","parent_name":"SDLTransportError"},"Enums/SDLTransportError.html#/c:@E@SDLTransportError@SDLTransportErrorNetworkDown":{"name":"SDLTransportErrorNetworkDown","abstract":"

    TCP connection cannot be established since network is down.","parent_name":"SDLTransportError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorPendingPresentationDeleted":{"name":"SDLChoiceSetManagerErrorPendingPresentationDeleted","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorDeletionFailed":{"name":"SDLChoiceSetManagerErrorDeletionFailed","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorUploadFailed":{"name":"SDLChoiceSetManagerErrorUploadFailed","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorFailedToCreateMenuItems":{"name":"SDLChoiceSetManagerErrorFailedToCreateMenuItems","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLChoiceSetManagerError.html#/c:@E@SDLChoiceSetManagerError@SDLChoiceSetManagerErrorInvalidState":{"name":"SDLChoiceSetManagerErrorInvalidState","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetManagerError"},"Enums/SDLMenuManagerError.html#/c:@E@SDLMenuManagerError@SDLMenuManagerErrorRPCsFailed":{"name":"SDLMenuManagerErrorRPCsFailed","abstract":"

    Undocumented

    ","parent_name":"SDLMenuManagerError"},"Enums/SDLSoftButtonManagerError.html#/c:@E@SDLSoftButtonManagerError@SDLSoftButtonManagerErrorPendingUpdateSuperseded":{"name":"SDLSoftButtonManagerErrorPendingUpdateSuperseded","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButtonManagerError"},"Enums/SDLTextAndGraphicManagerError.html#/c:@E@SDLTextAndGraphicManagerError@SDLTextAndGraphicManagerErrorPendingUpdateSuperseded":{"name":"SDLTextAndGraphicManagerErrorPendingUpdateSuperseded","abstract":"

    Undocumented

    ","parent_name":"SDLTextAndGraphicManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorCannotOverwrite":{"name":"SDLFileManagerErrorCannotOverwrite","abstract":"

    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.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorNoKnownFile":{"name":"SDLFileManagerErrorNoKnownFile","abstract":"

    A file was attempted to be accessed but it does not exist.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToStart":{"name":"SDLFileManagerErrorUnableToStart","abstract":"

    The file manager attempted to start but encountered an error.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorUnableToUpload":{"name":"SDLFileManagerErrorUnableToUpload","abstract":"

    The file manager was unable to send this file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDoesNotExist":{"name":"SDLFileManagerErrorFileDoesNotExist","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerUploadCanceled":{"name":"SDLFileManagerUploadCanceled","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileUploadTasksFailed":{"name":"SDLFileManagerMultipleFileUploadTasksFailed","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerMultipleFileDeleteTasksFailed":{"name":"SDLFileManagerMultipleFileDeleteTasksFailed","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorFileDataMissing":{"name":"SDLFileManagerErrorFileDataMissing","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLFileManagerError.html#/c:@E@SDLFileManagerError@SDLFileManagerErrorStaticIcon":{"name":"SDLFileManagerErrorStaticIcon","abstract":"

    The file manager could not find the local file.

    ","parent_name":"SDLFileManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRPCRequestFailed":{"name":"SDLManagerErrorRPCRequestFailed","abstract":"

    An RPC request failed to send.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotConnected":{"name":"SDLManagerErrorNotConnected","abstract":"

    Some action was attempted that requires a connection to the remote head unit.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorNotReady":{"name":"SDLManagerErrorNotReady","abstract":"

    Some action was attempted before the ready state was reached.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorUnknownRemoteError":{"name":"SDLManagerErrorUnknownRemoteError","abstract":"

    The remote system encountered an unknown error.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorManagersFailedToStart":{"name":"SDLManagerErrorManagersFailedToStart","abstract":"

    One or more of the sub-managers failed to start.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationFailed":{"name":"SDLManagerErrorRegistrationFailed","abstract":"

    Registering with the remote system failed.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorRegistrationSuccessWithWarning":{"name":"SDLManagerErrorRegistrationSuccessWithWarning","abstract":"

    Registering with the remote system was successful, but had a warning.

    ","parent_name":"SDLManagerError"},"Enums/SDLManagerError.html#/c:@E@SDLManagerError@SDLManagerErrorCancelled":{"name":"SDLManagerErrorCancelled","abstract":"

    Request operations were cancelled before they could be sent

    ","parent_name":"SDLManagerError"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutList":{"name":"SDLChoiceSetLayoutList","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetLayout"},"Enums/SDLChoiceSetLayout.html#/c:@E@SDLChoiceSetLayout@SDLChoiceSetLayoutTiles":{"name":"SDLChoiceSetLayoutTiles","abstract":"

    Undocumented

    ","parent_name":"SDLChoiceSetLayout"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNotConnected":{"name":"SDLAudioStreamManagerErrorNotConnected","abstract":"

    Undocumented

    ","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLAudioStreamManagerError.html#/c:@E@SDLAudioStreamManagerError@SDLAudioStreamManagerErrorNoQueuedAudio":{"name":"SDLAudioStreamManagerErrorNoQueuedAudio","abstract":"

    Undocumented

    ","parent_name":"SDLAudioStreamManagerError"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatPNG":{"name":"SDLArtworkImageFormatPNG","abstract":"

    Undocumented

    ","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html#/c:@E@SDLArtworkImageFormat@SDLArtworkImageFormatJPG":{"name":"SDLArtworkImageFormatJPG","abstract":"

    Undocumented

    ","parent_name":"SDLArtworkImageFormat"},"Enums/SDLArtworkImageFormat.html":{"name":"SDLArtworkImageFormat","abstract":"

    Undocumented

    "},"Enums/SDLAudioStreamManagerError.html":{"name":"SDLAudioStreamManagerError","abstract":"

    Undocumented

    "},"Enums/SDLChoiceSetLayout.html":{"name":"SDLChoiceSetLayout","abstract":"

    Undocumented

    "},"Enums/SDLManagerError.html":{"name":"SDLManagerError","abstract":"

    Errors associated with the SDLManager class.

    "},"Enums/SDLFileManagerError.html":{"name":"SDLFileManagerError","abstract":"

    Errors associated with the SDLFileManager class.

    "},"Enums/SDLTextAndGraphicManagerError.html":{"name":"SDLTextAndGraphicManagerError","abstract":"

    Errors associated with the ScreenManager class

    "},"Enums/SDLSoftButtonManagerError.html":{"name":"SDLSoftButtonManagerError","abstract":"

    Errors associated with the ScreenManager class

    "},"Enums/SDLMenuManagerError.html":{"name":"SDLMenuManagerError","abstract":"

    Errors associated with the ScreenManager class

    "},"Enums/SDLChoiceSetManagerError.html":{"name":"SDLChoiceSetManagerError","abstract":"

    Undocumented

    "},"Enums/SDLTransportError.html":{"name":"SDLTransportError","abstract":"

    Errors associated with transport.

    "},"Enums/SDLRPCStoreError.html":{"name":"SDLRPCStoreError","abstract":"

    Errors associated with store.

    "},"Enums/SDLLogBytesDirection.html":{"name":"SDLLogBytesDirection","abstract":"

    Undocumented

    "},"Enums/SDLLogFlag.html":{"name":"SDLLogFlag","abstract":"

    Flags used for SDLLogLevel to provide correct enum values. This is purely for internal use.

    "},"Enums/SDLLogLevel.html":{"name":"SDLLogLevel","abstract":"

    An enum describing a level of logging.

    "},"Enums/SDLLogFormatType.html":{"name":"SDLLogFormatType","abstract":"

    The output format of logs; how they will appear when printed out into a string.

    "},"Enums/SDLDynamicMenuUpdatesMode.html":{"name":"SDLDynamicMenuUpdatesMode","abstract":"

    Dynamic Menu Manager Mode

    "},"Enums/MenuCellState.html":{"name":"MenuCellState","abstract":"

    Undocumented

    "},"Enums/SDLPermissionGroupType.html":{"name":"SDLPermissionGroupType","abstract":"

    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.

    "},"Enums/SDLPermissionGroupStatus.html":{"name":"SDLPermissionGroupStatus","abstract":"

    The status of the group of RPCs permissions.

    "},"Enums/SDLRPCMessageType.html":{"name":"SDLRPCMessageType","abstract":"

    The type of RPC message

    "},"Enums/SDLCarWindowRenderingType.html":{"name":"SDLCarWindowRenderingType","abstract":"

    The type of rendering that CarWindow will perform. Depending on your app, you may need to try different ones for best performance

    "},"Enums/SDLStreamingEncryptionFlag.html":{"name":"SDLStreamingEncryptionFlag","abstract":"

    A flag determining how video and audio streaming should be encrypted

    "},"Constants.html#/c:@SDLAmbientLightStatusNight":{"name":"SDLAmbientLightStatusNight","abstract":"

    Represents a night ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight1":{"name":"SDLAmbientLightStatusTwilight1","abstract":"

    Represents a twilight 1 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight2":{"name":"SDLAmbientLightStatusTwilight2","abstract":"

    Represents a twilight 2 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight3":{"name":"SDLAmbientLightStatusTwilight3","abstract":"

    Represents a twilight 3 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusTwilight4":{"name":"SDLAmbientLightStatusTwilight4","abstract":"

    Represents a twilight 4 ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusDay":{"name":"SDLAmbientLightStatusDay","abstract":"

    Represents a day ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusUnknown":{"name":"SDLAmbientLightStatusUnknown","abstract":"

    Represents an unknown ambient light status

    "},"Constants.html#/c:@SDLAmbientLightStatusInvalid":{"name":"SDLAmbientLightStatusInvalid","abstract":"

    Represents a invalid ambient light status

    "},"Constants.html#/c:@SDLAppHMITypeDefault":{"name":"SDLAppHMITypeDefault","abstract":"

    The App will have default rights.

    "},"Constants.html#/c:@SDLAppHMITypeCommunication":{"name":"SDLAppHMITypeCommunication","abstract":"

    Communication type of App

    "},"Constants.html#/c:@SDLAppHMITypeMedia":{"name":"SDLAppHMITypeMedia","abstract":"

    App dealing with Media

    "},"Constants.html#/c:@SDLAppHMITypeMessaging":{"name":"SDLAppHMITypeMessaging","abstract":"

    Messaging App

    "},"Constants.html#/c:@SDLAppHMITypeNavigation":{"name":"SDLAppHMITypeNavigation","abstract":"

    Navigation App

    "},"Constants.html#/c:@SDLAppHMITypeInformation":{"name":"SDLAppHMITypeInformation","abstract":"

    Information App

    "},"Constants.html#/c:@SDLAppHMITypeSocial":{"name":"SDLAppHMITypeSocial","abstract":"

    App dealing with social media

    "},"Constants.html#/c:@SDLAppHMITypeProjection":{"name":"SDLAppHMITypeProjection","abstract":"

    App dealing with Mobile Projection applications

    "},"Constants.html#/c:@SDLAppHMITypeBackgroundProcess":{"name":"SDLAppHMITypeBackgroundProcess","abstract":"

    App designed for use in the background

    "},"Constants.html#/c:@SDLAppHMITypeTesting":{"name":"SDLAppHMITypeTesting","abstract":"

    App only for Testing purposes

    "},"Constants.html#/c:@SDLAppHMITypeSystem":{"name":"SDLAppHMITypeSystem","abstract":"

    System App

    "},"Constants.html#/c:@SDLAppHMITypeRemoteControl":{"name":"SDLAppHMITypeRemoteControl","abstract":"

    Remote control

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonIgnitionOff":{"name":"SDLAppInterfaceUnregisteredReasonIgnitionOff","abstract":"

    Vehicle ignition turned off.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonBluetoothOff":{"name":"SDLAppInterfaceUnregisteredReasonBluetoothOff","abstract":"

    Bluetooth was turned off, causing termination of a necessary Bluetooth connection.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUSBDisconnected":{"name":"SDLAppInterfaceUnregisteredReasonUSBDisconnected","abstract":"

    USB was disconnected, causing termination of a necessary iAP connection.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel":{"name":"SDLAppInterfaceUnregisteredReasonRequestWhileInNoneHMILevel","abstract":"

    Application attempted SmartDeviceLink RPC request while HMILevel = NONE. App must have HMILevel other than NONE to issue RPC requests or get notifications or RPC responses.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonTooManyRequests":{"name":"SDLAppInterfaceUnregisteredReasonTooManyRequests","abstract":"

    Either too many – or too many per unit of time – requests were made by the application.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonDriverDistractionViolation":{"name":"SDLAppInterfaceUnregisteredReasonDriverDistractionViolation","abstract":"

    The application has issued requests which cause driver distraction rules to be violated.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonLanguageChange":{"name":"SDLAppInterfaceUnregisteredReasonLanguageChange","abstract":"

    The user performed a language change on the SDL platform, causing the application to need to be reregistered for the new language.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonMasterReset":{"name":"SDLAppInterfaceUnregisteredReasonMasterReset","abstract":"

    The user performed a MASTER RESET on the SDL platform, causing removal of a necessary Bluetooth pairing.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonFactoryDefaults":{"name":"SDLAppInterfaceUnregisteredReasonFactoryDefaults","abstract":"

    The user restored settings to FACTORY DEFAULTS on the SDL platform.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonAppUnauthorized":{"name":"SDLAppInterfaceUnregisteredReasonAppUnauthorized","abstract":"

    The app is not being authorized to be connected to SDL.

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonProtocolViolation":{"name":"SDLAppInterfaceUnregisteredReasonProtocolViolation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource":{"name":"SDLAppInterfaceUnregisteredReasonUnsupportedHMIResource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppServiceTypeMedia":{"name":"SDLAppServiceTypeMedia","abstract":"

    The app will have a service type of media.

    "},"Constants.html#/c:@SDLAppServiceTypeWeather":{"name":"SDLAppServiceTypeWeather","abstract":"

    The app will have a service type of weather.

    "},"Constants.html#/c:@SDLAppServiceTypeNavigation":{"name":"SDLAppServiceTypeNavigation","abstract":"

    The app will have a service type of navigation.

    "},"Constants.html#/c:@SDLErrorDomainAudioStreamManager":{"name":"SDLErrorDomainAudioStreamManager","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamingIndicatorPlayPause":{"name":"SDLAudioStreamingIndicatorPlayPause","abstract":"

    Default playback indicator."},"Constants.html#/c:@SDLAudioStreamingIndicatorPlay":{"name":"SDLAudioStreamingIndicatorPlay","abstract":"

    Indicates that a button press of the Play/Pause button starts the audio playback.

    "},"Constants.html#/c:@SDLAudioStreamingIndicatorPause":{"name":"SDLAudioStreamingIndicatorPause","abstract":"

    Indicates that a button press of the Play/Pause button pauses the current audio playback.

    "},"Constants.html#/c:@SDLAudioStreamingIndicatorStop":{"name":"SDLAudioStreamingIndicatorStop","abstract":"

    Indicates that a button press of the Play/Pause button stops the current audio playback.

    "},"Constants.html#/c:@SDLAudioStreamingStateAudible":{"name":"SDLAudioStreamingStateAudible","abstract":"

    Currently streaming audio, if any, is audible to user.

    "},"Constants.html#/c:@SDLAudioStreamingStateAttenuated":{"name":"SDLAudioStreamingStateAttenuated","abstract":"

    Some kind of audio mixing is taking place. Currently streaming audio, if any, is audible to the user at a lowered volume.

    "},"Constants.html#/c:@SDLAudioStreamingStateNotAudible":{"name":"SDLAudioStreamingStateNotAudible","abstract":"

    Currently streaming audio, if any, is not audible to user. made via VR session.

    "},"Constants.html#/c:@SDLAudioTypePCM":{"name":"SDLAudioTypePCM","abstract":"

    PCM raw audio

    "},"Constants.html#/c:@SDLBitsPerSample8Bit":{"name":"SDLBitsPerSample8Bit","abstract":"

    8 bits per sample

    "},"Constants.html#/c:@SDLBitsPerSample16Bit":{"name":"SDLBitsPerSample16Bit","abstract":"

    16 bits per sample

    "},"Constants.html#/c:@SDLButtonEventModeButtonUp":{"name":"SDLButtonEventModeButtonUp","abstract":"

    The button was released

    "},"Constants.html#/c:@SDLButtonEventModeButtonDown":{"name":"SDLButtonEventModeButtonDown","abstract":"

    The button was depressed

    "},"Constants.html#/c:@SDLButtonNameOk":{"name":"SDLButtonNameOk","abstract":"

    Represents the button usually labeled OK. A typical use of this button is for the user to press it to make a selection. Prior to SDL Core 5.0 (iOS Proxy v.6.1), Ok was used for both OK buttons AND PlayPause. In 5.0, PlayPause was introduced to reduce confusion, and you should use the one you intend for your use case (usually PlayPause). Until the next proxy breaking change, however, subscribing to this button name will continue to subscribe you to PlayPause so that your code does not break. That means that if you subscribe to both Ok and PlayPause, you will receive duplicate notifications.

    "},"Constants.html#/c:@SDLButtonNamePlayPause":{"name":"SDLButtonNamePlayPause","abstract":"

    Represents the play/pause button for media apps. Replaces OK on sub-5.0 head units, compliments it on 5.0 head units and later.

    "},"Constants.html#/c:@SDLButtonNameSeekLeft":{"name":"SDLButtonNameSeekLeft","abstract":"

    Represents the seek-left button. A typical use of this button is for the user to scroll to the left through menu choices one menu item per press.

    "},"Constants.html#/c:@SDLButtonNameSeekRight":{"name":"SDLButtonNameSeekRight","abstract":"

    Represents the seek-right button. A typical use of this button is for the user to scroll to the right through menu choices one menu item per press.

    "},"Constants.html#/c:@SDLButtonNameTuneUp":{"name":"SDLButtonNameTuneUp","abstract":"

    Represents a turn of the tuner knob in the clockwise direction one tick.

    "},"Constants.html#/c:@SDLButtonNameTuneDown":{"name":"SDLButtonNameTuneDown","abstract":"

    Represents a turn of the tuner knob in the counter-clockwise direction one tick.

    "},"Constants.html#/c:@SDLButtonNamePreset0":{"name":"SDLButtonNamePreset0","abstract":"

    Represents the preset 0 button.

    "},"Constants.html#/c:@SDLButtonNamePreset1":{"name":"SDLButtonNamePreset1","abstract":"

    Represents the preset 1 button.

    "},"Constants.html#/c:@SDLButtonNamePreset2":{"name":"SDLButtonNamePreset2","abstract":"

    Represents the preset 2 button.

    "},"Constants.html#/c:@SDLButtonNamePreset3":{"name":"SDLButtonNamePreset3","abstract":"

    Represents the preset 3 button.

    "},"Constants.html#/c:@SDLButtonNamePreset4":{"name":"SDLButtonNamePreset4","abstract":"

    Represents the preset 4 button.

    "},"Constants.html#/c:@SDLButtonNamePreset5":{"name":"SDLButtonNamePreset5","abstract":"

    Represents the preset 5 button.

    "},"Constants.html#/c:@SDLButtonNamePreset6":{"name":"SDLButtonNamePreset6","abstract":"

    Represents the preset 6 button.

    "},"Constants.html#/c:@SDLButtonNamePreset7":{"name":"SDLButtonNamePreset7","abstract":"

    Represents the preset 7 button.

    "},"Constants.html#/c:@SDLButtonNamePreset8":{"name":"SDLButtonNamePreset8","abstract":"

    Represents the preset 8 button.

    "},"Constants.html#/c:@SDLButtonNamePreset9":{"name":"SDLButtonNamePreset9","abstract":"

    Represents the preset 9 button.

    "},"Constants.html#/c:@SDLButtonNameCustomButton":{"name":"SDLButtonNameCustomButton","abstract":"

    Represents the Custom button.

    "},"Constants.html#/c:@SDLButtonNameSearch":{"name":"SDLButtonNameSearch","abstract":"

    Represents the SEARCH button.

    "},"Constants.html#/c:@SDLButtonNameACMax":{"name":"SDLButtonNameACMax","abstract":"

    Represents AC max button *

    "},"Constants.html#/c:@SDLButtonNameAC":{"name":"SDLButtonNameAC","abstract":"

    Represents AC button *

    "},"Constants.html#/c:@SDLButtonNameRecirculate":{"name":"SDLButtonNameRecirculate","abstract":"

    Represents a Recirculate button

    "},"Constants.html#/c:@SDLButtonNameFanUp":{"name":"SDLButtonNameFanUp","abstract":"

    Represents a Fan up button

    "},"Constants.html#/c:@SDLButtonNameFanDown":{"name":"SDLButtonNameFanDown","abstract":"

    Represents a fan down button

    "},"Constants.html#/c:@SDLButtonNameTempUp":{"name":"SDLButtonNameTempUp","abstract":"

    Represents a temperature up button

    "},"Constants.html#/c:@SDLButtonNameTempDown":{"name":"SDLButtonNameTempDown","abstract":"

    Represents a temperature down button

    "},"Constants.html#/c:@SDLButtonNameDefrostMax":{"name":"SDLButtonNameDefrostMax","abstract":"

    Represents a Defrost max button.

    "},"Constants.html#/c:@SDLButtonNameDefrost":{"name":"SDLButtonNameDefrost","abstract":"

    Represents a Defrost button.

    "},"Constants.html#/c:@SDLButtonNameDefrostRear":{"name":"SDLButtonNameDefrostRear","abstract":"

    Represents a Defrost rear button.

    "},"Constants.html#/c:@SDLButtonNameUpperVent":{"name":"SDLButtonNameUpperVent","abstract":"

    Represents a Upper Vent button.

    "},"Constants.html#/c:@SDLButtonNameLowerVent":{"name":"SDLButtonNameLowerVent","abstract":"

    Represents a Lower vent button.

    "},"Constants.html#/c:@SDLButtonNameVolumeUp":{"name":"SDLButtonNameVolumeUp","abstract":"

    Represents a volume up button.

    "},"Constants.html#/c:@SDLButtonNameVolumeDown":{"name":"SDLButtonNameVolumeDown","abstract":"

    Represents a volume down button.

    "},"Constants.html#/c:@SDLButtonNameEject":{"name":"SDLButtonNameEject","abstract":"

    Represents a Eject Button.

    "},"Constants.html#/c:@SDLButtonNameSource":{"name":"SDLButtonNameSource","abstract":"

    Represents a Source button.

    "},"Constants.html#/c:@SDLButtonNameShuffle":{"name":"SDLButtonNameShuffle","abstract":"

    Represents a SHUFFLE button.

    "},"Constants.html#/c:@SDLButtonNameRepeat":{"name":"SDLButtonNameRepeat","abstract":"

    Represents a Repeat button.

    "},"Constants.html#/c:@SDLButtonPressModeLong":{"name":"SDLButtonPressModeLong","abstract":"

    A button was released, after it was pressed for a long time. Actual timing is defined by the head unit and may vary.

    "},"Constants.html#/c:@SDLButtonPressModeShort":{"name":"SDLButtonPressModeShort","abstract":"

    A button was released, after it was pressed for a short time. Actual timing is defined by the head unit and may vary.

    "},"Constants.html#/c:@SDLCarModeStatusNormal":{"name":"SDLCarModeStatusNormal","abstract":"

    Provides carmode NORMAL to each module.

    "},"Constants.html#/c:@SDLCarModeStatusFactory":{"name":"SDLCarModeStatusFactory","abstract":"

    Provides carmode FACTORY to each module.

    "},"Constants.html#/c:@SDLCarModeStatusTransport":{"name":"SDLCarModeStatusTransport","abstract":"

    Provides carmode TRANSPORT to each module.

    "},"Constants.html#/c:@SDLCarModeStatusCrash":{"name":"SDLCarModeStatusCrash","abstract":"

    Provides carmode CRASH to each module.

    "},"Constants.html#/c:@SDLCharacterSetType2":{"name":"SDLCharacterSetType2","abstract":"

    Character Set Type 2

    "},"Constants.html#/c:@SDLCharacterSetType5":{"name":"SDLCharacterSetType5","abstract":"

    Character Set Type 5

    "},"Constants.html#/c:@SDLCharacterSetCID1":{"name":"SDLCharacterSetCID1","abstract":"

    Character Set CID1

    "},"Constants.html#/c:@SDLCharacterSetCID2":{"name":"SDLCharacterSetCID2","abstract":"

    Character Set CID2

    "},"Constants.html#/c:@SDLCompassDirectionNorth":{"name":"SDLCompassDirectionNorth","abstract":"

    Direction North

    "},"Constants.html#/c:@SDLCompassDirectionNorthwest":{"name":"SDLCompassDirectionNorthwest","abstract":"

    Direction Northwest

    "},"Constants.html#/c:@SDLCompassDirectionWest":{"name":"SDLCompassDirectionWest","abstract":"

    Direction West

    "},"Constants.html#/c:@SDLCompassDirectionSouthwest":{"name":"SDLCompassDirectionSouthwest","abstract":"

    Direction Southwest

    "},"Constants.html#/c:@SDLCompassDirectionSouth":{"name":"SDLCompassDirectionSouth","abstract":"

    Direction South

    "},"Constants.html#/c:@SDLCompassDirectionSoutheast":{"name":"SDLCompassDirectionSoutheast","abstract":"

    Direction Southeast

    "},"Constants.html#/c:@SDLCompassDirectionEast":{"name":"SDLCompassDirectionEast","abstract":"

    Direction East

    "},"Constants.html#/c:@SDLCompassDirectionNortheast":{"name":"SDLCompassDirectionNortheast","abstract":"

    Direction Northeast

    "},"Constants.html#/c:@SDLComponentVolumeStatusUnknown":{"name":"SDLComponentVolumeStatusUnknown","abstract":"

    Unknown SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusNormal":{"name":"SDLComponentVolumeStatusNormal","abstract":"

    Normal SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusLow":{"name":"SDLComponentVolumeStatusLow","abstract":"

    Low SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusFault":{"name":"SDLComponentVolumeStatusFault","abstract":"

    Fault SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusAlert":{"name":"SDLComponentVolumeStatusAlert","abstract":"

    Alert SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLComponentVolumeStatusNotSupported":{"name":"SDLComponentVolumeStatusNotSupported","abstract":"

    Not supported SDLComponentVolumeStatus

    "},"Constants.html#/c:@SDLDefrostZoneFront":{"name":"SDLDefrostZoneFront","abstract":"

    A SDLDefrostZone with the value of FRONT

    "},"Constants.html#/c:@SDLDefrostZoneRear":{"name":"SDLDefrostZoneRear","abstract":"

    A SDLDefrostZone with the value of REAR

    "},"Constants.html#/c:@SDLDefrostZoneAll":{"name":"SDLDefrostZoneAll","abstract":"

    A SDLDefrostZone with the value of All

    "},"Constants.html#/c:@SDLDefrostZoneNone":{"name":"SDLDefrostZoneNone","abstract":"

    A SDLDefrostZone with the value of None

    "},"Constants.html#/c:@SDLDeliveryModePrompt":{"name":"SDLDeliveryModePrompt","abstract":"

    User is prompted on HMI

    "},"Constants.html#/c:@SDLDeliveryModeDestination":{"name":"SDLDeliveryModeDestination","abstract":"

    Set the location as destination without prompting the user

    "},"Constants.html#/c:@SDLDeliveryModeQueue":{"name":"SDLDeliveryModeQueue","abstract":"

    Adds the current location to navigation queue

    "},"Constants.html#/c:@SDLDeviceLevelStatusZeroBars":{"name":"SDLDeviceLevelStatusZeroBars","abstract":"

    Device battery level is zero bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusOneBar":{"name":"SDLDeviceLevelStatusOneBar","abstract":"

    Device battery level is one bar

    "},"Constants.html#/c:@SDLDeviceLevelStatusTwoBars":{"name":"SDLDeviceLevelStatusTwoBars","abstract":"

    Device battery level is two bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusThreeBars":{"name":"SDLDeviceLevelStatusThreeBars","abstract":"

    Device battery level is three bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusFourBars":{"name":"SDLDeviceLevelStatusFourBars","abstract":"

    Device battery level is four bars

    "},"Constants.html#/c:@SDLDeviceLevelStatusNotProvided":{"name":"SDLDeviceLevelStatusNotProvided","abstract":"

    Device battery level is unknown

    "},"Constants.html#/c:@SDLDimensionNoFix":{"name":"SDLDimensionNoFix","abstract":"

    No GPS at all

    "},"Constants.html#/c:@SDLDimension2D":{"name":"SDLDimension2D","abstract":"

    Longitude and latitude of the GPS

    "},"Constants.html#/c:@SDLDimension3D":{"name":"SDLDimension3D","abstract":"

    Longitude and latitude and altitude of the GPS

    "},"Constants.html#/c:@SDLDirectionLeft":{"name":"SDLDirectionLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDirectionRight":{"name":"SDLDirectionRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDisplayModeDay":{"name":"SDLDisplayModeDay","abstract":"

    @abstract Display Mode : DAY

    "},"Constants.html#/c:@SDLDisplayModeNight":{"name":"SDLDisplayModeNight","abstract":"

    @abstract Display Mode : NIGHT.

    "},"Constants.html#/c:@SDLDisplayModeAuto":{"name":"SDLDisplayModeAuto","abstract":"

    @abstract Display Mode : AUTO.

    "},"Constants.html#/c:@SDLDisplayTypeCID":{"name":"SDLDisplayTypeCID","abstract":"

    This display type provides a 2-line x 20 character dot matrix display.

    "},"Constants.html#/c:@SDLDisplayTypeType2":{"name":"SDLDisplayTypeType2","abstract":"

    Display type 2

    "},"Constants.html#/c:@SDLDisplayTypeType5":{"name":"SDLDisplayTypeType5","abstract":"

    Display type 5

    "},"Constants.html#/c:@SDLDisplayTypeNGN":{"name":"SDLDisplayTypeNGN","abstract":"

    This display type provides an 8 inch touchscreen display.

    "},"Constants.html#/c:@SDLDisplayTypeGen28DMA":{"name":"SDLDisplayTypeGen28DMA","abstract":"

    Display type Gen 28 DMA

    "},"Constants.html#/c:@SDLDisplayTypeGen26DMA":{"name":"SDLDisplayTypeGen26DMA","abstract":"

    Display type Gen 26 DMA

    "},"Constants.html#/c:@SDLDisplayTypeMFD3":{"name":"SDLDisplayTypeMFD3","abstract":"

    Display type MFD3

    "},"Constants.html#/c:@SDLDisplayTypeMFD4":{"name":"SDLDisplayTypeMFD4","abstract":"

    Display type MFD4

    "},"Constants.html#/c:@SDLDisplayTypeMFD5":{"name":"SDLDisplayTypeMFD5","abstract":"

    Display type MFD5

    "},"Constants.html#/c:@SDLDisplayTypeGen38Inch":{"name":"SDLDisplayTypeGen38Inch","abstract":"

    Display type Gen 3 8-inch

    "},"Constants.html#/c:@SDLDisplayTypeGeneric":{"name":"SDLDisplayTypeGeneric","abstract":"

    Display type Generic

    "},"Constants.html#/c:@SDLDistanceUnitMiles":{"name":"SDLDistanceUnitMiles","abstract":"

    @abstract SDLDistanceUnit: MILES

    "},"Constants.html#/c:@SDLDistanceUnitKilometers":{"name":"SDLDistanceUnitKilometers","abstract":"

    @abstract SDLDistanceUnit: KILOMETERS

    "},"Constants.html#/c:@SDLDriverDistractionStateOn":{"name":"SDLDriverDistractionStateOn","abstract":"

    Driver distraction rules are in effect.

    "},"Constants.html#/c:@SDLDriverDistractionStateOff":{"name":"SDLDriverDistractionStateOff","abstract":"

    Driver distraction rules are NOT in effect.

    "},"Constants.html#/c:@SDLECallConfirmationStatusNormal":{"name":"SDLECallConfirmationStatusNormal","abstract":"

    No E-Call signal triggered.

    "},"Constants.html#/c:@SDLECallConfirmationStatusInProgress":{"name":"SDLECallConfirmationStatusInProgress","abstract":"

    An E-Call is being in progress.

    "},"Constants.html#/c:@SDLECallConfirmationStatusCancelled":{"name":"SDLECallConfirmationStatusCancelled","abstract":"

    An E-Call was cancelled by the user.

    "},"Constants.html#/c:@SDLECallConfirmationStatusCompleted":{"name":"SDLECallConfirmationStatusCompleted","abstract":"

    The E-Call sequence is completed.

    "},"Constants.html#/c:@SDLECallConfirmationStatusUnsuccessful":{"name":"SDLECallConfirmationStatusUnsuccessful","abstract":"

    An E-Call could not be connected.

    "},"Constants.html#/c:@SDLECallConfirmationStatusConfiguredOff":{"name":"SDLECallConfirmationStatusConfiguredOff","abstract":"

    E-Call is not configured on this vehicle.

    "},"Constants.html#/c:@SDLECallConfirmationStatusCompleteDTMFTimeout":{"name":"SDLECallConfirmationStatusCompleteDTMFTimeout","abstract":"

    E-Call is considered to be complete without Emergency Operator contact.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusClosed":{"name":"SDLElectronicParkBrakeStatusClosed","abstract":"

    Parking brake actuators have been fully applied.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusTransition":{"name":"SDLElectronicParkBrakeStatusTransition","abstract":"

    Parking brake actuators are transitioning to either Apply/Closed or Release/Open state.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusOpen":{"name":"SDLElectronicParkBrakeStatusOpen","abstract":"

    Parking brake actuators are released.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusDriveActive":{"name":"SDLElectronicParkBrakeStatusDriveActive","abstract":"

    When driver pulls the Electronic Parking Brake switch while driving at speed.

    "},"Constants.html#/c:@SDLElectronicParkBrakeStatusFault":{"name":"SDLElectronicParkBrakeStatusFault","abstract":"

    When system has a fault or is under maintenance.

    "},"Constants.html#/c:@SDLEmergencyEventTypeNoEvent":{"name":"SDLEmergencyEventTypeNoEvent","abstract":"

    No emergency event has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeFrontal":{"name":"SDLEmergencyEventTypeFrontal","abstract":"

    Frontal collision has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeSide":{"name":"SDLEmergencyEventTypeSide","abstract":"

    Side collision has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeRear":{"name":"SDLEmergencyEventTypeRear","abstract":"

    Rear collision has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeRollover":{"name":"SDLEmergencyEventTypeRollover","abstract":"

    A rollover event has happened.

    "},"Constants.html#/c:@SDLEmergencyEventTypeNotSupported":{"name":"SDLEmergencyEventTypeNotSupported","abstract":"

    The signal is not supported

    "},"Constants.html#/c:@SDLEmergencyEventTypeFault":{"name":"SDLEmergencyEventTypeFault","abstract":"

    Emergency status cannot be determined

    "},"Constants.html#/c:@SDLFileTypeBMP":{"name":"SDLFileTypeBMP","abstract":"

    file type: Bitmap (BMP)

    "},"Constants.html#/c:@SDLFileTypeJPEG":{"name":"SDLFileTypeJPEG","abstract":"

    file type: JPEG

    "},"Constants.html#/c:@SDLFileTypePNG":{"name":"SDLFileTypePNG","abstract":"

    file type: PNG

    "},"Constants.html#/c:@SDLFileTypeWAV":{"name":"SDLFileTypeWAV","abstract":"

    file type: WAVE (WAV)

    "},"Constants.html#/c:@SDLFileTypeMP3":{"name":"SDLFileTypeMP3","abstract":"

    file type: MP3

    "},"Constants.html#/c:@SDLFileTypeAAC":{"name":"SDLFileTypeAAC","abstract":"

    file type: AAC

    "},"Constants.html#/c:@SDLFileTypeBinary":{"name":"SDLFileTypeBinary","abstract":"

    file type: BINARY

    "},"Constants.html#/c:@SDLFileTypeJSON":{"name":"SDLFileTypeJSON","abstract":"

    file type: JSON

    "},"Constants.html#/c:@SDLFuelCutoffStatusTerminateFuel":{"name":"SDLFuelCutoffStatusTerminateFuel","abstract":"

    Fuel is cut off

    "},"Constants.html#/c:@SDLFuelCutoffStatusNormalOperation":{"name":"SDLFuelCutoffStatusNormalOperation","abstract":"

    Fuel is not cut off

    "},"Constants.html#/c:@SDLFuelCutoffStatusFault":{"name":"SDLFuelCutoffStatusFault","abstract":"

    Status of the fuel pump cannot be determined

    "},"Constants.html#/c:@SDLFuelTypeGasoline":{"name":"SDLFuelTypeGasoline","abstract":"

    Fuel type: Gasoline

    "},"Constants.html#/c:@SDLFuelTypeDiesel":{"name":"SDLFuelTypeDiesel","abstract":"

    Fuel type: Diesel

    "},"Constants.html#/c:@SDLFuelTypeCNG":{"name":"SDLFuelTypeCNG","abstract":"

    Fuel type: CNG

    "},"Constants.html#/c:@SDLFuelTypeLPG":{"name":"SDLFuelTypeLPG","abstract":"

    Fuel type: LPG

    "},"Constants.html#/c:@SDLFuelTypeHydrogen":{"name":"SDLFuelTypeHydrogen","abstract":"

    Fuel type: Hydrogen

    "},"Constants.html#/c:@SDLFuelTypeBattery":{"name":"SDLFuelTypeBattery","abstract":"

    Fuel type: Battery

    "},"Constants.html#/c:@SDLGlobalPropertyHelpPrompt":{"name":"SDLGlobalPropertyHelpPrompt","abstract":"

    The help prompt to be spoken if the user needs assistance during a user-initiated interaction.

    "},"Constants.html#/c:@SDLGlobalPropertyTimeoutPrompt":{"name":"SDLGlobalPropertyTimeoutPrompt","abstract":"

    The prompt to be spoken if the user-initiated interaction times out waiting for the user’s verbal input.

    "},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpTitle":{"name":"SDLGlobalPropertyVoiceRecognitionHelpTitle","abstract":"

    The title of the menu displayed when the user requests help via voice recognition.

    "},"Constants.html#/c:@SDLGlobalPropertyVoiceRecognitionHelpItems":{"name":"SDLGlobalPropertyVoiceRecognitionHelpItems","abstract":"

    Items of the menu displayed when the user requests help via voice recognition.

    "},"Constants.html#/c:@SDLGlobalPropertyMenuName":{"name":"SDLGlobalPropertyMenuName","abstract":"

    The name of the menu button displayed in templates

    "},"Constants.html#/c:@SDLGlobalPropertyMenuIcon":{"name":"SDLGlobalPropertyMenuIcon","abstract":"

    An icon on the menu button displayed in templates

    "},"Constants.html#/c:@SDLGlobalPropertyKeyboard":{"name":"SDLGlobalPropertyKeyboard","abstract":"

    Property related to the keyboard

    "},"Constants.html#/c:@SDLHMILevelFull":{"name":"SDLHMILevelFull","abstract":"

    The application has full use of the SDL HMI. The app may output via TTS, display, or streaming audio and may gather input via VR, Menu, and button presses

    "},"Constants.html#/c:@SDLHMILevelLimited":{"name":"SDLHMILevelLimited","abstract":"

    This HMI Level is only defined for a media application using an HMI with an 8 inch touchscreen (Nav) system. The application’s Show text is displayed and it receives button presses from media-oriented buttons (SEEKRIGHT, SEEKLEFT, TUNEUP, TUNEDOWN, PRESET_0-9)

    "},"Constants.html#/c:@SDLHMILevelBackground":{"name":"SDLHMILevelBackground","abstract":"

    App cannot interact with user via TTS, VR, Display or Button Presses. App can perform the following operations:

    "},"Constants.html#/c:@SDLHMILevelNone":{"name":"SDLHMILevelNone","abstract":"

    Application has been discovered by SDL, but it cannot send any requests or receive any notifications

    "},"Constants.html#/c:@SDLHMIZoneCapabilitiesFront":{"name":"SDLHMIZoneCapabilitiesFront","abstract":"

    Indicates HMI available for front seat passengers.

    "},"Constants.html#/c:@SDLHMIZoneCapabilitiesBack":{"name":"SDLHMIZoneCapabilitiesBack","abstract":"

    Indicates HMI available for rear seat passengers.

    "},"Constants.html#/c:@SDLHybridAppPreferenceMobile":{"name":"SDLHybridAppPreferenceMobile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLHybridAppPreferenceCloud":{"name":"SDLHybridAppPreferenceCloud","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLHybridAppPreferenceBoth":{"name":"SDLHybridAppPreferenceBoth","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLIgnitionStableStatusNotStable":{"name":"SDLIgnitionStableStatusNotStable","abstract":"

    The current ignition switch status is considered not to be stable.

    "},"Constants.html#/c:@SDLIgnitionStableStatusStable":{"name":"SDLIgnitionStableStatusStable","abstract":"

    The current ignition switch status is considered to be stable.

    "},"Constants.html#/c:@SDLIgnitionStableStatusMissingFromTransmitter":{"name":"SDLIgnitionStableStatusMissingFromTransmitter","abstract":"

    The current ignition switch status is considered to be missing from the transmitter

    "},"Constants.html#/c:@SDLIgnitionStatusUnknown":{"name":"SDLIgnitionStatusUnknown","abstract":"

    Ignition status currently unknown

    "},"Constants.html#/c:@SDLIgnitionStatusOff":{"name":"SDLIgnitionStatusOff","abstract":"

    Ignition is off

    "},"Constants.html#/c:@SDLIgnitionStatusAccessory":{"name":"SDLIgnitionStatusAccessory","abstract":"

    Ignition is in mode accessory

    "},"Constants.html#/c:@SDLIgnitionStatusRun":{"name":"SDLIgnitionStatusRun","abstract":"

    Ignition is in mode run

    "},"Constants.html#/c:@SDLIgnitionStatusStart":{"name":"SDLIgnitionStatusStart","abstract":"

    Ignition is in mode start

    "},"Constants.html#/c:@SDLIgnitionStatusInvalid":{"name":"SDLIgnitionStatusInvalid","abstract":"

    Signal is invalid

    "},"Constants.html#/c:@SDLImageFieldNameSoftButtonImage":{"name":"SDLImageFieldNameSoftButtonImage","abstract":"

    The image field for SoftButton

    "},"Constants.html#/c:@SDLImageFieldNameChoiceImage":{"name":"SDLImageFieldNameChoiceImage","abstract":"

    The first image field for Choice.

    "},"Constants.html#/c:@SDLImageFieldNameChoiceSecondaryImage":{"name":"SDLImageFieldNameChoiceSecondaryImage","abstract":"

    The scondary image field for Choice.

    "},"Constants.html#/c:@SDLImageFieldNameVoiceRecognitionHelpItem":{"name":"SDLImageFieldNameVoiceRecognitionHelpItem","abstract":"

    The image field for vrHelpItem.

    "},"Constants.html#/c:@SDLImageFieldNameTurnIcon":{"name":"SDLImageFieldNameTurnIcon","abstract":"

    The image field for Turn.

    "},"Constants.html#/c:@SDLImageFieldNameMenuIcon":{"name":"SDLImageFieldNameMenuIcon","abstract":"

    The image field for the menu icon in SetGlobalProperties.

    "},"Constants.html#/c:@SDLImageFieldNameCommandIcon":{"name":"SDLImageFieldNameCommandIcon","abstract":"

    The image field for AddCommand."},"Constants.html#/c:@SDLImageFieldNameAppIcon":{"name":"SDLImageFieldNameAppIcon","abstract":"

    The image field for the app icon (set by setAppIcon).

    "},"Constants.html#/c:@SDLImageFieldNameGraphic":{"name":"SDLImageFieldNameGraphic","abstract":"

    The primary image field for Show."},"Constants.html#/c:@SDLImageFieldNameSecondaryGraphic":{"name":"SDLImageFieldNameSecondaryGraphic","abstract":"

    The secondary image field for Show."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTIcon":{"name":"SDLImageFieldNameShowConstantTBTIcon","abstract":"

    The primary image field for ShowConstant TBT."},"Constants.html#/c:@SDLImageFieldNameShowConstantTBTNextTurnIcon":{"name":"SDLImageFieldNameShowConstantTBTNextTurnIcon","abstract":"

    The secondary image field for ShowConstant TBT.

    "},"Constants.html#/c:@SDLImageFieldNameLocationImage":{"name":"SDLImageFieldNameLocationImage","abstract":"

    The optional image of a destination / location

    "},"Constants.html#/c:@SDLImageTypeStatic":{"name":"SDLImageTypeStatic","abstract":"

    Activate an icon that shipped with the IVI system by passing a hex value.

    "},"Constants.html#/c:@SDLImageTypeDynamic":{"name":"SDLImageTypeDynamic","abstract":"

    An icon referencing an image uploaded by the app (identifier to be sent by SDLPutFile)

    "},"Constants.html#/c:@SDLInteractionModeManualOnly":{"name":"SDLInteractionModeManualOnly","abstract":"

    Interaction Mode : Manual Only

    "},"Constants.html#/c:@SDLInteractionModeVoiceRecognitionOnly":{"name":"SDLInteractionModeVoiceRecognitionOnly","abstract":"

    Interaction Mode : VR Only

    "},"Constants.html#/c:@SDLInteractionModeBoth":{"name":"SDLInteractionModeBoth","abstract":"

    Interaction Mode : Manual & VR

    "},"Constants.html#/c:@SDLKeyboardEventKeypress":{"name":"SDLKeyboardEventKeypress","abstract":"

    The use has pressed the keyboard key (applies to both SINGLE_KEYPRESS and RESEND_CURRENT_ENTRY modes).

    "},"Constants.html#/c:@SDLKeyboardEventSubmitted":{"name":"SDLKeyboardEventSubmitted","abstract":"

    The User has finished entering text from the keyboard and submitted the entry.

    "},"Constants.html#/c:@SDLKeyboardEventCancelled":{"name":"SDLKeyboardEventCancelled","abstract":"

    The User has pressed the HMI-defined Cancel button.

    "},"Constants.html#/c:@SDLKeyboardEventAborted":{"name":"SDLKeyboardEventAborted","abstract":"

    The User has not finished entering text and the keyboard is aborted with the event of higher priority.

    "},"Constants.html#/c:@SDLKeyboardEventVoice":{"name":"SDLKeyboardEventVoice","abstract":"

    The user used voice as input for the keyboard

    "},"Constants.html#/c:@SDLKeyboardLayoutQWERTY":{"name":"SDLKeyboardLayoutQWERTY","abstract":"

    QWERTY layout (the name comes from the first six keys
    appearing on the top left letter row of the keyboard and read from left to right)

    "},"Constants.html#/c:@SDLKeyboardLayoutQWERTZ":{"name":"SDLKeyboardLayoutQWERTZ","abstract":"

    QWERTZ layout (the name comes from the first six keys
    appearing on the top left letter row of the keyboard and read from left to right)

    "},"Constants.html#/c:@SDLKeyboardLayoutAZERTY":{"name":"SDLKeyboardLayoutAZERTY","abstract":"

    AZERTY layout (the name comes from the first six keys
    appearing on the top left letter row of the keyboard and read from left to right)

    "},"Constants.html#/c:@SDLKeypressModeSingleKeypress":{"name":"SDLKeypressModeSingleKeypress","abstract":"

    SINGLE_KEYPRESS:
    Each and every User`s keypress must be reported (new notification for every newly entered single symbol).

    "},"Constants.html#/c:@SDLKeypressModeQueueKeypresses":{"name":"SDLKeypressModeQueueKeypresses","abstract":"

    QUEUE_KEYPRESSES:
    The whole entry is reported only after the User submits it (by ‘Search’ button click displayed on touchscreen keyboard)

    "},"Constants.html#/c:@SDLKeypressModeResendCurrentEntry":{"name":"SDLKeypressModeResendCurrentEntry","abstract":"

    RESEND_CURRENT_ENTRY:
    The whole entry must be reported each and every time the User makes a new keypress
    (new notification with all previously entered symbols and a newly entered one appended).

    "},"Constants.html#/c:@SDLLanguageEnSa":{"name":"SDLLanguageEnSa","abstract":"

    English_SA

    "},"Constants.html#/c:@SDLLanguageHeIl":{"name":"SDLLanguageHeIl","abstract":"

    Hebrew_IL

    "},"Constants.html#/c:@SDLLanguageRoRo":{"name":"SDLLanguageRoRo","abstract":"

    Romainian_RO

    "},"Constants.html#/c:@SDLLanguageUkUa":{"name":"SDLLanguageUkUa","abstract":"

    Ukrainian_UA

    "},"Constants.html#/c:@SDLLanguageIdId":{"name":"SDLLanguageIdId","abstract":"

    Indonesian_ID

    "},"Constants.html#/c:@SDLLanguageViVn":{"name":"SDLLanguageViVn","abstract":"

    Vietnamese_VN

    "},"Constants.html#/c:@SDLLanguageMsMy":{"name":"SDLLanguageMsMy","abstract":"

    Malay_MY

    "},"Constants.html#/c:@SDLLanguageHiIn":{"name":"SDLLanguageHiIn","abstract":"

    Hindi_IN

    "},"Constants.html#/c:@SDLLanguageNlBe":{"name":"SDLLanguageNlBe","abstract":"

    Dutch(Flemish)_BE

    "},"Constants.html#/c:@SDLLanguageElGr":{"name":"SDLLanguageElGr","abstract":"

    Greek_GR

    "},"Constants.html#/c:@SDLLanguageHuHu":{"name":"SDLLanguageHuHu","abstract":"

    Hungarian_HU

    "},"Constants.html#/c:@SDLLanguageFiFi":{"name":"SDLLanguageFiFi","abstract":"

    Finnish_FI

    "},"Constants.html#/c:@SDLLanguageSkSk":{"name":"SDLLanguageSkSk","abstract":"

    Slovak_SK

    "},"Constants.html#/c:@SDLLanguageEnUs":{"name":"SDLLanguageEnUs","abstract":"

    English_US

    "},"Constants.html#/c:@SDLLanguageEnIn":{"name":"SDLLanguageEnIn","abstract":"

    English - India

    "},"Constants.html#/c:@SDLLanguageThTh":{"name":"SDLLanguageThTh","abstract":"

    Thai - Thailand

    "},"Constants.html#/c:@SDLLanguageEsMx":{"name":"SDLLanguageEsMx","abstract":"

    Spanish - Mexico

    "},"Constants.html#/c:@SDLLanguageFrCa":{"name":"SDLLanguageFrCa","abstract":"

    French - Canada

    "},"Constants.html#/c:@SDLLanguageDeDe":{"name":"SDLLanguageDeDe","abstract":"

    German - Germany

    "},"Constants.html#/c:@SDLLanguageEsEs":{"name":"SDLLanguageEsEs","abstract":"

    Spanish - Spain

    "},"Constants.html#/c:@SDLLanguageEnGb":{"name":"SDLLanguageEnGb","abstract":"

    English - Great Britain

    "},"Constants.html#/c:@SDLLanguageRuRu":{"name":"SDLLanguageRuRu","abstract":"

    Russian - Russia

    "},"Constants.html#/c:@SDLLanguageTrTr":{"name":"SDLLanguageTrTr","abstract":"

    Turkish - Turkey

    "},"Constants.html#/c:@SDLLanguagePlPl":{"name":"SDLLanguagePlPl","abstract":"

    Polish - Poland

    "},"Constants.html#/c:@SDLLanguageFrFr":{"name":"SDLLanguageFrFr","abstract":"

    French - France

    "},"Constants.html#/c:@SDLLanguageItIt":{"name":"SDLLanguageItIt","abstract":"

    Italian - Italy

    "},"Constants.html#/c:@SDLLanguageSvSe":{"name":"SDLLanguageSvSe","abstract":"

    Swedish - Sweden

    "},"Constants.html#/c:@SDLLanguagePtPt":{"name":"SDLLanguagePtPt","abstract":"

    Portuguese - Portugal

    "},"Constants.html#/c:@SDLLanguageNlNl":{"name":"SDLLanguageNlNl","abstract":"

    Dutch (Standard) - Netherlands

    "},"Constants.html#/c:@SDLLanguageEnAu":{"name":"SDLLanguageEnAu","abstract":"

    English - Australia

    "},"Constants.html#/c:@SDLLanguageZhCn":{"name":"SDLLanguageZhCn","abstract":"

    Mandarin - China

    "},"Constants.html#/c:@SDLLanguageZhTw":{"name":"SDLLanguageZhTw","abstract":"

    Mandarin - Taiwan

    "},"Constants.html#/c:@SDLLanguageJaJp":{"name":"SDLLanguageJaJp","abstract":"

    Japanese - Japan

    "},"Constants.html#/c:@SDLLanguageArSa":{"name":"SDLLanguageArSa","abstract":"

    Arabic - Saudi Arabia

    "},"Constants.html#/c:@SDLLanguageKoKr":{"name":"SDLLanguageKoKr","abstract":"

    Korean - South Korea

    "},"Constants.html#/c:@SDLLanguagePtBr":{"name":"SDLLanguagePtBr","abstract":"

    Portuguese - Brazil

    "},"Constants.html#/c:@SDLLanguageCsCz":{"name":"SDLLanguageCsCz","abstract":"

    Czech - Czech Republic

    "},"Constants.html#/c:@SDLLanguageDaDk":{"name":"SDLLanguageDaDk","abstract":"

    Danish - Denmark

    "},"Constants.html#/c:@SDLLanguageNoNo":{"name":"SDLLanguageNoNo","abstract":"

    Norwegian - Norway

    "},"Constants.html#/c:@SDLLayoutModeIconOnly":{"name":"SDLLayoutModeIconOnly","abstract":"

    This mode causes the interaction to display the previous set of choices as icons.

    "},"Constants.html#/c:@SDLLayoutModeIconWithSearch":{"name":"SDLLayoutModeIconWithSearch","abstract":"

    This mode causes the interaction to display the previous set of choices as icons along with a search field in the HMI.

    "},"Constants.html#/c:@SDLLayoutModeListOnly":{"name":"SDLLayoutModeListOnly","abstract":"

    This mode causes the interaction to display the previous set of choices as a list.

    "},"Constants.html#/c:@SDLLayoutModeListWithSearch":{"name":"SDLLayoutModeListWithSearch","abstract":"

    This mode causes the interaction to display the previous set of choices as a list along with a search field in the HMI.

    "},"Constants.html#/c:@SDLLayoutModeKeyboard":{"name":"SDLLayoutModeKeyboard","abstract":"

    This mode causes the interaction to immediately display a keyboard entry through the HMI.

    "},"Constants.html#/c:@SDLLightNameFrontLeftHighBeam":{"name":"SDLLightNameFrontLeftHighBeam","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_HIGH_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontRightHighBeam":{"name":"SDLLightNameFrontRightHighBeam","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_HIGH_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontLeftLowBeam":{"name":"SDLLightNameFrontLeftLowBeam","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_LOW_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontRightLowBeam":{"name":"SDLLightNameFrontRightLowBeam","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_LOW_BEAM.

    "},"Constants.html#/c:@SDLLightNameFrontLeftParkingLight":{"name":"SDLLightNameFrontLeftParkingLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_PARKING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightParkingLight":{"name":"SDLLightNameFrontRightParkingLight","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_PARKING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontLeftFogLight":{"name":"SDLLightNameFrontLeftFogLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_FOG_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightFogLight":{"name":"SDLLightNameFrontRightFogLight","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_FOG_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontLeftDaytimeRunningLight":{"name":"SDLLightNameFrontLeftDaytimeRunningLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_DAYTIME_RUNNING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightDaytimeRunningLight":{"name":"SDLLightNameFrontRightDaytimeRunningLight","abstract":"

    @abstract Represents the Light with name FRONT_RIGHT_DAYTIME_RUNNING_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontLeftTurnLight":{"name":"SDLLightNameFrontLeftTurnLight","abstract":"

    @abstract Represents the Light with name FRONT_LEFT_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameFrontRightTurnLight":{"name":"SDLLightNameFrontRightTurnLight","abstract":"

    @abstract Represents the Light with name FRONT_Right_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftFogLight":{"name":"SDLLightNameRearLeftFogLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_FOG_LIGHT.

    "},"Constants.html#/c:@SDLLightNameRearRightFogLight":{"name":"SDLLightNameRearRightFogLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_FOG_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftTailLight":{"name":"SDLLightNameRearLeftTailLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_TAIL_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRightTailLight":{"name":"SDLLightNameRearRightTailLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_TAIL_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftBrakeLight":{"name":"SDLLightNameRearLeftBrakeLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_BRAKE_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRightBrakeLight":{"name":"SDLLightNameRearRightBrakeLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_BRAKE_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearLeftTurnLight":{"name":"SDLLightNameRearLeftTurnLight","abstract":"

    @abstract Represents the Light with name REAR_LEFT_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRightTurnLight":{"name":"SDLLightNameRearRightTurnLight","abstract":"

    @abstract Represents the Light with name REAR_RIGHT_TURN_LIGHT

    "},"Constants.html#/c:@SDLLightNameRearRegistrationPlateLight":{"name":"SDLLightNameRearRegistrationPlateLight","abstract":"

    @abstract Represents the Light with name REAR_REGISTRATION_PLATE_LIGHT

    "},"Constants.html#/c:@SDLLightNameHighBeams":{"name":"SDLLightNameHighBeams","abstract":"

    @abstract Include all high beam lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameLowBeams":{"name":"SDLLightNameLowBeams","abstract":"

    @abstract Include all low beam lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameFogLights":{"name":"SDLLightNameFogLights","abstract":"

    @abstract Include all fog lights: front_left, front_right, rear_left and rear_right.

    "},"Constants.html#/c:@SDLLightNameRunningLights":{"name":"SDLLightNameRunningLights","abstract":"

    @abstract Include all daytime running lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameParkingLights":{"name":"SDLLightNameParkingLights","abstract":"

    @abstract Include all parking lights: front_left and front_right.

    "},"Constants.html#/c:@SDLLightNameBrakeLights":{"name":"SDLLightNameBrakeLights","abstract":"

    @abstract Include all brake lights: rear_left and rear_right.

    "},"Constants.html#/c:@SDLLightNameRearReversingLights":{"name":"SDLLightNameRearReversingLights","abstract":"

    @abstract Represents the Light with name REAR_REVERSING_LIGHTS

    "},"Constants.html#/c:@SDLLightNameSideMarkerLights":{"name":"SDLLightNameSideMarkerLights","abstract":"

    @abstract Represents the Light with name SIDE_MARKER_LIGHTS

    "},"Constants.html#/c:@SDLLightNameLeftTurnLights":{"name":"SDLLightNameLeftTurnLights","abstract":"

    @abstract Include all left turn signal lights: front_left, rear_left, left_side and mirror_mounted.

    "},"Constants.html#/c:@SDLLightNameRightTurnLights":{"name":"SDLLightNameRightTurnLights","abstract":"

    @abstract Include all right turn signal lights: front_right, rear_right, right_side and mirror_mounted.

    "},"Constants.html#/c:@SDLLightNameHazardLights":{"name":"SDLLightNameHazardLights","abstract":"

    @abstract Include all hazard lights: front_left, front_right, rear_left and rear_right.

    "},"Constants.html#/c:@SDLLightNameAmbientLights":{"name":"SDLLightNameAmbientLights","abstract":"

    @abstract Represents the Light with name AMBIENT_LIGHTS

    "},"Constants.html#/c:@SDLLightNameOverHeadLights":{"name":"SDLLightNameOverHeadLights","abstract":"

    @abstract Represents the Light with name OVERHEAD_LIGHTS

    "},"Constants.html#/c:@SDLLightNameReadingLights":{"name":"SDLLightNameReadingLights","abstract":"

    @abstract Represents the Light with name READING_LIGHTS

    "},"Constants.html#/c:@SDLLightNameTrunkLights":{"name":"SDLLightNameTrunkLights","abstract":"

    @abstract Represents the Light with name TRUNK_LIGHTS

    "},"Constants.html#/c:@SDLLightNameExteriorFrontLights":{"name":"SDLLightNameExteriorFrontLights","abstract":"

    @abstract Include exterior lights located in front of the vehicle. For example, fog lights and low beams.

    "},"Constants.html#/c:@SDLLightNameExteriorRearLights":{"name":"SDLLightNameExteriorRearLights","abstract":"

    @abstract Include exterior lights located at the back of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorLeftLights":{"name":"SDLLightNameExteriorLeftLights","abstract":"

    @abstract Include exterior lights located at the left side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRightLights":{"name":"SDLLightNameExteriorRightLights","abstract":"

    @abstract Include exterior lights located at the right side of the vehicle."},"Constants.html#/c:@SDLLightNameExteriorRearCargoLights":{"name":"SDLLightNameExteriorRearCargoLights","abstract":"

    @abstract Cargo lamps illuminate the cargo area.

    "},"Constants.html#/c:@SDLLightNameExteriorRearTruckBedLights":{"name":"SDLLightNameExteriorRearTruckBedLights","abstract":"

    @abstract Truck bed lamps light up the bed of the truck.

    "},"Constants.html#/c:@SDLLightNameExteriorRearTrailerLights":{"name":"SDLLightNameExteriorRearTrailerLights","abstract":"

    @abstract Trailer lights are lamps mounted on a trailer hitch.

    "},"Constants.html#/c:@SDLLightNameExteriorLeftSpotLights":{"name":"SDLLightNameExteriorLeftSpotLights","abstract":"

    @abstract It is the spotlights mounted on the left side of a vehicle.

    "},"Constants.html#/c:@SDLLightNameExteriorRightSpotLights":{"name":"SDLLightNameExteriorRightSpotLights","abstract":"

    @abstract It is the spotlights mounted on the right side of a vehicle.

    "},"Constants.html#/c:@SDLLightNameExteriorLeftPuddleLights":{"name":"SDLLightNameExteriorLeftPuddleLights","abstract":"

    @abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.

    "},"Constants.html#/c:@SDLLightNameExteriorRightPuddleLights":{"name":"SDLLightNameExteriorRightPuddleLights","abstract":"

    @abstract Puddle lamps illuminate the ground beside the door as the customer is opening or approaching the door.

    "},"Constants.html#/c:@SDLLightNameExteriorAllLights":{"name":"SDLLightNameExteriorAllLights","abstract":"

    @abstract Include all exterior lights around the vehicle.

    "},"Constants.html#/c:@SDLLightStatusOn":{"name":"SDLLightStatusOn","abstract":"

    @abstract Light status currently on.

    "},"Constants.html#/c:@SDLLightStatusOFF":{"name":"SDLLightStatusOFF","abstract":"

    @abstract Light status currently Off.

    "},"Constants.html#/c:@SDLLightStatusRampUp":{"name":"SDLLightStatusRampUp","abstract":"

    @abstract Light status currently RAMP_UP.

    "},"Constants.html#/c:@SDLLightStatusRampDown":{"name":"SDLLightStatusRampDown","abstract":"

    @abstract Light status currently RAMP_DOWN.

    "},"Constants.html#/c:@SDLLightStatusUnknown":{"name":"SDLLightStatusUnknown","abstract":"

    @abstract Light status currently UNKNOWN.

    "},"Constants.html#/c:@SDLLightStatusInvalid":{"name":"SDLLightStatusInvalid","abstract":"

    @abstract Light status currently INVALID.

    "},"Constants.html#/c:@SDLLockScreenStatusOff":{"name":"SDLLockScreenStatusOff","abstract":"

    LockScreen is Not Required

    "},"Constants.html#/c:@SDLLockScreenStatusOptional":{"name":"SDLLockScreenStatusOptional","abstract":"

    LockScreen is Optional

    "},"Constants.html#/c:@SDLLockScreenStatusRequired":{"name":"SDLLockScreenStatusRequired","abstract":"

    LockScreen is Not Required

    "},"Constants.html#/c:@SDLMaintenanceModeStatusNormal":{"name":"SDLMaintenanceModeStatusNormal","abstract":"

    Maintenance Mode Status : Normal

    "},"Constants.html#/c:@SDLMaintenanceModeStatusNear":{"name":"SDLMaintenanceModeStatusNear","abstract":"

    Maintenance Mode Status : Near

    "},"Constants.html#/c:@SDLMaintenanceModeStatusActive":{"name":"SDLMaintenanceModeStatusActive","abstract":"

    Maintenance Mode Status : Active

    "},"Constants.html#/c:@SDLMaintenanceModeStatusFeatureNotPresent":{"name":"SDLMaintenanceModeStatusFeatureNotPresent","abstract":"

    Maintenance Mode Status : Feature not present

    "},"Constants.html#/c:@SDLMassageCushionTopLumbar":{"name":"SDLMassageCushionTopLumbar","abstract":"

    @abstract TOP LUMBAR cushions of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionMiddleLumbar":{"name":"SDLMassageCushionMiddleLumbar","abstract":"

    @abstract MIDDLE LUMBAR cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionBottomLumbar":{"name":"SDLMassageCushionBottomLumbar","abstract":"

    @abstract BOTTOM LUMBAR cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionBackBolsters":{"name":"SDLMassageCushionBackBolsters","abstract":"

    @abstract BACK BOLSTERS cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageCushionSeatBolsters":{"name":"SDLMassageCushionSeatBolsters","abstract":"

    @abstract SEAT BOLSTERS cushion of a multi-contour massage seat

    "},"Constants.html#/c:@SDLMassageModeOff":{"name":"SDLMassageModeOff","abstract":"

    @abstract Massage Mode Status : OFF

    "},"Constants.html#/c:@SDLMassageModeLow":{"name":"SDLMassageModeLow","abstract":"

    @abstract Massage Mode Status : LOW

    "},"Constants.html#/c:@SDLMassageModeHigh":{"name":"SDLMassageModeHigh","abstract":"

    @abstract Massage Mode Status : HIGH

    "},"Constants.html#/c:@SDLMassageZoneLumbar":{"name":"SDLMassageZoneLumbar","abstract":"

    @abstract The back of a multi-contour massage seat. or SEAT_BACK

    "},"Constants.html#/c:@SDLMassageZoneSeatCushion":{"name":"SDLMassageZoneSeatCushion","abstract":"

    @abstract The bottom a multi-contour massage seat. or SEAT_BOTTOM

    "},"Constants.html#/c:@SDLMediaClockFormatClock1":{"name":"SDLMediaClockFormatClock1","abstract":"

    Media clock format: Clock1

    "},"Constants.html#/c:@SDLMediaClockFormatClock2":{"name":"SDLMediaClockFormatClock2","abstract":"

    Media clock format: Clock2

    "},"Constants.html#/c:@SDLMediaClockFormatClock3":{"name":"SDLMediaClockFormatClock3","abstract":"

    Media clock format: Clock3

    "},"Constants.html#/c:@SDLMediaClockFormatClockText1":{"name":"SDLMediaClockFormatClockText1","abstract":"

    Media clock format: ClockText1

    "},"Constants.html#/c:@SDLMediaClockFormatClockText2":{"name":"SDLMediaClockFormatClockText2","abstract":"

    Media clock format: ClockText2

    "},"Constants.html#/c:@SDLMediaClockFormatClockText3":{"name":"SDLMediaClockFormatClockText3","abstract":"

    Media clock format: ClockText3

    "},"Constants.html#/c:@SDLMediaClockFormatClockText4":{"name":"SDLMediaClockFormatClockText4","abstract":"

    Media clock format: ClockText4

    "},"Constants.html#/c:@SDLMediaTypeMusic":{"name":"SDLMediaTypeMusic","abstract":"

    The app will have a media type of music.

    "},"Constants.html#/c:@SDLMediaTypePodcast":{"name":"SDLMediaTypePodcast","abstract":"

    The app will have a media type of podcast.

    "},"Constants.html#/c:@SDLMediaTypeAudiobook":{"name":"SDLMediaTypeAudiobook","abstract":"

    The app will have a media type of audiobook.

    "},"Constants.html#/c:@SDLMediaTypeOther":{"name":"SDLMediaTypeOther","abstract":"

    The app will have a media type of other.

    "},"Constants.html#/c:@SDLMetadataTypeMediaTitle":{"name":"SDLMetadataTypeMediaTitle","abstract":"

    The song / media title name

    "},"Constants.html#/c:@SDLMetadataTypeMediaArtist":{"name":"SDLMetadataTypeMediaArtist","abstract":"

    The artist of the media

    "},"Constants.html#/c:@SDLMetadataTypeMediaAlbum":{"name":"SDLMetadataTypeMediaAlbum","abstract":"

    The album of the media"

    "},"Constants.html#/c:@SDLMetadataTypeMediaYear":{"name":"SDLMetadataTypeMediaYear","abstract":"

    The year that the media was created

    "},"Constants.html#/c:@SDLMetadataTypeMediaGenre":{"name":"SDLMetadataTypeMediaGenre","abstract":"

    The genre of the media

    "},"Constants.html#/c:@SDLMetadataTypeMediaStation":{"name":"SDLMetadataTypeMediaStation","abstract":"

    The station that the media is playing on

    "},"Constants.html#/c:@SDLMetadataTypeRating":{"name":"SDLMetadataTypeRating","abstract":"

    The rating given to the media

    "},"Constants.html#/c:@SDLMetadataTypeCurrentTemperature":{"name":"SDLMetadataTypeCurrentTemperature","abstract":"

    The current temperature of the weather information

    "},"Constants.html#/c:@SDLMetadataTypeMaximumTemperature":{"name":"SDLMetadataTypeMaximumTemperature","abstract":"

    The high / maximum temperature of the weather information for the current period

    "},"Constants.html#/c:@SDLMetadataTypeMinimumTemperature":{"name":"SDLMetadataTypeMinimumTemperature","abstract":"

    The low / minimum temperature of the weather information for the current period

    "},"Constants.html#/c:@SDLMetadataTypeWeatherTerm":{"name":"SDLMetadataTypeWeatherTerm","abstract":"

    A description of the weather for the current period

    "},"Constants.html#/c:@SDLMetadataTypeHumidity":{"name":"SDLMetadataTypeHumidity","abstract":"

    The humidity of the weather information for the current period

    "},"Constants.html#/c:@SDLModuleTypeClimate":{"name":"SDLModuleTypeClimate","abstract":"

    A SDLModuleType with the value of CLIMATE

    "},"Constants.html#/c:@SDLModuleTypeRadio":{"name":"SDLModuleTypeRadio","abstract":"

    A SDLModuleType with the value of RADIO

    "},"Constants.html#/c:@SDLModuleTypeSeat":{"name":"SDLModuleTypeSeat","abstract":"

    A SDLModuleType with the value of SEAT

    "},"Constants.html#/c:@SDLModuleTypeAudio":{"name":"SDLModuleTypeAudio","abstract":"

    A SDLModuleType with the value of AUDIO

    "},"Constants.html#/c:@SDLModuleTypeLight":{"name":"SDLModuleTypeLight","abstract":"

    A SDLModuleType with the value of LIGHT

    "},"Constants.html#/c:@SDLModuleTypeHMISettings":{"name":"SDLModuleTypeHMISettings","abstract":"

    A SDLModuleType with the value of HMI_SETTINGS

    "},"Constants.html#/c:@SDLNavigationActionTurn":{"name":"SDLNavigationActionTurn","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionExit":{"name":"SDLNavigationActionExit","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionStay":{"name":"SDLNavigationActionStay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionMerge":{"name":"SDLNavigationActionMerge","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionFerry":{"name":"SDLNavigationActionFerry","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionCarShuttleTrain":{"name":"SDLNavigationActionCarShuttleTrain","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationActionWaypoint":{"name":"SDLNavigationActionWaypoint","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionRegular":{"name":"SDLNavigationJunctionRegular","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionBifurcation":{"name":"SDLNavigationJunctionBifurcation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionMultiCarriageway":{"name":"SDLNavigationJunctionMultiCarriageway","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionRoundabout":{"name":"SDLNavigationJunctionRoundabout","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionTraversableRoundabout":{"name":"SDLNavigationJunctionTraversableRoundabout","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionJughandle":{"name":"SDLNavigationJunctionJughandle","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionAllWayYield":{"name":"SDLNavigationJunctionAllWayYield","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNavigationJunctionTurnAround":{"name":"SDLNavigationJunctionTurnAround","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLNotificationUserInfoObject":{"name":"SDLNotificationUserInfoObject","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTransportDidDisconnect":{"name":"SDLTransportDidDisconnect","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTransportDidConnect":{"name":"SDLTransportDidConnect","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTransportConnectError":{"name":"SDLTransportConnectError","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveError":{"name":"SDLDidReceiveError","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveLockScreenIcon":{"name":"SDLDidReceiveLockScreenIcon","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidBecomeReady":{"name":"SDLDidBecomeReady","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidUpdateProjectionView":{"name":"SDLDidUpdateProjectionView","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddCommandResponse":{"name":"SDLDidReceiveAddCommandResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddSubMenuResponse":{"name":"SDLDidReceiveAddSubMenuResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertResponse":{"name":"SDLDidReceiveAlertResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertManeuverResponse":{"name":"SDLDidReceiveAlertManeuverResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonPressResponse":{"name":"SDLDidReceiveButtonPressResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveChangeRegistrationResponse":{"name":"SDLDidReceiveChangeRegistrationResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetResponse":{"name":"SDLDidReceiveCreateInteractionChoiceSetResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteCommandResponse":{"name":"SDLDidReceiveDeleteCommandResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteFileResponse":{"name":"SDLDidReceiveDeleteFileResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetResponse":{"name":"SDLDidReceiveDeleteInteractionChoiceSetResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteSubmenuResponse":{"name":"SDLDidReceiveDeleteSubmenuResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageResponse":{"name":"SDLDidReceiveDiagnosticMessageResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDialNumberResponse":{"name":"SDLDidReceiveDialNumberResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataResponse":{"name":"SDLDidReceiveEncodedSyncPDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruResponse":{"name":"SDLDidReceiveEndAudioPassThruResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGenericResponse":{"name":"SDLDidReceiveGenericResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesResponse":{"name":"SDLDidReceiveGetCloudAppPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataResponse":{"name":"SDLDidReceiveGetAppServiceDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetDTCsResponse":{"name":"SDLDidReceiveGetDTCsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetFileResponse":{"name":"SDLDidReceiveGetFileResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataResponse":{"name":"SDLDidReceiveGetInteriorVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilitiesResponse":{"name":"SDLDidReceiveGetSystemCapabilitiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetVehicleDataResponse":{"name":"SDLDidReceiveGetVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetWaypointsResponse":{"name":"SDLDidReceiveGetWaypointsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveListFilesResponse":{"name":"SDLDidReceiveListFilesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionResponse":{"name":"SDLDidReceivePerformAppServiceInteractionResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruResponse":{"name":"SDLDidReceivePerformAudioPassThruResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformInteractionResponse":{"name":"SDLDidReceivePerformInteractionResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePublishAppServiceResponse":{"name":"SDLDidReceivePublishAppServiceResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePutFileResponse":{"name":"SDLDidReceivePutFileResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveReadDIDResponse":{"name":"SDLDidReceiveReadDIDResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceResponse":{"name":"SDLDidReceiveRegisterAppInterfaceResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesResponse":{"name":"SDLDidReceiveResetGlobalPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveScrollableMessageResponse":{"name":"SDLDidReceiveScrollableMessageResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendHapticDataResponse":{"name":"SDLDidReceiveSendHapticDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendLocationResponse":{"name":"SDLDidReceiveSendLocationResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetAppIconResponse":{"name":"SDLDidReceiveSetAppIconResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesResponse":{"name":"SDLDidReceiveSetCloudAppPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutResponse":{"name":"SDLDidReceiveSetDisplayLayoutResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesResponse":{"name":"SDLDidReceiveSetGlobalPropertiesResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataResponse":{"name":"SDLDidReceiveSetInteriorVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerResponse":{"name":"SDLDidReceiveSetMediaClockTimerResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowConstantTBTResponse":{"name":"SDLDidReceiveShowConstantTBTResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowResponse":{"name":"SDLDidReceiveShowResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSliderResponse":{"name":"SDLDidReceiveSliderResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSpeakResponse":{"name":"SDLDidReceiveSpeakResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeButtonResponse":{"name":"SDLDidReceiveSubscribeButtonResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataResponse":{"name":"SDLDidReceiveSubscribeVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeWaypointsResponse":{"name":"SDLDidReceiveSubscribeWaypointsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSyncPDataResponse":{"name":"SDLDidReceiveSyncPDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUpdateTurnListResponse":{"name":"SDLDidReceiveUpdateTurnListResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceResponse":{"name":"SDLDidReceiveUnregisterAppInterfaceResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonResponse":{"name":"SDLDidReceiveUnsubscribeButtonResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataResponse":{"name":"SDLDidReceiveUnsubscribeVehicleDataResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeWaypointsResponse":{"name":"SDLDidReceiveUnsubscribeWaypointsResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddCommandRequest":{"name":"SDLDidReceiveAddCommandRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAddSubMenuRequest":{"name":"SDLDidReceiveAddSubMenuRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertRequest":{"name":"SDLDidReceiveAlertRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAlertManeuverRequest":{"name":"SDLDidReceiveAlertManeuverRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonPressRequest":{"name":"SDLDidReceiveButtonPressRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveChangeRegistrationRequest":{"name":"SDLDidReceiveChangeRegistrationRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveCreateInteractionChoiceSetRequest":{"name":"SDLDidReceiveCreateInteractionChoiceSetRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteCommandRequest":{"name":"SDLDidReceiveDeleteCommandRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteFileRequest":{"name":"SDLDidReceiveDeleteFileRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteInteractionChoiceSetRequest":{"name":"SDLDidReceiveDeleteInteractionChoiceSetRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDeleteSubMenuRequest":{"name":"SDLDidReceiveDeleteSubMenuRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDiagnosticMessageRequest":{"name":"SDLDidReceiveDiagnosticMessageRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveDialNumberRequest":{"name":"SDLDidReceiveDialNumberRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEncodedSyncPDataRequest":{"name":"SDLDidReceiveEncodedSyncPDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEndAudioPassThruRequest":{"name":"SDLDidReceiveEndAudioPassThruRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetAppServiceDataRequest":{"name":"SDLDidReceiveGetAppServiceDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetCloudAppPropertiesRequest":{"name":"SDLDidReceiveGetCloudAppPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetDTCsRequest":{"name":"SDLDidReceiveGetDTCsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetFileRequest":{"name":"SDLDidReceiveGetFileRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetInteriorVehicleDataRequest":{"name":"SDLDidReceiveGetInteriorVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetSystemCapabilityRequest":{"name":"SDLDidReceiveGetSystemCapabilityRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetVehicleDataRequest":{"name":"SDLDidReceiveGetVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveGetWayPointsRequest":{"name":"SDLDidReceiveGetWayPointsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveListFilesRequest":{"name":"SDLDidReceiveListFilesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAppServiceInteractionRequest":{"name":"SDLDidReceivePerformAppServiceInteractionRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformAudioPassThruRequest":{"name":"SDLDidReceivePerformAudioPassThruRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePerformInteractionRequest":{"name":"SDLDidReceivePerformInteractionRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePublishAppServiceRequest":{"name":"SDLDidReceivePublishAppServiceRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceivePutFileRequest":{"name":"SDLDidReceivePutFileRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveReadDIDRequest":{"name":"SDLDidReceiveReadDIDRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveRegisterAppInterfaceRequest":{"name":"SDLDidReceiveRegisterAppInterfaceRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveResetGlobalPropertiesRequest":{"name":"SDLDidReceiveResetGlobalPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveScrollableMessageRequest":{"name":"SDLDidReceiveScrollableMessageRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendHapticDataRequest":{"name":"SDLDidReceiveSendHapticDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSendLocationRequest":{"name":"SDLDidReceiveSendLocationRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetAppIconRequest":{"name":"SDLDidReceiveSetAppIconRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetCloudAppPropertiesRequest":{"name":"SDLDidReceiveSetCloudAppPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetDisplayLayoutRequest":{"name":"SDLDidReceiveSetDisplayLayoutRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetGlobalPropertiesRequest":{"name":"SDLDidReceiveSetGlobalPropertiesRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetInteriorVehicleDataRequest":{"name":"SDLDidReceiveSetInteriorVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSetMediaClockTimerRequest":{"name":"SDLDidReceiveSetMediaClockTimerRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowRequest":{"name":"SDLDidReceiveShowRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveShowConstantTBTRequest":{"name":"SDLDidReceiveShowConstantTBTRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSliderRequest":{"name":"SDLDidReceiveSliderRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSpeakRequest":{"name":"SDLDidReceiveSpeakRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeButtonRequest":{"name":"SDLDidReceiveSubscribeButtonRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeVehicleDataRequest":{"name":"SDLDidReceiveSubscribeVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSubscribeWayPointsRequest":{"name":"SDLDidReceiveSubscribeWayPointsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSyncPDataRequest":{"name":"SDLDidReceiveSyncPDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSystemRequestRequest":{"name":"SDLDidReceiveSystemRequestRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnregisterAppInterfaceRequest":{"name":"SDLDidReceiveUnregisterAppInterfaceRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeButtonRequest":{"name":"SDLDidReceiveUnsubscribeButtonRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeVehicleDataRequest":{"name":"SDLDidReceiveUnsubscribeVehicleDataRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUnsubscribeWayPointsRequest":{"name":"SDLDidReceiveUnsubscribeWayPointsRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveUpdateTurnListRequest":{"name":"SDLDidReceiveUpdateTurnListRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeDriverDistractionStateNotification":{"name":"SDLDidChangeDriverDistractionStateNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeHMIStatusNotification":{"name":"SDLDidChangeHMIStatusNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAppServiceDataNotification":{"name":"SDLDidReceiveAppServiceDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAppUnregisteredNotification":{"name":"SDLDidReceiveAppUnregisteredNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveAudioPassThruNotification":{"name":"SDLDidReceiveAudioPassThruNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonEventNotification":{"name":"SDLDidReceiveButtonEventNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveButtonPressNotification":{"name":"SDLDidReceiveButtonPressNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveCommandNotification":{"name":"SDLDidReceiveCommandNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveEncodedDataNotification":{"name":"SDLDidReceiveEncodedDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveInteriorVehicleDataNotification":{"name":"SDLDidReceiveInteriorVehicleDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveKeyboardInputNotification":{"name":"SDLDidReceiveKeyboardInputNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeLanguageNotification":{"name":"SDLDidChangeLanguageNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeLockScreenStatusNotification":{"name":"SDLDidChangeLockScreenStatusNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveNewHashNotification":{"name":"SDLDidReceiveNewHashNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveVehicleIconNotification":{"name":"SDLDidReceiveVehicleIconNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangePermissionsNotification":{"name":"SDLDidChangePermissionsNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveRemoteControlStatusNotification":{"name":"SDLDidReceiveRemoteControlStatusNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSystemCapabilityUpdatedNotification":{"name":"SDLDidReceiveSystemCapabilityUpdatedNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveSystemRequestNotification":{"name":"SDLDidReceiveSystemRequestNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidChangeTurnByTurnStateNotification":{"name":"SDLDidChangeTurnByTurnStateNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveTouchEventNotification":{"name":"SDLDidReceiveTouchEventNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveVehicleDataNotification":{"name":"SDLDidReceiveVehicleDataNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDidReceiveWaypointNotification":{"name":"SDLDidReceiveWaypointNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLPRNDLPark":{"name":"SDLPRNDLPark","abstract":"

    Park

    "},"Constants.html#/c:@SDLPRNDLReverse":{"name":"SDLPRNDLReverse","abstract":"

    Reverse gear

    "},"Constants.html#/c:@SDLPRNDLNeutral":{"name":"SDLPRNDLNeutral","abstract":"

    No gear

    "},"Constants.html#/c:@SDLPRNDLDrive":{"name":"SDLPRNDLDrive","abstract":"

    @abstract: Drive gear

    "},"Constants.html#/c:@SDLPRNDLSport":{"name":"SDLPRNDLSport","abstract":"

    Drive Sport mode

    "},"Constants.html#/c:@SDLPRNDLLowGear":{"name":"SDLPRNDLLowGear","abstract":"

    1st gear hold

    "},"Constants.html#/c:@SDLPRNDLFirst":{"name":"SDLPRNDLFirst","abstract":"

    First gear

    "},"Constants.html#/c:@SDLPRNDLSecond":{"name":"SDLPRNDLSecond","abstract":"

    Second gear

    "},"Constants.html#/c:@SDLPRNDLThird":{"name":"SDLPRNDLThird","abstract":"

    Third gear

    "},"Constants.html#/c:@SDLPRNDLFourth":{"name":"SDLPRNDLFourth","abstract":"

    Fourth gear

    "},"Constants.html#/c:@SDLPRNDLFifth":{"name":"SDLPRNDLFifth","abstract":"

    Fifth gear

    "},"Constants.html#/c:@SDLPRNDLSixth":{"name":"SDLPRNDLSixth","abstract":"

    Sixth gear

    "},"Constants.html#/c:@SDLPRNDLSeventh":{"name":"SDLPRNDLSeventh","abstract":"

    Seventh gear

    "},"Constants.html#/c:@SDLPRNDLEighth":{"name":"SDLPRNDLEighth","abstract":"

    Eighth gear

    "},"Constants.html#/c:@SDLPRNDLUnknown":{"name":"SDLPRNDLUnknown","abstract":"

    Unknown

    "},"Constants.html#/c:@SDLPRNDLFault":{"name":"SDLPRNDLFault","abstract":"

    Fault

    "},"Constants.html#/c:@SDLPermissionStatusAllowed":{"name":"SDLPermissionStatusAllowed","abstract":"

    permission: allowed

    "},"Constants.html#/c:@SDLPermissionStatusDisallowed":{"name":"SDLPermissionStatusDisallowed","abstract":"

    permission: disallowed

    "},"Constants.html#/c:@SDLPermissionStatusUserDisallowed":{"name":"SDLPermissionStatusUserDisallowed","abstract":"

    permission: user disallowed

    "},"Constants.html#/c:@SDLPermissionStatusUserConsentPending":{"name":"SDLPermissionStatusUserConsentPending","abstract":"

    permission: user consent pending

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusUndefined":{"name":"SDLPowerModeQualificationStatusUndefined","abstract":"

    An undefined status

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusEvaluationInProgress":{"name":"SDLPowerModeQualificationStatusEvaluationInProgress","abstract":"

    An evaluation in progress status

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusNotDefined":{"name":"SDLPowerModeQualificationStatusNotDefined","abstract":"

    A not defined status

    "},"Constants.html#/c:@SDLPowerModeQualificationStatusOk":{"name":"SDLPowerModeQualificationStatusOk","abstract":"

    An ok status

    "},"Constants.html#/c:@SDLPowerModeStatusKeyOut":{"name":"SDLPowerModeStatusKeyOut","abstract":"

    The key is not in the ignition, and the power is off

    "},"Constants.html#/c:@SDLPowerModeStatusKeyRecentlyOut":{"name":"SDLPowerModeStatusKeyRecentlyOut","abstract":"

    The key is not in the ignition and it was just recently removed

    "},"Constants.html#/c:@SDLPowerModeStatusKeyApproved":{"name":"SDLPowerModeStatusKeyApproved","abstract":"

    The key is not in the ignition, but an approved key is available

    "},"Constants.html#/c:@SDLPowerModeStatusPostAccessory":{"name":"SDLPowerModeStatusPostAccessory","abstract":"

    We are in a post-accessory power situation

    "},"Constants.html#/c:@SDLPowerModeStatusAccessory":{"name":"SDLPowerModeStatusAccessory","abstract":"

    The car is in accessory power mode

    "},"Constants.html#/c:@SDLPowerModeStatusPostIgnition":{"name":"SDLPowerModeStatusPostIgnition","abstract":"

    We are in a post-ignition power situation

    "},"Constants.html#/c:@SDLPowerModeStatusIgnitionOn":{"name":"SDLPowerModeStatusIgnitionOn","abstract":"

    The ignition is on but the car is not yet running

    "},"Constants.html#/c:@SDLPowerModeStatusRunning":{"name":"SDLPowerModeStatusRunning","abstract":"

    The ignition is on and the car is running

    "},"Constants.html#/c:@SDLPowerModeStatusCrank":{"name":"SDLPowerModeStatusCrank","abstract":"

    We are in a crank power situation

    "},"Constants.html#/c:@SDLPredefinedLayoutDefault":{"name":"SDLPredefinedLayoutDefault","abstract":"

    A default layout

    "},"Constants.html#/c:@SDLPredefinedLayoutMedia":{"name":"SDLPredefinedLayoutMedia","abstract":"

    The default media layout

    "},"Constants.html#/c:@SDLPredefinedLayoutNonMedia":{"name":"SDLPredefinedLayoutNonMedia","abstract":"

    The default non-media layout

    "},"Constants.html#/c:@SDLPredefinedLayoutOnscreenPresets":{"name":"SDLPredefinedLayoutOnscreenPresets","abstract":"

    A media layout containing preset buttons

    "},"Constants.html#/c:@SDLPredefinedLayoutNavigationFullscreenMap":{"name":"SDLPredefinedLayoutNavigationFullscreenMap","abstract":"

    The default navigation layout with a fullscreen map

    "},"Constants.html#/c:@SDLPredefinedLayoutNavigationList":{"name":"SDLPredefinedLayoutNavigationList","abstract":"

    A list layout used for navigation apps

    "},"Constants.html#/c:@SDLPredefinedLayoutNavigationKeyboard":{"name":"SDLPredefinedLayoutNavigationKeyboard","abstract":"

    A keyboard layout used for navigation apps

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithText":{"name":"SDLPredefinedLayoutGraphicWithText","abstract":"

    A layout with a single graphic on the left and text on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTextWithGraphic":{"name":"SDLPredefinedLayoutTextWithGraphic","abstract":"

    A layout with text on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTilesOnly":{"name":"SDLPredefinedLayoutTilesOnly","abstract":"

    A layout with only softbuttons placed in a tile layout

    "},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsOnly":{"name":"SDLPredefinedLayoutTextButtonsOnly","abstract":"

    A layout with only soft buttons that only accept text

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTiles":{"name":"SDLPredefinedLayoutGraphicWithTiles","abstract":"

    A layout with a single graphic on the left and soft buttons in a tile layout on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTilesWithGraphic":{"name":"SDLPredefinedLayoutTilesWithGraphic","abstract":"

    A layout with soft buttons in a tile layout on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextAndSoftButtons":{"name":"SDLPredefinedLayoutGraphicWithTextAndSoftButtons","abstract":"

    A layout with a single graphic on the left and both text and soft buttons on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTextAndSoftButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextAndSoftButtonsWithGraphic","abstract":"

    A layout with both text and soft buttons on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutGraphicWithTextButtons":{"name":"SDLPredefinedLayoutGraphicWithTextButtons","abstract":"

    A layout with a single graphic on the left and text-only soft buttons on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutTextButtonsWithGraphic":{"name":"SDLPredefinedLayoutTextButtonsWithGraphic","abstract":"

    A layout with text-only soft buttons on the left and a single graphic on the right

    "},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutLargeGraphicWithSoftButtons","abstract":"

    A layout with a single large graphic and soft buttons

    "},"Constants.html#/c:@SDLPredefinedLayoutDoubleGraphicWithSoftButtons":{"name":"SDLPredefinedLayoutDoubleGraphicWithSoftButtons","abstract":"

    A layout with two graphics and soft buttons

    "},"Constants.html#/c:@SDLPredefinedLayoutLargeGraphicOnly":{"name":"SDLPredefinedLayoutLargeGraphicOnly","abstract":"

    A layout with only a single large graphic

    "},"Constants.html#/c:@SDLPrerecordedSpeechHelp":{"name":"SDLPrerecordedSpeechHelp","abstract":"

    A prerecorded help prompt

    "},"Constants.html#/c:@SDLPrerecordedSpeechInitial":{"name":"SDLPrerecordedSpeechInitial","abstract":"

    A prerecorded initial prompt

    "},"Constants.html#/c:@SDLPrerecordedSpeechListen":{"name":"SDLPrerecordedSpeechListen","abstract":"

    A prerecorded listen prompt is available

    "},"Constants.html#/c:@SDLPrerecordedSpeechPositive":{"name":"SDLPrerecordedSpeechPositive","abstract":"

    A prerecorded positive indicator noise is available

    "},"Constants.html#/c:@SDLPrerecordedSpeechNegative":{"name":"SDLPrerecordedSpeechNegative","abstract":"

    A prerecorded negative indicator noise is available

    "},"Constants.html#/c:@SDLPrimaryAudioSourceNoSourceSelected":{"name":"SDLPrimaryAudioSourceNoSourceSelected","abstract":"

    Currently no source selected

    "},"Constants.html#/c:@SDLPrimaryAudioSourceUSB":{"name":"SDLPrimaryAudioSourceUSB","abstract":"

    USB is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceUSB2":{"name":"SDLPrimaryAudioSourceUSB2","abstract":"

    USB2 is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceBluetoothStereo":{"name":"SDLPrimaryAudioSourceBluetoothStereo","abstract":"

    Bluetooth Stereo is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceLineIn":{"name":"SDLPrimaryAudioSourceLineIn","abstract":"

    Line in is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceIpod":{"name":"SDLPrimaryAudioSourceIpod","abstract":"

    iPod is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceMobileApp":{"name":"SDLPrimaryAudioSourceMobileApp","abstract":"

    Mobile app is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceCD":{"name":"SDLPrimaryAudioSourceCD","abstract":"

    @abstract CD is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceAM":{"name":"SDLPrimaryAudioSourceAM","abstract":"

    @abstract Radio frequency AM is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceFM":{"name":"SDLPrimaryAudioSourceFM","abstract":"

    @abstract Radio frequency FM is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceXM":{"name":"SDLPrimaryAudioSourceXM","abstract":"

    @abstract Radio frequency XM is current source

    "},"Constants.html#/c:@SDLPrimaryAudioSourceDAB":{"name":"SDLPrimaryAudioSourceDAB","abstract":"

    @abstract Radio frequency DAB is current source

    "},"Constants.html#/c:@SDLRPCFunctionNameAddCommand":{"name":"SDLRPCFunctionNameAddCommand","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameAddSubMenu":{"name":"SDLRPCFunctionNameAddSubMenu","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameAlert":{"name":"SDLRPCFunctionNameAlert","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameAlertManeuver":{"name":"SDLRPCFunctionNameAlertManeuver","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameButtonPress":{"name":"SDLRPCFunctionNameButtonPress","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameChangeRegistration":{"name":"SDLRPCFunctionNameChangeRegistration","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameCreateInteractionChoiceSet":{"name":"SDLRPCFunctionNameCreateInteractionChoiceSet","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteCommand":{"name":"SDLRPCFunctionNameDeleteCommand","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteFile":{"name":"SDLRPCFunctionNameDeleteFile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteInteractionChoiceSet":{"name":"SDLRPCFunctionNameDeleteInteractionChoiceSet","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDeleteSubMenu":{"name":"SDLRPCFunctionNameDeleteSubMenu","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDiagnosticMessage":{"name":"SDLRPCFunctionNameDiagnosticMessage","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameDialNumber":{"name":"SDLRPCFunctionNameDialNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameEncodedSyncPData":{"name":"SDLRPCFunctionNameEncodedSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameEndAudioPassThru":{"name":"SDLRPCFunctionNameEndAudioPassThru","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGenericResponse":{"name":"SDLRPCFunctionNameGenericResponse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetAppServiceData":{"name":"SDLRPCFunctionNameGetAppServiceData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetDTCs":{"name":"SDLRPCFunctionNameGetDTCs","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetFile":{"name":"SDLRPCFunctionNameGetFile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetCloudAppProperties":{"name":"SDLRPCFunctionNameGetCloudAppProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetInteriorVehicleData":{"name":"SDLRPCFunctionNameGetInteriorVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetSystemCapability":{"name":"SDLRPCFunctionNameGetSystemCapability","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetVehicleData":{"name":"SDLRPCFunctionNameGetVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameGetWayPoints":{"name":"SDLRPCFunctionNameGetWayPoints","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameListFiles":{"name":"SDLRPCFunctionNameListFiles","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnAppInterfaceUnregistered":{"name":"SDLRPCFunctionNameOnAppInterfaceUnregistered","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnAppServiceData":{"name":"SDLRPCFunctionNameOnAppServiceData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnAudioPassThru":{"name":"SDLRPCFunctionNameOnAudioPassThru","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnButtonEvent":{"name":"SDLRPCFunctionNameOnButtonEvent","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnButtonPress":{"name":"SDLRPCFunctionNameOnButtonPress","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnCommand":{"name":"SDLRPCFunctionNameOnCommand","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnDriverDistraction":{"name":"SDLRPCFunctionNameOnDriverDistraction","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnEncodedSyncPData":{"name":"SDLRPCFunctionNameOnEncodedSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnHashChange":{"name":"SDLRPCFunctionNameOnHashChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnHMIStatus":{"name":"SDLRPCFunctionNameOnHMIStatus","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnInteriorVehicleData":{"name":"SDLRPCFunctionNameOnInteriorVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnKeyboardInput":{"name":"SDLRPCFunctionNameOnKeyboardInput","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnLanguageChange":{"name":"SDLRPCFunctionNameOnLanguageChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnLockScreenStatus":{"name":"SDLRPCFunctionNameOnLockScreenStatus","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnPermissionsChange":{"name":"SDLRPCFunctionNameOnPermissionsChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnRCStatus":{"name":"SDLRPCFunctionNameOnRCStatus","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnSyncPData":{"name":"SDLRPCFunctionNameOnSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnSystemCapabilityUpdated":{"name":"SDLRPCFunctionNameOnSystemCapabilityUpdated","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnSystemRequest":{"name":"SDLRPCFunctionNameOnSystemRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnTBTClientState":{"name":"SDLRPCFunctionNameOnTBTClientState","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnTouchEvent":{"name":"SDLRPCFunctionNameOnTouchEvent","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnVehicleData":{"name":"SDLRPCFunctionNameOnVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameOnWayPointChange":{"name":"SDLRPCFunctionNameOnWayPointChange","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePerformAppServiceInteraction":{"name":"SDLRPCFunctionNamePerformAppServiceInteraction","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePerformAudioPassThru":{"name":"SDLRPCFunctionNamePerformAudioPassThru","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePerformInteraction":{"name":"SDLRPCFunctionNamePerformInteraction","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePublishAppService":{"name":"SDLRPCFunctionNamePublishAppService","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNamePutFile":{"name":"SDLRPCFunctionNamePutFile","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameReadDID":{"name":"SDLRPCFunctionNameReadDID","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameRegisterAppInterface":{"name":"SDLRPCFunctionNameRegisterAppInterface","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameReserved":{"name":"SDLRPCFunctionNameReserved","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameResetGlobalProperties":{"name":"SDLRPCFunctionNameResetGlobalProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameScrollableMessage":{"name":"SDLRPCFunctionNameScrollableMessage","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSendHapticData":{"name":"SDLRPCFunctionNameSendHapticData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSendLocation":{"name":"SDLRPCFunctionNameSendLocation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetAppIcon":{"name":"SDLRPCFunctionNameSetAppIcon","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetCloudAppProperties":{"name":"SDLRPCFunctionNameSetCloudAppProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetDisplayLayout":{"name":"SDLRPCFunctionNameSetDisplayLayout","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetGlobalProperties":{"name":"SDLRPCFunctionNameSetGlobalProperties","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetInteriorVehicleData":{"name":"SDLRPCFunctionNameSetInteriorVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSetMediaClockTimer":{"name":"SDLRPCFunctionNameSetMediaClockTimer","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameShow":{"name":"SDLRPCFunctionNameShow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameShowConstantTBT":{"name":"SDLRPCFunctionNameShowConstantTBT","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSlider":{"name":"SDLRPCFunctionNameSlider","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSpeak":{"name":"SDLRPCFunctionNameSpeak","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSubscribeButton":{"name":"SDLRPCFunctionNameSubscribeButton","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSubscribeVehicleData":{"name":"SDLRPCFunctionNameSubscribeVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSubscribeWayPoints":{"name":"SDLRPCFunctionNameSubscribeWayPoints","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSyncPData":{"name":"SDLRPCFunctionNameSyncPData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameSystemRequest":{"name":"SDLRPCFunctionNameSystemRequest","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnregisterAppInterface":{"name":"SDLRPCFunctionNameUnregisterAppInterface","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeButton":{"name":"SDLRPCFunctionNameUnsubscribeButton","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeVehicleData":{"name":"SDLRPCFunctionNameUnsubscribeVehicleData","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUnsubscribeWayPoints":{"name":"SDLRPCFunctionNameUnsubscribeWayPoints","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRPCFunctionNameUpdateTurnList":{"name":"SDLRPCFunctionNameUpdateTurnList","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLRadioBandAM":{"name":"SDLRadioBandAM","abstract":"

    Represents AM radio band

    "},"Constants.html#/c:@SDLRadioBandFM":{"name":"SDLRadioBandFM","abstract":"

    Represents FM radio band

    "},"Constants.html#/c:@SDLRadioBandXM":{"name":"SDLRadioBandXM","abstract":"

    Represents XM radio band

    "},"Constants.html#/c:@SDLRadioStateAcquiring":{"name":"SDLRadioStateAcquiring","abstract":"

    Represents Radio state as ACQUIRING

    "},"Constants.html#/c:@SDLRadioStateAcquired":{"name":"SDLRadioStateAcquired","abstract":"

    Represents Radio state as ACQUIRED

    "},"Constants.html#/c:@SDLRadioStateMulticast":{"name":"SDLRadioStateMulticast","abstract":"

    Represents Radio state as MULTICAST

    "},"Constants.html#/c:@SDLRadioStateNotFound":{"name":"SDLRadioStateNotFound","abstract":"

    Represents Radio state as NOT_FOUND

    "},"Constants.html#/c:@SDLRequestTypeHTTP":{"name":"SDLRequestTypeHTTP","abstract":"

    An HTTP request

    "},"Constants.html#/c:@SDLRequestTypeFileResume":{"name":"SDLRequestTypeFileResume","abstract":"

    A file resumption request

    "},"Constants.html#/c:@SDLRequestTypeAuthenticationRequest":{"name":"SDLRequestTypeAuthenticationRequest","abstract":"

    An authentication request

    "},"Constants.html#/c:@SDLRequestTypeAuthenticationChallenge":{"name":"SDLRequestTypeAuthenticationChallenge","abstract":"

    An authentication challenge

    "},"Constants.html#/c:@SDLRequestTypeAuthenticationAck":{"name":"SDLRequestTypeAuthenticationAck","abstract":"

    An authentication acknowledgment

    "},"Constants.html#/c:@SDLRequestTypeProprietary":{"name":"SDLRequestTypeProprietary","abstract":"

    An proprietary formatted request

    "},"Constants.html#/c:@SDLRequestTypeQueryApps":{"name":"SDLRequestTypeQueryApps","abstract":"

    An Query Apps request

    "},"Constants.html#/c:@SDLRequestTypeLaunchApp":{"name":"SDLRequestTypeLaunchApp","abstract":"

    A Launch Apps request

    "},"Constants.html#/c:@SDLRequestTypeLockScreenIconURL":{"name":"SDLRequestTypeLockScreenIconURL","abstract":"

    The URL for a lock screen icon

    "},"Constants.html#/c:@SDLRequestTypeTrafficMessageChannel":{"name":"SDLRequestTypeTrafficMessageChannel","abstract":"

    A traffic message channel request

    "},"Constants.html#/c:@SDLRequestTypeDriverProfile":{"name":"SDLRequestTypeDriverProfile","abstract":"

    A driver profile request

    "},"Constants.html#/c:@SDLRequestTypeVoiceSearch":{"name":"SDLRequestTypeVoiceSearch","abstract":"

    A voice search request

    "},"Constants.html#/c:@SDLRequestTypeNavigation":{"name":"SDLRequestTypeNavigation","abstract":"

    A navigation request

    "},"Constants.html#/c:@SDLRequestTypePhone":{"name":"SDLRequestTypePhone","abstract":"

    A phone request

    "},"Constants.html#/c:@SDLRequestTypeClimate":{"name":"SDLRequestTypeClimate","abstract":"

    A climate request

    "},"Constants.html#/c:@SDLRequestTypeSettings":{"name":"SDLRequestTypeSettings","abstract":"

    A settings request

    "},"Constants.html#/c:@SDLRequestTypeVehicleDiagnostics":{"name":"SDLRequestTypeVehicleDiagnostics","abstract":"

    A vehicle diagnostics request

    "},"Constants.html#/c:@SDLRequestTypeEmergency":{"name":"SDLRequestTypeEmergency","abstract":"

    An emergency request

    "},"Constants.html#/c:@SDLRequestTypeMedia":{"name":"SDLRequestTypeMedia","abstract":"

    A media request

    "},"Constants.html#/c:@SDLRequestTypeFOTA":{"name":"SDLRequestTypeFOTA","abstract":"

    A firmware over-the-air request

    "},"Constants.html#/c:@SDLRequestTypeOEMSpecific":{"name":"SDLRequestTypeOEMSpecific","abstract":"

    A request that is OEM specific using the RequestSubType in SystemRequest

    "},"Constants.html#/c:@SDLRequestTypeIconURL":{"name":"SDLRequestTypeIconURL","abstract":"

    A request for an icon url

    "},"Constants.html#/c:@SDLResultSuccess":{"name":"SDLResultSuccess","abstract":"

    The request succeeded

    "},"Constants.html#/c:@SDLResultInvalidData":{"name":"SDLResultInvalidData","abstract":"

    The request contained invalid data

    "},"Constants.html#/c:@SDLResultCharacterLimitExceeded":{"name":"SDLResultCharacterLimitExceeded","abstract":"

    The request had a string containing too many characters

    "},"Constants.html#/c:@SDLResultUnsupportedRequest":{"name":"SDLResultUnsupportedRequest","abstract":"

    The request is not supported by the IVI unit implementing SDL

    "},"Constants.html#/c:@SDLResultOutOfMemory":{"name":"SDLResultOutOfMemory","abstract":"

    The system could not process the request because the necessary memory couldn’t be allocated

    "},"Constants.html#/c:@SDLResultTooManyPendingRequests":{"name":"SDLResultTooManyPendingRequests","abstract":"

    There are too many requests pending (means that the response has not been delivered yet).

    "},"Constants.html#/c:@SDLResultInvalidId":{"name":"SDLResultInvalidId","abstract":"

    One of the provided IDs is not valid.

    "},"Constants.html#/c:@SDLResultDuplicateName":{"name":"SDLResultDuplicateName","abstract":"

    The provided name or synonym is a duplicate of some already-defined name or synonym.

    "},"Constants.html#/c:@SDLResultTooManyApplications":{"name":"SDLResultTooManyApplications","abstract":"

    There are already too many registered applications.

    "},"Constants.html#/c:@SDLResultApplicationRegisteredAlready":{"name":"SDLResultApplicationRegisteredAlready","abstract":"

    RegisterAppInterface has been called, but this app is already registered

    "},"Constants.html#/c:@SDLResultUnsupportedVersion":{"name":"SDLResultUnsupportedVersion","abstract":"

    The Head Unit doesn’t support the SDL version that is requested by the mobile application.

    "},"Constants.html#/c:@SDLResultWrongLanguage":{"name":"SDLResultWrongLanguage","abstract":"

    The requested language is currently not supported. This might be because of a mismatch of the currently active language on the head unit and the requested language.

    "},"Constants.html#/c:@SDLResultApplicationNotRegistered":{"name":"SDLResultApplicationNotRegistered","abstract":"

    A command can not be executed because no application has been registered with RegisterApplication.

    "},"Constants.html#/c:@SDLResultInUse":{"name":"SDLResultInUse","abstract":"

    The data may not be changed, because it is currently in use. For example when trying to delete a choice set that is currently involved in an interaction.

    "},"Constants.html#/c:@SDLResultVehicleDataNotAllowed":{"name":"SDLResultVehicleDataNotAllowed","abstract":"

    The user has turned off access to vehicle data, and it is globally unavailable to mobile applications.

    "},"Constants.html#/c:@SDLResultVehicleDataNotAvailable":{"name":"SDLResultVehicleDataNotAvailable","abstract":"

    The requested vehicle data is not available on this vehicle or is not published.

    "},"Constants.html#/c:@SDLResultRejected":{"name":"SDLResultRejected","abstract":"

    The requested command was rejected, e.g. because the mobile app is in background and cannot perform any HMI commands, or an HMI command (e.g. Speak) is rejected because a higher priority HMI command (e.g. Alert) is playing.

    "},"Constants.html#/c:@SDLResultAborted":{"name":"SDLResultAborted","abstract":"

    A command was aborted, e.g. due to user interaction (user pressed button), or an HMI command (e.g. Speak) is aborted because a higher priority HMI command (e.g. Alert) was requested.

    "},"Constants.html#/c:@SDLResultIgnored":{"name":"SDLResultIgnored","abstract":"

    A command was ignored, because the intended result is already in effect. For example, SetMediaClockTimer was used to pause the media clock although the clock is paused already.

    "},"Constants.html#/c:@SDLResultUnsupportedResource":{"name":"SDLResultUnsupportedResource","abstract":"

    A button that was requested for subscription is not supported under the current system.

    "},"Constants.html#/c:@SDLResultFileNotFound":{"name":"SDLResultFileNotFound","abstract":"

    A specified file could not be found on the head unit.

    "},"Constants.html#/c:@SDLResultGenericError":{"name":"SDLResultGenericError","abstract":"

    Provided data is valid but something went wrong in the lower layers.

    "},"Constants.html#/c:@SDLResultDisallowed":{"name":"SDLResultDisallowed","abstract":"

    RPC is not authorized in local policy table.

    "},"Constants.html#/c:@SDLResultUserDisallowed":{"name":"SDLResultUserDisallowed","abstract":"

    RPC is included in a functional group explicitly blocked by the user.

    "},"Constants.html#/c:@SDLResultTimedOut":{"name":"SDLResultTimedOut","abstract":"

    Overlay reached the maximum timeout and closed.

    "},"Constants.html#/c:@SDLResultCancelRoute":{"name":"SDLResultCancelRoute","abstract":"

    User selected to Cancel Route.

    "},"Constants.html#/c:@SDLResultCorruptedData":{"name":"SDLResultCorruptedData","abstract":"

    The data sent failed to pass CRC check in receiver end.

    "},"Constants.html#/c:@SDLResultTruncatedData":{"name":"SDLResultTruncatedData","abstract":"

    The RPC (e.g. ReadDID) executed successfully but the data exceeded the platform maximum threshold and thus, only part of the data is available.

    "},"Constants.html#/c:@SDLResultRetry":{"name":"SDLResultRetry","abstract":"

    The user interrupted the RPC (e.g. PerformAudioPassThru) and indicated to start over. Note, the app must issue the new RPC.

    "},"Constants.html#/c:@SDLResultWarnings":{"name":"SDLResultWarnings","abstract":"

    The RPC (e.g. SubscribeVehicleData) executed successfully but one or more items have a warning or failure.

    "},"Constants.html#/c:@SDLResultSaved":{"name":"SDLResultSaved","abstract":"

    The RPC (e.g. Slider) executed successfully and the user elected to save the current position / value.

    "},"Constants.html#/c:@SDLResultInvalidCertificate":{"name":"SDLResultInvalidCertificate","abstract":"

    The certificate provided during authentication is invalid.

    "},"Constants.html#/c:@SDLResultExpiredCertificate":{"name":"SDLResultExpiredCertificate","abstract":"

    The certificate provided during authentication is expired.

    "},"Constants.html#/c:@SDLResultResumeFailed":{"name":"SDLResultResumeFailed","abstract":"

    The provided hash ID does not match the hash of the current set of registered data or the core could not resume the previous data.

    "},"Constants.html#/c:@SDLResultDataNotAvailable":{"name":"SDLResultDataNotAvailable","abstract":"

    The requested data is not available on this vehicle or is not published for the connected app.

    "},"Constants.html#/c:@SDLResultReadOnly":{"name":"SDLResultReadOnly","abstract":"

    The requested data is read only thus cannot be change via remote control .

    "},"Constants.html#/c:@SDLSamplingRate8KHZ":{"name":"SDLSamplingRate8KHZ","abstract":"

    Sampling rate of 8 kHz

    "},"Constants.html#/c:@SDLSamplingRate16KHZ":{"name":"SDLSamplingRate16KHZ","abstract":"

    Sampling rate of 16 kHz

    "},"Constants.html#/c:@SDLSamplingRate22KHZ":{"name":"SDLSamplingRate22KHZ","abstract":"

    Sampling rate of 22 kHz

    "},"Constants.html#/c:@SDLSamplingRate44KHZ":{"name":"SDLSamplingRate44KHZ","abstract":"

    Sampling rate of 44 kHz

    "},"Constants.html#/c:@SDLSeatMemoryActionTypeSave":{"name":"SDLSeatMemoryActionTypeSave","abstract":"

    @abstract Save current seat postions and settings to seat memory.

    "},"Constants.html#/c:@SDLSeatMemoryActionTypeRestore":{"name":"SDLSeatMemoryActionTypeRestore","abstract":"

    @abstract Restore / apply the seat memory settings to the current seat.

    "},"Constants.html#/c:@SDLSeatMemoryActionTypeNone":{"name":"SDLSeatMemoryActionTypeNone","abstract":"

    @abstract No action to be performed.

    "},"Constants.html#/c:@SDLServiceUpdatePublished":{"name":"SDLServiceUpdatePublished","abstract":"

    The service has just been published with the module and once activated to the primary service of its type, it will be ready for possible consumption.

    "},"Constants.html#/c:@SDLServiceUpdateRemoved":{"name":"SDLServiceUpdateRemoved","abstract":"

    The service has just been unpublished with the module and is no longer accessible.

    "},"Constants.html#/c:@SDLServiceUpdateActivated":{"name":"SDLServiceUpdateActivated","abstract":"

    The service is activated as the primary service of this type. All requests dealing with this service type will be handled by this service.

    "},"Constants.html#/c:@SDLServiceUpdateDeactivated":{"name":"SDLServiceUpdateDeactivated","abstract":"

    The service has been deactivated as the primary service of its type.

    "},"Constants.html#/c:@SDLServiceUpdateManifestUpdate":{"name":"SDLServiceUpdateManifestUpdate","abstract":"

    The service has updated its manifest. This could imply updated capabilities.

    "},"Constants.html#/c:@SDLSoftButtonTypeText":{"name":"SDLSoftButtonTypeText","abstract":"

    Text kind Softbutton

    "},"Constants.html#/c:@SDLSoftButtonTypeImage":{"name":"SDLSoftButtonTypeImage","abstract":"

    Image kind Softbutton

    "},"Constants.html#/c:@SDLSoftButtonTypeBoth":{"name":"SDLSoftButtonTypeBoth","abstract":"

    Both (Text & Image) kind Softbutton

    "},"Constants.html#/c:@SDLSpeechCapabilitiesText":{"name":"SDLSpeechCapabilitiesText","abstract":"

    The SDL platform can speak text phrases.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesSAPIPhonemes":{"name":"SDLSpeechCapabilitiesSAPIPhonemes","abstract":"

    The SDL platform can speak SAPI Phonemes.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesLHPlusPhonemes":{"name":"SDLSpeechCapabilitiesLHPlusPhonemes","abstract":"

    The SDL platform can speak LHPlus Phonemes.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesPrerecorded":{"name":"SDLSpeechCapabilitiesPrerecorded","abstract":"

    The SDL platform can speak Prerecorded indicators and prompts.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesSilence":{"name":"SDLSpeechCapabilitiesSilence","abstract":"

    The SDL platform can speak Silence.

    "},"Constants.html#/c:@SDLSpeechCapabilitiesFile":{"name":"SDLSpeechCapabilitiesFile","abstract":"

    The SDL platform can play a file

    "},"Constants.html#/c:@SDLStaticIconNameAcceptCall":{"name":"SDLStaticIconNameAcceptCall","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAddWaypoint":{"name":"SDLStaticIconNameAddWaypoint","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAlbum":{"name":"SDLStaticIconNameAlbum","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAmbientLighting":{"name":"SDLStaticIconNameAmbientLighting","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameArrowNorth":{"name":"SDLStaticIconNameArrowNorth","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAudioMute":{"name":"SDLStaticIconNameAudioMute","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAudiobookEpisode":{"name":"SDLStaticIconNameAudiobookEpisode","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAudiobookNarrator":{"name":"SDLStaticIconNameAudiobookNarrator","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameAuxillaryAudio":{"name":"SDLStaticIconNameAuxillaryAudio","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBack":{"name":"SDLStaticIconNameBack","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity0Of5":{"name":"SDLStaticIconNameBatteryCapacity0Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity1Of5":{"name":"SDLStaticIconNameBatteryCapacity1Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity2Of5":{"name":"SDLStaticIconNameBatteryCapacity2Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity3Of5":{"name":"SDLStaticIconNameBatteryCapacity3Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity4Of5":{"name":"SDLStaticIconNameBatteryCapacity4Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBatteryCapacity5Of5":{"name":"SDLStaticIconNameBatteryCapacity5Of5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBluetoothAudioSource":{"name":"SDLStaticIconNameBluetoothAudioSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBluetooth1":{"name":"SDLStaticIconNameBluetooth1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBluetooth2":{"name":"SDLStaticIconNameBluetooth2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameBrowse":{"name":"SDLStaticIconNameBrowse","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellPhoneInRoamingMode":{"name":"SDLStaticIconNameCellPhoneInRoamingMode","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength0Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength0Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength1Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength1Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength2Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength2Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength3Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength3Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength4Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength4Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCellServiceSignalStrength5Of5Bars":{"name":"SDLStaticIconNameCellServiceSignalStrength5Of5Bars","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameChangeLaneLeft":{"name":"SDLStaticIconNameChangeLaneLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameChangeLaneRight":{"name":"SDLStaticIconNameChangeLaneRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCheckBoxChecked":{"name":"SDLStaticIconNameCheckBoxChecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCheckBoxUnchecked":{"name":"SDLStaticIconNameCheckBoxUnchecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameClimate":{"name":"SDLStaticIconNameClimate","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameClock":{"name":"SDLStaticIconNameClock","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameCompose":{"name":"SDLStaticIconNameCompose","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameContact":{"name":"SDLStaticIconNameContact","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameContinue":{"name":"SDLStaticIconNameContinue","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDash":{"name":"SDLStaticIconNameDash","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDate":{"name":"SDLStaticIconNameDate","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDelete":{"name":"SDLStaticIconNameDelete","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDestination":{"name":"SDLStaticIconNameDestination","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameDestinationFerryAhead":{"name":"SDLStaticIconNameDestinationFerryAhead","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameEbookmark":{"name":"SDLStaticIconNameEbookmark","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameEmpty":{"name":"SDLStaticIconNameEmpty","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameEndCall":{"name":"SDLStaticIconNameEndCall","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFail":{"name":"SDLStaticIconNameFail","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFastForward30Secs":{"name":"SDLStaticIconNameFastForward30Secs","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFavoriteHeart":{"name":"SDLStaticIconNameFavoriteHeart","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFavoriteStar":{"name":"SDLStaticIconNameFavoriteStar","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFaxNumber":{"name":"SDLStaticIconNameFaxNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFilename":{"name":"SDLStaticIconNameFilename","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFilter":{"name":"SDLStaticIconNameFilter","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFolder":{"name":"SDLStaticIconNameFolder","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFuelPrices":{"name":"SDLStaticIconNameFuelPrices","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameFullMap":{"name":"SDLStaticIconNameFullMap","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameGenericPhoneNumber":{"name":"SDLStaticIconNameGenericPhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameGenre":{"name":"SDLStaticIconNameGenre","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameGlobalKeyboard":{"name":"SDLStaticIconNameGlobalKeyboard","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameHighwayExitInformation":{"name":"SDLStaticIconNameHighwayExitInformation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameHomePhoneNumber":{"name":"SDLStaticIconNameHomePhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameHyperlink":{"name":"SDLStaticIconNameHyperlink","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameID3TagUnknown":{"name":"SDLStaticIconNameID3TagUnknown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameIncomingCalls":{"name":"SDLStaticIconNameIncomingCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameInformation":{"name":"SDLStaticIconNameInformation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameIPodMediaSource":{"name":"SDLStaticIconNameIPodMediaSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameJoinCalls":{"name":"SDLStaticIconNameJoinCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameKeepLeft":{"name":"SDLStaticIconNameKeepLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameKeepRight":{"name":"SDLStaticIconNameKeepRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameKey":{"name":"SDLStaticIconNameKey","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLeft":{"name":"SDLStaticIconNameLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLeftArrow":{"name":"SDLStaticIconNameLeftArrow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLeftExit":{"name":"SDLStaticIconNameLeftExit","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLineInAudioSource":{"name":"SDLStaticIconNameLineInAudioSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameLocked":{"name":"SDLStaticIconNameLocked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlLeftArrow":{"name":"SDLStaticIconNameMediaControlLeftArrow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlRecording":{"name":"SDLStaticIconNameMediaControlRecording","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlRightArrow":{"name":"SDLStaticIconNameMediaControlRightArrow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMediaControlStop":{"name":"SDLStaticIconNameMediaControlStop","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMicrophone":{"name":"SDLStaticIconNameMicrophone","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMissedCalls":{"name":"SDLStaticIconNameMissedCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMobilePhoneNumber":{"name":"SDLStaticIconNameMobilePhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMoveDown":{"name":"SDLStaticIconNameMoveDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMoveUp":{"name":"SDLStaticIconNameMoveUp","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameMP3TagArtist":{"name":"SDLStaticIconNameMP3TagArtist","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNavigation":{"name":"SDLStaticIconNameNavigation","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNavigationCurrentDirection":{"name":"SDLStaticIconNameNavigationCurrentDirection","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNegativeRatingThumbsDown":{"name":"SDLStaticIconNameNegativeRatingThumbsDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameNew":{"name":"SDLStaticIconNameNew","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOfficePhoneNumber":{"name":"SDLStaticIconNameOfficePhoneNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOpened":{"name":"SDLStaticIconNameOpened","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOrigin":{"name":"SDLStaticIconNameOrigin","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameOutgoingCalls":{"name":"SDLStaticIconNameOutgoingCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePause":{"name":"SDLStaticIconNamePause","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoneCall1":{"name":"SDLStaticIconNamePhoneCall1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoneCall2":{"name":"SDLStaticIconNamePhoneCall2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoneDevice":{"name":"SDLStaticIconNamePhoneDevice","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhonebook":{"name":"SDLStaticIconNamePhonebook","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePhoto":{"name":"SDLStaticIconNamePhoto","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePlay":{"name":"SDLStaticIconNamePlay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePlaylist":{"name":"SDLStaticIconNamePlaylist","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePopUp":{"name":"SDLStaticIconNamePopUp","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePositiveRatingThumbsUp":{"name":"SDLStaticIconNamePositiveRatingThumbsUp","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePower":{"name":"SDLStaticIconNamePower","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNamePrimaryPhone":{"name":"SDLStaticIconNamePrimaryPhone","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRadioButtonChecked":{"name":"SDLStaticIconNameRadioButtonChecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRadioButtonUnchecked":{"name":"SDLStaticIconNameRadioButtonUnchecked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRecentCalls":{"name":"SDLStaticIconNameRecentCalls","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRecentDestinations":{"name":"SDLStaticIconNameRecentDestinations","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRedo":{"name":"SDLStaticIconNameRedo","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRefresh":{"name":"SDLStaticIconNameRefresh","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRemoteDiagnosticsCheckEngine":{"name":"SDLStaticIconNameRemoteDiagnosticsCheckEngine","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRendered911Assist":{"name":"SDLStaticIconNameRendered911Assist","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRepeat":{"name":"SDLStaticIconNameRepeat","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRepeatPlay":{"name":"SDLStaticIconNameRepeatPlay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameReply":{"name":"SDLStaticIconNameReply","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRewind30Secs":{"name":"SDLStaticIconNameRewind30Secs","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRight":{"name":"SDLStaticIconNameRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRightExit":{"name":"SDLStaticIconNameRightExit","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRingtones":{"name":"SDLStaticIconNameRingtones","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand1":{"name":"SDLStaticIconNameRoundaboutLeftHand1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand2":{"name":"SDLStaticIconNameRoundaboutLeftHand2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand3":{"name":"SDLStaticIconNameRoundaboutLeftHand3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand4":{"name":"SDLStaticIconNameRoundaboutLeftHand4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand5":{"name":"SDLStaticIconNameRoundaboutLeftHand5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand6":{"name":"SDLStaticIconNameRoundaboutLeftHand6","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutLeftHand7":{"name":"SDLStaticIconNameRoundaboutLeftHand7","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand1":{"name":"SDLStaticIconNameRoundaboutRightHand1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand2":{"name":"SDLStaticIconNameRoundaboutRightHand2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand3":{"name":"SDLStaticIconNameRoundaboutRightHand3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand4":{"name":"SDLStaticIconNameRoundaboutRightHand4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand5":{"name":"SDLStaticIconNameRoundaboutRightHand5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand6":{"name":"SDLStaticIconNameRoundaboutRightHand6","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRoundaboutRightHand7":{"name":"SDLStaticIconNameRoundaboutRightHand7","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameRSS":{"name":"SDLStaticIconNameRSS","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSettings":{"name":"SDLStaticIconNameSettings","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSharpLeft":{"name":"SDLStaticIconNameSharpLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSharpRight":{"name":"SDLStaticIconNameSharpRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameShow":{"name":"SDLStaticIconNameShow","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameShufflePlay":{"name":"SDLStaticIconNameShufflePlay","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSkiPlaces":{"name":"SDLStaticIconNameSkiPlaces","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSlightLeft":{"name":"SDLStaticIconNameSlightLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSlightRight":{"name":"SDLStaticIconNameSlightRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSmartphone":{"name":"SDLStaticIconNameSmartphone","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSortList":{"name":"SDLStaticIconNameSortList","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber0":{"name":"SDLStaticIconNameSpeedDialNumbersNumber0","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber1":{"name":"SDLStaticIconNameSpeedDialNumbersNumber1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber2":{"name":"SDLStaticIconNameSpeedDialNumbersNumber2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber3":{"name":"SDLStaticIconNameSpeedDialNumbersNumber3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber4":{"name":"SDLStaticIconNameSpeedDialNumbersNumber4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber5":{"name":"SDLStaticIconNameSpeedDialNumbersNumber5","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber6":{"name":"SDLStaticIconNameSpeedDialNumbersNumber6","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber7":{"name":"SDLStaticIconNameSpeedDialNumbersNumber7","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber8":{"name":"SDLStaticIconNameSpeedDialNumbersNumber8","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSpeedDialNumbersNumber9":{"name":"SDLStaticIconNameSpeedDialNumbersNumber9","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameSuccess":{"name":"SDLStaticIconNameSuccess","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameTrackTitle":{"name":"SDLStaticIconNameTrackTitle","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameTrafficReport":{"name":"SDLStaticIconNameTrafficReport","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameTurnList":{"name":"SDLStaticIconNameTurnList","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUTurnLeftTraffic":{"name":"SDLStaticIconNameUTurnLeftTraffic","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUTurnRightTraffic":{"name":"SDLStaticIconNameUTurnRightTraffic","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUndo":{"name":"SDLStaticIconNameUndo","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUnlocked":{"name":"SDLStaticIconNameUnlocked","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameUSBMediaAudioSource":{"name":"SDLStaticIconNameUSBMediaAudioSource","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo1":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo1","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo2":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo2","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo3":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo3","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceControlScrollbarListItemNo4":{"name":"SDLStaticIconNameVoiceControlScrollbarListItemNo4","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionFailed":{"name":"SDLStaticIconNameVoiceRecognitionFailed","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionPause":{"name":"SDLStaticIconNameVoiceRecognitionPause","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSuccessful":{"name":"SDLStaticIconNameVoiceRecognitionSuccessful","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemActive":{"name":"SDLStaticIconNameVoiceRecognitionSystemActive","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionSystemListening":{"name":"SDLStaticIconNameVoiceRecognitionSystemListening","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameVoiceRecognitionTryAgain":{"name":"SDLStaticIconNameVoiceRecognitionTryAgain","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameWarning":{"name":"SDLStaticIconNameWarning","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameWeather":{"name":"SDLStaticIconNameWeather","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameWifiFull":{"name":"SDLStaticIconNameWifiFull","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameZoomIn":{"name":"SDLStaticIconNameZoomIn","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLStaticIconNameZoomOut":{"name":"SDLStaticIconNameZoomOut","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLDefaultScreenSize":{"name":"SDLDefaultScreenSize","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamDidStartNotification":{"name":"SDLVideoStreamDidStartNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamDidStopNotification":{"name":"SDLVideoStreamDidStopNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamSuspendedNotification":{"name":"SDLVideoStreamSuspendedNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamDidStartNotification":{"name":"SDLAudioStreamDidStartNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamDidStopNotification":{"name":"SDLAudioStreamDidStopNotification","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerWillPresentLockScreenViewController":{"name":"SDLLockScreenManagerWillPresentLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerDidPresentLockScreenViewController":{"name":"SDLLockScreenManagerDidPresentLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerWillDismissLockScreenViewController":{"name":"SDLLockScreenManagerWillDismissLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLLockScreenManagerDidDismissLockScreenViewController":{"name":"SDLLockScreenManagerDidDismissLockScreenViewController","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateStopped":{"name":"SDLVideoStreamManagerStateStopped","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateStarting":{"name":"SDLVideoStreamManagerStateStarting","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateReady":{"name":"SDLVideoStreamManagerStateReady","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateSuspended":{"name":"SDLVideoStreamManagerStateSuspended","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLVideoStreamManagerStateShuttingDown":{"name":"SDLVideoStreamManagerStateShuttingDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateStopped":{"name":"SDLAudioStreamManagerStateStopped","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateStarting":{"name":"SDLAudioStreamManagerStateStarting","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateReady":{"name":"SDLAudioStreamManagerStateReady","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAudioStreamManagerStateShuttingDown":{"name":"SDLAudioStreamManagerStateShuttingDown","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppStateInactive":{"name":"SDLAppStateInactive","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLAppStateActive":{"name":"SDLAppStateActive","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLSupportedSeatDriver":{"name":"SDLSupportedSeatDriver","abstract":"

    @abstract Save current seat postions and settings to seat memory.

    "},"Constants.html#/c:@SDLSupportedSeatFrontPassenger":{"name":"SDLSupportedSeatFrontPassenger","abstract":"

    @abstract Restore / apply the seat memory settings to the current seat.

    "},"Constants.html#/c:@SDLSystemActionDefaultAction":{"name":"SDLSystemActionDefaultAction","abstract":"

    A default soft button action

    "},"Constants.html#/c:@SDLSystemActionStealFocus":{"name":"SDLSystemActionStealFocus","abstract":"

    An action causing your app to steal HMI focus

    "},"Constants.html#/c:@SDLSystemActionKeepContext":{"name":"SDLSystemActionKeepContext","abstract":"

    An action causing you to keep context

    "},"Constants.html#/c:@SDLSystemCapabilityTypeAppServices":{"name":"SDLSystemCapabilityTypeAppServices","abstract":"

    The app services capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypeNavigation":{"name":"SDLSystemCapabilityTypeNavigation","abstract":"

    The navigation capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypePhoneCall":{"name":"SDLSystemCapabilityTypePhoneCall","abstract":"

    The phone call capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypeVideoStreaming":{"name":"SDLSystemCapabilityTypeVideoStreaming","abstract":"

    The video streaming capability

    "},"Constants.html#/c:@SDLSystemCapabilityTypeRemoteControl":{"name":"SDLSystemCapabilityTypeRemoteControl","abstract":"

    The remote control capability

    "},"Constants.html#/c:@SDLSystemContextMain":{"name":"SDLSystemContextMain","abstract":"

    No user interaction (user-initiated or app-initiated) is in progress.

    "},"Constants.html#/c:@SDLSystemContextVoiceRecognitionSession":{"name":"SDLSystemContextVoiceRecognitionSession","abstract":"

    VR-oriented, user-initiated or app-initiated interaction is in-progress.

    "},"Constants.html#/c:@SDLSystemContextMenu":{"name":"SDLSystemContextMenu","abstract":"

    Menu-oriented, user-initiated or app-initiated interaction is in-progress.

    "},"Constants.html#/c:@SDLSystemContextHMIObscured":{"name":"SDLSystemContextHMIObscured","abstract":"

    The app’s display HMI is currently being obscured by either a system or other app’s overlay.

    "},"Constants.html#/c:@SDLSystemContextAlert":{"name":"SDLSystemContextAlert","abstract":"

    Broadcast only to whichever app has an alert currently being displayed.

    "},"Constants.html#/c:@SDLTBTStateRouteUpdateRequest":{"name":"SDLTBTStateRouteUpdateRequest","abstract":"

    The route should be updated

    "},"Constants.html#/c:@SDLTBTStateRouteAccepted":{"name":"SDLTBTStateRouteAccepted","abstract":"

    The route is accepted

    "},"Constants.html#/c:@SDLTBTStateRouteRefused":{"name":"SDLTBTStateRouteRefused","abstract":"

    The route is refused

    "},"Constants.html#/c:@SDLTBTStateRouteCancelled":{"name":"SDLTBTStateRouteCancelled","abstract":"

    The route is cancelled

    "},"Constants.html#/c:@SDLTBTStateETARequest":{"name":"SDLTBTStateETARequest","abstract":"

    The route should update its Estimated Time of Arrival

    "},"Constants.html#/c:@SDLTBTStateNextTurnRequest":{"name":"SDLTBTStateNextTurnRequest","abstract":"

    The route should update its next turn

    "},"Constants.html#/c:@SDLTBTStateRouteStatusRequest":{"name":"SDLTBTStateRouteStatusRequest","abstract":"

    The route should update its status

    "},"Constants.html#/c:@SDLTBTStateRouteSummaryRequest":{"name":"SDLTBTStateRouteSummaryRequest","abstract":"

    The route update its summary

    "},"Constants.html#/c:@SDLTBTStateTripStatusRequest":{"name":"SDLTBTStateTripStatusRequest","abstract":"

    The route should update the trip’s status

    "},"Constants.html#/c:@SDLTBTStateRouteUpdateRequestTimeout":{"name":"SDLTBTStateRouteUpdateRequestTimeout","abstract":"

    The route update timed out

    "},"Constants.html#/c:@SDLTPMSUnknown":{"name":"SDLTPMSUnknown","abstract":"

    If set the status of the tire is not known.

    "},"Constants.html#/c:@SDLTPMSSystemFault":{"name":"SDLTPMSSystemFault","abstract":"

    TPMS does not function.

    "},"Constants.html#/c:@SDLTPMSSensorFault":{"name":"SDLTPMSSensorFault","abstract":"

    The sensor of the tire does not function.

    "},"Constants.html#/c:@SDLTPMSLow":{"name":"SDLTPMSLow","abstract":"

    TPMS is reporting a low tire pressure for the tire.

    "},"Constants.html#/c:@SDLTPMSSystemActive":{"name":"SDLTPMSSystemActive","abstract":"

    TPMS is active and the tire pressure is monitored.

    "},"Constants.html#/c:@SDLTPMSTrain":{"name":"SDLTPMSTrain","abstract":"

    TPMS is reporting that the tire must be trained.

    "},"Constants.html#/c:@SDLTPMSTrainingComplete":{"name":"SDLTPMSTrainingComplete","abstract":"

    TPMS reports the training for the tire is completed.

    "},"Constants.html#/c:@SDLTPMSNotTrained":{"name":"SDLTPMSNotTrained","abstract":"

    TPMS reports the tire is not trained.

    "},"Constants.html#/c:@SDLTemperatureUnitCelsius":{"name":"SDLTemperatureUnitCelsius","abstract":"

    Reflects the current HMI setting for temperature unit in Celsius

    "},"Constants.html#/c:@SDLTemperatureUnitFahrenheit":{"name":"SDLTemperatureUnitFahrenheit","abstract":"

    Reflects the current HMI setting for temperature unit in Fahrenheit

    "},"Constants.html#/c:@SDLTextAlignmentLeft":{"name":"SDLTextAlignmentLeft","abstract":"

    Text aligned left.

    "},"Constants.html#/c:@SDLTextAlignmentRight":{"name":"SDLTextAlignmentRight","abstract":"

    Text aligned right.

    "},"Constants.html#/c:@SDLTextAlignmentCenter":{"name":"SDLTextAlignmentCenter","abstract":"

    Text aligned centered.

    "},"Constants.html#/c:@SDLTextFieldNameMainField1":{"name":"SDLTextFieldNameMainField1","abstract":"

    The first line of the first set of main fields of the persistent display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMainField2":{"name":"SDLTextFieldNameMainField2","abstract":"

    The second line of the first set of main fields of the persistent display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMainField3":{"name":"SDLTextFieldNameMainField3","abstract":"

    The first line of the second set of main fields of the persistent display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMainField4":{"name":"SDLTextFieldNameMainField4"},"Constants.html#/c:@SDLTextFieldNameStatusBar":{"name":"SDLTextFieldNameStatusBar","abstract":"

    The status bar on the NGN display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMediaClock":{"name":"SDLTextFieldNameMediaClock","abstract":"

    Text value for MediaClock field. Must be properly formatted according to MediaClockFormat. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameMediaTrack":{"name":"SDLTextFieldNameMediaTrack","abstract":"

    The track field of NGN type ACMs. This field is only available for media applications on a NGN display. Applies to SDLShow.

    "},"Constants.html#/c:@SDLTextFieldNameAlertText1":{"name":"SDLTextFieldNameAlertText1","abstract":"

    The first line of the alert text field. Applies to SDLAlert.

    "},"Constants.html#/c:@SDLTextFieldNameAlertText2":{"name":"SDLTextFieldNameAlertText2","abstract":"

    The second line of the alert text field. Applies to SDLAlert.

    "},"Constants.html#/c:@SDLTextFieldNameAlertText3":{"name":"SDLTextFieldNameAlertText3","abstract":"

    The third line of the alert text field. Applies to SDLAlert.

    "},"Constants.html#/c:@SDLTextFieldNameScrollableMessageBody":{"name":"SDLTextFieldNameScrollableMessageBody","abstract":"

    Long form body of text that can include newlines and tabs. Applies to SDLScrollableMessage.

    "},"Constants.html#/c:@SDLTextFieldNameInitialInteractionText":{"name":"SDLTextFieldNameInitialInteractionText","abstract":"

    First line suggestion for a user response (in the case of VR enabled interaction).

    "},"Constants.html#/c:@SDLTextFieldNameNavigationText1":{"name":"SDLTextFieldNameNavigationText1","abstract":"

    First line of navigation text.

    "},"Constants.html#/c:@SDLTextFieldNameNavigationText2":{"name":"SDLTextFieldNameNavigationText2","abstract":"

    Second line of navigation text.

    "},"Constants.html#/c:@SDLTextFieldNameETA":{"name":"SDLTextFieldNameETA","abstract":"

    Estimated Time of Arrival time for navigation.

    "},"Constants.html#/c:@SDLTextFieldNameTotalDistance":{"name":"SDLTextFieldNameTotalDistance","abstract":"

    Total distance to destination for navigation.

    "},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText1":{"name":"SDLTextFieldNameAudioPassThruDisplayText1","abstract":"

    First line of text for audio pass thru.

    "},"Constants.html#/c:@SDLTextFieldNameAudioPassThruDisplayText2":{"name":"SDLTextFieldNameAudioPassThruDisplayText2","abstract":"

    Second line of text for audio pass thru.

    "},"Constants.html#/c:@SDLTextFieldNameSliderHeader":{"name":"SDLTextFieldNameSliderHeader","abstract":"

    Header text for slider.

    "},"Constants.html#/c:@SDLTextFieldNameSliderFooter":{"name":"SDLTextFieldNameSliderFooter","abstract":"

    Footer text for slider

    "},"Constants.html#/c:@SDLTextFieldNameMenuName":{"name":"SDLTextFieldNameMenuName","abstract":"

    Primary text for SDLChoice

    "},"Constants.html#/c:@SDLTextFieldNameSecondaryText":{"name":"SDLTextFieldNameSecondaryText","abstract":"

    Secondary text for SDLChoice

    "},"Constants.html#/c:@SDLTextFieldNameTertiaryText":{"name":"SDLTextFieldNameTertiaryText","abstract":"

    Tertiary text for SDLChoice

    "},"Constants.html#/c:@SDLTextFieldNameMenuTitle":{"name":"SDLTextFieldNameMenuTitle","abstract":"

    Optional text to label an app menu button (for certain touchscreen platforms)

    "},"Constants.html#/c:@SDLTextFieldNameLocationName":{"name":"SDLTextFieldNameLocationName","abstract":"

    Optional name / title of intended location for SDLSendLocation

    "},"Constants.html#/c:@SDLTextFieldNameLocationDescription":{"name":"SDLTextFieldNameLocationDescription","abstract":"

    Optional description of intended location / establishment (if applicable) for SDLSendLocation

    "},"Constants.html#/c:@SDLTextFieldNameAddressLines":{"name":"SDLTextFieldNameAddressLines","abstract":"

    Optional location address (if applicable) for SDLSendLocation

    "},"Constants.html#/c:@SDLTextFieldNamePhoneNumber":{"name":"SDLTextFieldNamePhoneNumber","abstract":"

    Optional hone number of intended location / establishment (if applicable) for SDLSendLocation

    "},"Constants.html#/c:@SDLTimerModeUp":{"name":"SDLTimerModeUp","abstract":"

    The timer should count up.

    "},"Constants.html#/c:@SDLTimerModeDown":{"name":"SDLTimerModeDown","abstract":"

    The timer should count down.

    "},"Constants.html#/c:@SDLTimerModeNone":{"name":"SDLTimerModeNone","abstract":"

    The timer should not count.

    "},"Constants.html#/c:@SDLTouchTypeBegin":{"name":"SDLTouchTypeBegin","abstract":"

    The touch is the beginning of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTouchTypeMove":{"name":"SDLTouchTypeMove","abstract":"

    The touch is the movement of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTouchTypeEnd":{"name":"SDLTouchTypeEnd","abstract":"

    The touch is the ending of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTouchTypeCancel":{"name":"SDLTouchTypeCancel","abstract":"

    The touch is the cancellation of a finger pressed on the display.

    "},"Constants.html#/c:@SDLTriggerSourceMenu":{"name":"SDLTriggerSourceMenu","abstract":"

    Selection made via menu

    "},"Constants.html#/c:@SDLTriggerSourceVoiceRecognition":{"name":"SDLTriggerSourceVoiceRecognition","abstract":"

    Selection made via Voice session

    "},"Constants.html#/c:@SDLTriggerSourceKeyboard":{"name":"SDLTriggerSourceKeyboard","abstract":"

    Selection made via Keyboard

    "},"Constants.html#/c:@SDLTurnSignalOff":{"name":"SDLTurnSignalOff","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTurnSignalLeft":{"name":"SDLTurnSignalLeft","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTurnSignalRight":{"name":"SDLTurnSignalRight","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLTurnSignalBoth":{"name":"SDLTurnSignalBoth","abstract":"

    Undocumented

    "},"Constants.html#/c:@SDLUpdateModeCountUp":{"name":"SDLUpdateModeCountUp","abstract":"

    Starts the media clock timer counting upward, in increments of 1 second.

    "},"Constants.html#/c:@SDLUpdateModeCountDown":{"name":"SDLUpdateModeCountDown","abstract":"

    Starts the media clock timer counting downward, in increments of 1 second.

    "},"Constants.html#/c:@SDLUpdateModePause":{"name":"SDLUpdateModePause","abstract":"

    Pauses the media clock timer.

    "},"Constants.html#/c:@SDLUpdateModeResume":{"name":"SDLUpdateModeResume","abstract":"

    Resumes the media clock timer. The timer resumes counting in whatever mode was in effect before pausing (i.e. COUNTUP or COUNTDOWN).

    "},"Constants.html#/c:@SDLUpdateModeClear":{"name":"SDLUpdateModeClear","abstract":"

    Clear the media clock timer.

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveNotConfirmed","abstract":"

    Inactive not confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusInactiveConfirmed":{"name":"SDLVehicleDataActiveStatusInactiveConfirmed","abstract":"

    Inactive confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveNotConfirmed":{"name":"SDLVehicleDataActiveStatusActiveNotConfirmed","abstract":"

    Active not confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusActiveConfirmed":{"name":"SDLVehicleDataActiveStatusActiveConfirmed","abstract":"

    Active confirmed

    "},"Constants.html#/c:@SDLVehicleDataActiveStatusFault":{"name":"SDLVehicleDataActiveStatusFault","abstract":"

    Fault

    "},"Constants.html#/c:@SDLVehicleDataEventStatusNoEvent":{"name":"SDLVehicleDataEventStatusNoEvent","abstract":"

    No event

    "},"Constants.html#/c:@SDLVehicleDataEventStatusNo":{"name":"SDLVehicleDataEventStatusNo","abstract":"

    The event is a No status

    "},"Constants.html#/c:@SDLVehicleDataEventStatusYes":{"name":"SDLVehicleDataEventStatusYes","abstract":"

    The event is a Yes status

    "},"Constants.html#/c:@SDLVehicleDataEventStatusNotSupported":{"name":"SDLVehicleDataEventStatusNotSupported","abstract":"

    Vehicle data event is not supported

    "},"Constants.html#/c:@SDLVehicleDataEventStatusFault":{"name":"SDLVehicleDataEventStatusFault","abstract":"

    The event is a Fault status

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotSupported":{"name":"SDLVehicleDataNotificationStatusNotSupported","abstract":"

    The vehicle data notification status is not supported

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusNormal":{"name":"SDLVehicleDataNotificationStatusNormal","abstract":"

    The vehicle data notification status is normal

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusActive":{"name":"SDLVehicleDataNotificationStatusActive","abstract":"

    The vehicle data notification status is active

    "},"Constants.html#/c:@SDLVehicleDataNotificationStatusNotUsed":{"name":"SDLVehicleDataNotificationStatusNotUsed","abstract":"

    The vehicle data notification status is not used

    "},"Constants.html#/c:@SDLVehicleDataResultCodeSuccess":{"name":"SDLVehicleDataResultCodeSuccess","abstract":"

    Individual vehicle data item / DTC / DID request or subscription successful

    "},"Constants.html#/c:@SDLVehicleDataResultCodeTruncatedData":{"name":"SDLVehicleDataResultCodeTruncatedData","abstract":"

    DTC / DID request successful, however, not all active DTCs or full contents of DID location available

    "},"Constants.html#/c:@SDLVehicleDataResultCodeDisallowed":{"name":"SDLVehicleDataResultCodeDisallowed","abstract":"

    This vehicle data item is not allowed for this app by SDL

    "},"Constants.html#/c:@SDLVehicleDataResultCodeUserDisallowed":{"name":"SDLVehicleDataResultCodeUserDisallowed","abstract":"

    The user has not granted access to this type of vehicle data item at this time

    "},"Constants.html#/c:@SDLVehicleDataResultCodeInvalidId":{"name":"SDLVehicleDataResultCodeInvalidId","abstract":"

    The ECU ID referenced is not a valid ID on the bus / system

    "},"Constants.html#/c:@SDLVehicleDataResultCodeVehicleDataNotAvailable":{"name":"SDLVehicleDataResultCodeVehicleDataNotAvailable","abstract":"

    The requested vehicle data item / DTC / DID is not currently available or responding on the bus / system

    "},"Constants.html#/c:@SDLVehicleDataResultCodeDataAlreadySubscribed":{"name":"SDLVehicleDataResultCodeDataAlreadySubscribed","abstract":"

    The vehicle data item is already subscribed

    "},"Constants.html#/c:@SDLVehicleDataResultCodeDataNotSubscribed":{"name":"SDLVehicleDataResultCodeDataNotSubscribed","abstract":"

    The vehicle data item cannot be unsubscribed because it is not currently subscribed

    "},"Constants.html#/c:@SDLVehicleDataResultCodeIgnored":{"name":"SDLVehicleDataResultCodeIgnored","abstract":"

    The request for this item is ignored because it is already in progress

    "},"Constants.html#/c:@SDLVehicleDataStatusNoDataExists":{"name":"SDLVehicleDataStatusNoDataExists","abstract":"

    No data avaliable

    "},"Constants.html#/c:@SDLVehicleDataStatusOff":{"name":"SDLVehicleDataStatusOff","abstract":"

    The status is Off

    "},"Constants.html#/c:@SDLVehicleDataStatusOn":{"name":"SDLVehicleDataStatusOn","abstract":"

    The status is On

    "},"Constants.html#/c:@SDLVehicleDataTypeGPS":{"name":"SDLVehicleDataTypeGPS","abstract":"

    GPS vehicle data

    "},"Constants.html#/c:@SDLVehicleDataTypeSpeed":{"name":"SDLVehicleDataTypeSpeed","abstract":"

    Vehicle speed data

    "},"Constants.html#/c:@SDLVehicleDataTypeRPM":{"name":"SDLVehicleDataTypeRPM","abstract":"

    Vehicle RPM data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelLevel":{"name":"SDLVehicleDataTypeFuelLevel","abstract":"

    Vehicle fuel level data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelLevelState":{"name":"SDLVehicleDataTypeFuelLevelState","abstract":"

    Vehicle fuel level state data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelConsumption":{"name":"SDLVehicleDataTypeFuelConsumption","abstract":"

    Vehicle fuel consumption data

    "},"Constants.html#/c:@SDLVehicleDataTypeExternalTemperature":{"name":"SDLVehicleDataTypeExternalTemperature","abstract":"

    Vehicle external temperature data

    "},"Constants.html#/c:@SDLVehicleDataTypeVIN":{"name":"SDLVehicleDataTypeVIN","abstract":"

    Vehicle VIN data

    "},"Constants.html#/c:@SDLVehicleDataTypePRNDL":{"name":"SDLVehicleDataTypePRNDL","abstract":"

    Vehicle PRNDL data

    "},"Constants.html#/c:@SDLVehicleDataTypeTirePressure":{"name":"SDLVehicleDataTypeTirePressure","abstract":"

    Vehicle tire pressure data

    "},"Constants.html#/c:@SDLVehicleDataTypeOdometer":{"name":"SDLVehicleDataTypeOdometer","abstract":"

    Vehicle odometer data

    "},"Constants.html#/c:@SDLVehicleDataTypeBeltStatus":{"name":"SDLVehicleDataTypeBeltStatus","abstract":"

    Vehicle belt status data

    "},"Constants.html#/c:@SDLVehicleDataTypeBodyInfo":{"name":"SDLVehicleDataTypeBodyInfo","abstract":"

    Vehicle body info data

    "},"Constants.html#/c:@SDLVehicleDataTypeDeviceStatus":{"name":"SDLVehicleDataTypeDeviceStatus","abstract":"

    Vehicle device status data

    "},"Constants.html#/c:@SDLVehicleDataTypeECallInfo":{"name":"SDLVehicleDataTypeECallInfo","abstract":"

    Vehicle emergency call info data

    "},"Constants.html#/c:@SDLVehicleDataTypeFuelRange":{"name":"SDLVehicleDataTypeFuelRange","abstract":"

    Vehicle fuel range data

    "},"Constants.html#/c:@SDLVehicleDataTypeAirbagStatus":{"name":"SDLVehicleDataTypeAirbagStatus","abstract":"

    Vehicle airbag status data

    "},"Constants.html#/c:@SDLVehicleDataTypeEmergencyEvent":{"name":"SDLVehicleDataTypeEmergencyEvent","abstract":"

    Vehicle emergency event info

    "},"Constants.html#/c:@SDLVehicleDataTypeClusterModeStatus":{"name":"SDLVehicleDataTypeClusterModeStatus","abstract":"

    Vehicle cluster mode status data

    "},"Constants.html#/c:@SDLVehicleDataTypeMyKey":{"name":"SDLVehicleDataTypeMyKey","abstract":"

    Vehicle MyKey data

    "},"Constants.html#/c:@SDLVehicleDataTypeBraking":{"name":"SDLVehicleDataTypeBraking","abstract":"

    Vehicle braking data

    "},"Constants.html#/c:@SDLVehicleDataTypeWiperStatus":{"name":"SDLVehicleDataTypeWiperStatus","abstract":"

    Vehicle wiper status data

    "},"Constants.html#/c:@SDLVehicleDataTypeHeadlampStatus":{"name":"SDLVehicleDataTypeHeadlampStatus","abstract":"

    Vehicle headlamp status

    "},"Constants.html#/c:@SDLVehicleDataTypeBatteryVoltage":{"name":"SDLVehicleDataTypeBatteryVoltage","abstract":"

    Vehicle battery voltage data

    "},"Constants.html#/c:@SDLVehicleDataTypeEngineOilLife":{"name":"SDLVehicleDataTypeEngineOilLife","abstract":"

    Vehicle engine oil life data

    "},"Constants.html#/c:@SDLVehicleDataTypeEngineTorque":{"name":"SDLVehicleDataTypeEngineTorque","abstract":"

    Vehicle engine torque data

    "},"Constants.html#/c:@SDLVehicleDataTypeAccelerationPedal":{"name":"SDLVehicleDataTypeAccelerationPedal","abstract":"

    Vehicle accleration pedal data

    "},"Constants.html#/c:@SDLVehicleDataTypeSteeringWheel":{"name":"SDLVehicleDataTypeSteeringWheel","abstract":"

    Vehicle steering wheel data

    "},"Constants.html#/c:@SDLVehicleDataTypeElectronicParkBrakeStatus":{"name":"SDLVehicleDataTypeElectronicParkBrakeStatus","abstract":"

    Vehicle electronic parking brake status data

    "},"Constants.html#/c:@SDLVehicleDataTypeTurnSignal":{"name":"SDLVehicleDataTypeTurnSignal","abstract":"

    Vehicle turn signal data

    "},"Constants.html#/c:@SDLVehicleDataTypeCloudAppVehicleID":{"name":"SDLVehicleDataTypeCloudAppVehicleID","abstract":"

    The cloud application vehicle id. Used by cloud apps to identify a head unit

    "},"Constants.html#/c:@SDLVentilationModeUpper":{"name":"SDLVentilationModeUpper","abstract":"

    The upper ventilation mode

    "},"Constants.html#/c:@SDLVentilationModeLower":{"name":"SDLVentilationModeLower","abstract":"

    The lower ventilation mode

    "},"Constants.html#/c:@SDLVentilationModeBoth":{"name":"SDLVentilationModeBoth","abstract":"

    The both ventilation mode

    "},"Constants.html#/c:@SDLVentilationModeNone":{"name":"SDLVentilationModeNone","abstract":"

    No ventilation mode

    "},"Constants.html#/c:@SDLVideoStreamingCodecH264":{"name":"SDLVideoStreamingCodecH264","abstract":"

    H264

    "},"Constants.html#/c:@SDLVideoStreamingCodecH265":{"name":"SDLVideoStreamingCodecH265","abstract":"

    H265

    "},"Constants.html#/c:@SDLVideoStreamingCodecTheora":{"name":"SDLVideoStreamingCodecTheora","abstract":"

    Theora

    "},"Constants.html#/c:@SDLVideoStreamingCodecVP8":{"name":"SDLVideoStreamingCodecVP8","abstract":"

    VP8

    "},"Constants.html#/c:@SDLVideoStreamingCodecVP9":{"name":"SDLVideoStreamingCodecVP9","abstract":"

    VP9

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRAW":{"name":"SDLVideoStreamingProtocolRAW","abstract":"

    RAW

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRTP":{"name":"SDLVideoStreamingProtocolRTP","abstract":"

    RTP

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRTSP":{"name":"SDLVideoStreamingProtocolRTSP","abstract":"

    RTSP

    "},"Constants.html#/c:@SDLVideoStreamingProtocolRTMP":{"name":"SDLVideoStreamingProtocolRTMP","abstract":"

    RTMP

    "},"Constants.html#/c:@SDLVideoStreamingProtocolWebM":{"name":"SDLVideoStreamingProtocolWebM","abstract":"

    WebM

    "},"Constants.html#/c:@SDLVideoStreamingStateStreamable":{"name":"SDLVideoStreamingStateStreamable","abstract":"

    STREAMABLE, the current app is allowed to stream video

    "},"Constants.html#/c:@SDLVideoStreamingStateNotStreamable":{"name":"SDLVideoStreamingStateNotStreamable","abstract":"

    NOT_STREAMABLE, the current app is not allowed to stream video

    "},"Constants.html#/c:@SDLVRCapabilitiesText":{"name":"SDLVRCapabilitiesText","abstract":"

    The SDL platform is capable of recognizing spoken text in the current language.

    "},"Constants.html#/c:@SDLWarningLightStatusOff":{"name":"SDLWarningLightStatusOff","abstract":"

    The warning light is off

    "},"Constants.html#/c:@SDLWarningLightStatusOn":{"name":"SDLWarningLightStatusOn","abstract":"

    The warning light is off

    "},"Constants.html#/c:@SDLWarningLightStatusFlash":{"name":"SDLWarningLightStatusFlash","abstract":"

    The warning light is flashing

    "},"Constants.html#/c:@SDLWarningLightStatusNotUsed":{"name":"SDLWarningLightStatusNotUsed","abstract":"

    The warning light is unused

    "},"Constants.html#/c:@SDLWayPointTypeAll":{"name":"SDLWayPointTypeAll","abstract":"

    All other waypoint types

    "},"Constants.html#/c:@SDLWayPointTypeDestination":{"name":"SDLWayPointTypeDestination","abstract":"

    The destination waypoint

    "},"Constants.html#/c:@SDLWiperStatusOff":{"name":"SDLWiperStatusOff","abstract":"

    Wiper is off

    "},"Constants.html#/c:@SDLWiperStatusAutomaticOff":{"name":"SDLWiperStatusAutomaticOff","abstract":"

    Wiper is off automatically

    "},"Constants.html#/c:@SDLWiperStatusOffMoving":{"name":"SDLWiperStatusOffMoving","abstract":"

    Wiper is moving but off

    "},"Constants.html#/c:@SDLWiperStatusManualIntervalOff":{"name":"SDLWiperStatusManualIntervalOff","abstract":"

    Wiper is off due to a manual interval

    "},"Constants.html#/c:@SDLWiperStatusManualIntervalOn":{"name":"SDLWiperStatusManualIntervalOn","abstract":"

    Wiper is on due to a manual interval

    "},"Constants.html#/c:@SDLWiperStatusManualLow":{"name":"SDLWiperStatusManualLow","abstract":"

    Wiper is on low manually

    "},"Constants.html#/c:@SDLWiperStatusManualHigh":{"name":"SDLWiperStatusManualHigh","abstract":"

    Wiper is on high manually

    "},"Constants.html#/c:@SDLWiperStatusManualFlick":{"name":"SDLWiperStatusManualFlick","abstract":"

    Wiper is on for a single wipe manually

    "},"Constants.html#/c:@SDLWiperStatusWash":{"name":"SDLWiperStatusWash","abstract":"

    Wiper is in wash mode

    "},"Constants.html#/c:@SDLWiperStatusAutomaticLow":{"name":"SDLWiperStatusAutomaticLow","abstract":"

    Wiper is on low automatically

    "},"Constants.html#/c:@SDLWiperStatusAutomaticHigh":{"name":"SDLWiperStatusAutomaticHigh","abstract":"

    Wiper is on high automatically

    "},"Constants.html#/c:@SDLWiperStatusCourtesyWipe":{"name":"SDLWiperStatusCourtesyWipe","abstract":"

    Wiper is performing a courtesy wipe

    "},"Constants.html#/c:@SDLWiperStatusAutomaticAdjust":{"name":"SDLWiperStatusAutomaticAdjust","abstract":"

    Wiper is on automatic adjust

    "},"Constants.html#/c:@SDLWiperStatusStalled":{"name":"SDLWiperStatusStalled","abstract":"

    Wiper is stalled

    "},"Constants.html#/c:@SDLWiperStatusNoDataExists":{"name":"SDLWiperStatusNoDataExists","abstract":"

    Wiper data is not available

    "},"Constants.html#/c:@SmartDeviceLinkVersionNumber":{"name":"SmartDeviceLinkVersionNumber","abstract":"

    Undocumented

    "},"Constants.html#/c:@SmartDeviceLinkVersionString":{"name":"SmartDeviceLinkVersionString","abstract":"

    Undocumented

    "},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(im)initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:":{"name":"-initWithCurrentForecastSupported:maxMultidayForecastAmount:maxHourlyForecastAmount:maxMinutelyForecastAmount:weatherForLocationSupported:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)currentForecastSupported":{"name":"currentForecastSupported","abstract":"

    Whether or not the current forcast is supported.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMultidayForecastAmount":{"name":"maxMultidayForecastAmount","abstract":"

    The maximum number of day-by-day forecasts.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxHourlyForecastAmount":{"name":"maxHourlyForecastAmount","abstract":"

    The maximum number of hour-by-hour forecasts.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)maxMinutelyForecastAmount":{"name":"maxMinutelyForecastAmount","abstract":"

    The maximum number of minute-by-minute forecasts.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceManifest.html#/c:objc(cs)SDLWeatherServiceManifest(py)weatherForLocationSupported":{"name":"weatherForLocationSupported","abstract":"

    Whether or not the weather for location is supported.

    ","parent_name":"SDLWeatherServiceManifest"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:":{"name":"-initWithLocation:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(im)initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:":{"name":"-initWithLocation:currentForecast:minuteForecast:hourlyForecast:multidayForecast:alerts:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)location":{"name":"location","abstract":"

    The location.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)currentForecast":{"name":"currentForecast","abstract":"

    The current forecast.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)minuteForecast":{"name":"minuteForecast","abstract":"

    A minute-by-minute array of forecasts.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)hourlyForecast":{"name":"hourlyForecast","abstract":"

    An hour-by-hour array of forecasts.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)multidayForecast":{"name":"multidayForecast","abstract":"

    A day-by-day array of forecasts.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherServiceData.html#/c:objc(cs)SDLWeatherServiceData(py)alerts":{"name":"alerts","abstract":"

    An array of weather alerts. This array should be ordered with the first object being the current day.

    ","parent_name":"SDLWeatherServiceData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(im)initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:":{"name":"-initWithCurrentTemperature:temperatureHigh:temperatureLow:apparentTemperature:apparentTemperatureHigh:apparentTemperatureLow:weatherSummary:time:humidity:cloudCover:moonPhase:windBearing:windGust:windSpeed:nearestStormBearing:nearestStormDistance:precipAccumulation:precipIntensity:precipProbability:precipType:visibility:weatherIcon:","abstract":"

    Convenience init for all parameters

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)currentTemperature":{"name":"currentTemperature","abstract":"

    The current temperature.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureHigh":{"name":"temperatureHigh","abstract":"

    The predicted high temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)temperatureLow":{"name":"temperatureLow","abstract":"

    The predicted low temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperature":{"name":"apparentTemperature","abstract":"

    The apparent temperature.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureHigh":{"name":"apparentTemperatureHigh","abstract":"

    The predicted high apparent temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)apparentTemperatureLow":{"name":"apparentTemperatureLow","abstract":"

    The predicted low apparent temperature for the day.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherSummary":{"name":"weatherSummary","abstract":"

    A summary of the weather.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)time":{"name":"time","abstract":"

    The time this data refers to.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)humidity":{"name":"humidity","abstract":"

    From 0 to 1, percentage humidity.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)cloudCover":{"name":"cloudCover","abstract":"

    From 0 to 1, percentage cloud cover.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)moonPhase":{"name":"moonPhase","abstract":"

    From 0 to 1, percentage of the moon seen, e.g. 0 = no moon, 0.25 = quarter moon

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windBearing":{"name":"windBearing","abstract":"

    In degrees, true north at 0 degrees.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windGust":{"name":"windGust","abstract":"

    In km/hr

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)windSpeed":{"name":"windSpeed","abstract":"

    In km/hr

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormBearing":{"name":"nearestStormBearing","abstract":"

    In degrees, true north at 0 degrees.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)nearestStormDistance":{"name":"nearestStormDistance","abstract":"

    In km

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipAccumulation":{"name":"precipAccumulation","abstract":"

    In cm

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipIntensity":{"name":"precipIntensity","abstract":"

    In cm of water per hour.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipProbability":{"name":"precipProbability","abstract":"

    From 0 to 1, percentage chance.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)precipType":{"name":"precipType","abstract":"

    A description of the precipitation type (e.g. rain, snow, sleet, hail)

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)visibility":{"name":"visibility","abstract":"

    In km

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherData.html#/c:objc(cs)SDLWeatherData(py)weatherIcon":{"name":"weatherIcon","abstract":"

    The weather icon image.

    ","parent_name":"SDLWeatherData"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(im)initWithTitle:summary:expires:regions:severity:timeIssued:":{"name":"-initWithTitle:summary:expires:regions:severity:timeIssued:","abstract":"

    Convenience init for all parameters

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)title":{"name":"title","abstract":"

    The title of the alert.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)summary":{"name":"summary","abstract":"

    A summary for the alert.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)expires":{"name":"expires","abstract":"

    The date the alert expires.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)regions":{"name":"regions","abstract":"

    Regions affected.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)severity":{"name":"severity","abstract":"

    Severity of the weather alert.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLWeatherAlert.html#/c:objc(cs)SDLWeatherAlert(py)timeIssued":{"name":"timeIssued","abstract":"

    The date the alert was issued.

    ","parent_name":"SDLWeatherAlert"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:":{"name":"-initWithText:image:","abstract":"

    Undocumented

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(im)initWithText:image:position:":{"name":"-initWithText:image:position:","abstract":"

    Undocumented

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)text":{"name":"text","abstract":"

    Text to display for VR Help item

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)image":{"name":"image","abstract":"

    Image for VR Help item

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVRHelpItem.html#/c:objc(cs)SDLVRHelpItem(py)position":{"name":"position","abstract":"

    Position to display item in VR Help list

    ","parent_name":"SDLVRHelpItem"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)voiceCommands":{"name":"voiceCommands","abstract":"

    The strings the user can say to activate this voice command

    ","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(py)handler":{"name":"handler","abstract":"

    The handler that will be called when the command is activated

    ","parent_name":"SDLVoiceCommand"},"Classes/SDLVoiceCommand.html#/c:objc(cs)SDLVoiceCommand(im)initWithVoiceCommands:handler:":{"name":"-initWithVoiceCommands:handler:","abstract":"

    Undocumented

    ","parent_name":"SDLVoiceCommand"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)protocol":{"name":"protocol","abstract":"

    Protocol type, see VideoStreamingProtocol

    ","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(py)codec":{"name":"codec","abstract":"

    Codec type, see VideoStreamingCodec

    ","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingFormat.html#/c:objc(cs)SDLVideoStreamingFormat(im)initWithCodec:protocol:":{"name":"-initWithCodec:protocol:","abstract":"

    Undocumented

    ","parent_name":"SDLVideoStreamingFormat"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(im)initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:":{"name":"-initWithPreferredResolution:maxBitrate:supportedFormats:hapticDataSupported:","abstract":"

    Undocumented

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)preferredResolution":{"name":"preferredResolution","abstract":"

    The preferred resolution of a video stream for decoding and rendering on HMI

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)maxBitrate":{"name":"maxBitrate","abstract":"

    The maximum bitrate of video stream that is supported, in kbps, optional

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)supportedFormats":{"name":"supportedFormats","abstract":"

    Detailed information on each format supported by this system, in its preferred order

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVideoStreamingCapability.html#/c:objc(cs)SDLVideoStreamingCapability(py)hapticSpatialDataSupported":{"name":"hapticSpatialDataSupported","abstract":"

    True if the system can utilize the haptic spatial data from the source being streamed.

    ","parent_name":"SDLVideoStreamingCapability"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)major":{"name":"major","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)minor":{"name":"minor","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)patch":{"name":"patch","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(py)stringVersion":{"name":"stringVersion","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithMajor:minor:patch:":{"name":"-initWithMajor:minor:patch:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithMajor:minor:patch:":{"name":"+versionWithMajor:minor:patch:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithString:":{"name":"-initWithString:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithString:":{"name":"+versionWithString:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)initWithSyncMsgVersion:":{"name":"-initWithSyncMsgVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(cm)versionWithSyncMsgVersion:":{"name":"+versionWithSyncMsgVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)compare:":{"name":"-compare:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanVersion:":{"name":"-isLessThanVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isEqualToVersion:":{"name":"-isEqualToVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanVersion:":{"name":"-isGreaterThanVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isGreaterThanOrEqualToVersion:":{"name":"-isGreaterThanOrEqualToVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVersion.html#/c:objc(cs)SDLVersion(im)isLessThanOrEqualToVersion:":{"name":"-isLessThanOrEqualToVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLVersion"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)make":{"name":"make","abstract":"

    The make of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)model":{"name":"model","abstract":"

    The model of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)modelYear":{"name":"modelYear","abstract":"

    The model year of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleType.html#/c:objc(cs)SDLVehicleType(py)trim":{"name":"trim","abstract":"

    The trim of the vehicle

    ","parent_name":"SDLVehicleType"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)dataType":{"name":"dataType","abstract":"

    Defined published data element type

    ","parent_name":"SDLVehicleDataResult"},"Classes/SDLVehicleDataResult.html#/c:objc(cs)SDLVehicleDataResult(py)resultCode":{"name":"resultCode","abstract":"

    Published data result code

    ","parent_name":"SDLVehicleDataResult"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(im)initWithTurnList:softButtons:":{"name":"-initWithTurnList:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)turnList":{"name":"turnList","abstract":"

    Optional, SDLTurn, 1 - 100 entries

    ","parent_name":"SDLUpdateTurnList"},"Classes/SDLUpdateTurnList.html#/c:objc(cs)SDLUpdateTurnList(py)softButtons":{"name":"softButtons","abstract":"

    Required, SDLSoftButton, 0 - 1 Entries

    ","parent_name":"SDLUpdateTurnList"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"

    The result of requesting to unsubscribe to the GPSData.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"

    The result of requesting to unsubscribe to the vehicle speed in kilometers per hour.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"

    The result of requesting to unsubscribe to the number of revolutions per minute of the engine.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The result of requesting to unsubscribe to the fuel level in the tank (percentage)

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The result of requesting to unsubscribe to the fuel level state.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"

    The result of requesting to unsubscribe to the fuel range.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The result of requesting to unsubscribe to the instantaneous fuel consumption in microlitres.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The result of requesting to unsubscribe to the external temperature in degrees celsius.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"

    The result of requesting to unsubscribe to the PRNDL status.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"

    The result of requesting to unsubscribe to the tireStatus.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"

    The result of requesting to unsubscribe to the odometer in km.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"

    The result of requesting to unsubscribe to the status of the seat belts.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The result of requesting to unsubscribe to the body information including power modes.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The result of requesting to unsubscribe to the device status including signal and battery strength.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"

    The result of requesting to unsubscribe to the status of the brake pedal.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The result of requesting to unsubscribe to the status of the wipers.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"

    The result of requesting to unsubscribe to the status of the head lamps.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The result of requesting to unsubscribe to the estimated percentage of remaining oil life of the engine.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"

    The result of requesting to unsubscribe to the torque value for engine (in Nm) on non-diesel variants.

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    The result of requesting to unsubscribe to the accelerator pedal position (percentage depressed)

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    The result of requesting to unsubscribe to the current angle of the steering wheel (in deg)

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"

    The result of requesting to unsubscribe to the emergency call info

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The result of requesting to unsubscribe to the airbag status

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    The result of requesting to unsubscribe to the emergency event

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"

    The result of requesting to unsubscribe to the cluster modes

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"

    The result of requesting to unsubscribe to the myKey status

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The result of requesting to unsubscribe to the electronic parking brake status

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"

    The result of requesting to unsubscribe to the turn signal

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleDataResponse.html#/c:objc(cs)SDLUnsubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The result of requesting to unsubscribe to the cloud app vehicle id

    ","parent_name":"SDLUnsubscribeVehicleDataResponse"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:","abstract":"

    Convenience init for unsubscribing to all possible vehicle data items.

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for unsubscribing to all possible vehicle data items.

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for unsubscribing to all possible vehicle data items.

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)gps":{"name":"gps","abstract":"

    If true, unsubscribes from GPS

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)speed":{"name":"speed","abstract":"

    If true, unsubscribes from Speed

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"

    If true, unsubscribes from RPM

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    If true, unsubscribes from Fuel Level

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    If true, unsubscribes from Fuel Level State

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    If true, unsubscribes from Fuel Range

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    If true, unsubscribes from Instant Fuel Consumption

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    If true, unsubscribes from External Temperature

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"

    If true, unsubscribes from PRNDL

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    If true, unsubscribes from Tire Pressure

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"

    If true, unsubscribes from Odometer

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    If true, unsubscribes from Belt Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    If true, unsubscribes from Body Information

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    If true, unsubscribes from Device Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    If true, unsubscribes from Driver Braking

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    If true, unsubscribes from Wiper Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    If true, unsubscribes from Head Lamp Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    If true, unsubscribes from Engine Oil Life

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    If true, unsubscribes from Engine Torque

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    If true, unsubscribes from Acc Pedal Position

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    If true, unsubscribes from Steering Wheel Angle data

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    If true, unsubscribes from eCallInfo

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    If true, unsubscribes from Airbag Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    If true, unsubscribes from Emergency Event

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    If true, unsubscribes from Cluster Mode Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"

    If true, unsubscribes from My Key

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    A boolean value. If true, unsubscribes to the Electronic Parking Brake Status

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    A boolean value. If true, unsubscribes to the Turn Signal

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeVehicleData.html#/c:objc(cs)SDLUnsubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    A boolean value. If true, unsubscribes to the Cloud App Vehicle ID

    ","parent_name":"SDLUnsubscribeVehicleData"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(im)initWithButtonName:":{"name":"-initWithButtonName:","abstract":"

    Undocumented

    ","parent_name":"SDLUnsubscribeButton"},"Classes/SDLUnsubscribeButton.html#/c:objc(cs)SDLUnsubscribeButton(py)buttonName":{"name":"buttonName","abstract":"

    A name of the button to unsubscribe from","parent_name":"SDLUnsubscribeButton"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(im)initWithNavigationText:turnIcon:":{"name":"-initWithNavigationText:turnIcon:","abstract":"

    Undocumented

    ","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)navigationText":{"name":"navigationText","abstract":"

    Individual turn text. Must provide at least text or icon for a given turn

    ","parent_name":"SDLTurn"},"Classes/SDLTurn.html#/c:objc(cs)SDLTurn(py)turnIcon":{"name":"turnIcon","abstract":"

    Individual turn icon. Must provide at least text or icon for a given turn

    ","parent_name":"SDLTurn"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventDelegate":{"name":"touchEventDelegate","abstract":"

    Notified of processed touches such as pinches, pans, and taps

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEventHandler":{"name":"touchEventHandler","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapDistanceThreshold":{"name":"tapDistanceThreshold","abstract":"

    Distance between two taps on the screen, in the head unit’s coordinate system, used for registering double-tap callbacks.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)panDistanceThreshold":{"name":"panDistanceThreshold","abstract":"

    Minimum distance for a pan gesture in the head unit’s coordinate system, used for registering pan callbacks.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)tapTimeThreshold":{"name":"tapTimeThreshold","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)movementTimeThreshold":{"name":"movementTimeThreshold","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)enableSyncedPanning":{"name":"enableSyncedPanning","abstract":"

    If set to NO, the display link syncing will be ignored and movementTimeThreshold will be used. Defaults to YES.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(py)touchEnabled":{"name":"touchEnabled","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)cancelPendingTouches":{"name":"-cancelPendingTouches","abstract":"

    @abstract","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)initWithHitTester:":{"name":"-initWithHitTester:","abstract":"

    Initialize a touch manager with a hit tester if available

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchManager.html#/c:objc(cs)SDLTouchManager(im)syncFrame":{"name":"-syncFrame","abstract":"

    Called by SDLStreamingMediaManager in sync with the streaming framerate. This helps to moderate panning gestures by allowing the UI to be modified in time with the framerate.

    ","parent_name":"SDLTouchManager"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)pressAvailable":{"name":"pressAvailable","abstract":"

    Whether or not long presses are available

    ","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)multiTouchAvailable":{"name":"multiTouchAvailable","abstract":"

    Whether or not multi-touch (e.g. a pinch gesture) is available

    ","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEventCapabilities.html#/c:objc(cs)SDLTouchEventCapabilities(py)doublePressAvailable":{"name":"doublePressAvailable","abstract":"

    Whether or not a double tap is available

    ","parent_name":"SDLTouchEventCapabilities"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)touchEventId":{"name":"touchEventId","abstract":"

    A touch’s unique identifier. The application can track the current touch events by id.

    ","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)timeStamp":{"name":"timeStamp","abstract":"

    The time that the touch was recorded. This number can the time since the beginning of the session or something else as long as the units are in milliseconds.

    ","parent_name":"SDLTouchEvent"},"Classes/SDLTouchEvent.html#/c:objc(cs)SDLTouchEvent(py)coord":{"name":"coord","abstract":"

    The touch’s coordinate

    ","parent_name":"SDLTouchEvent"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)x":{"name":"x","abstract":"

    The x value of the touch coordinate

    ","parent_name":"SDLTouchCoord"},"Classes/SDLTouchCoord.html#/c:objc(cs)SDLTouchCoord(py)y":{"name":"y","abstract":"

    The y value of the touch coordinate

    ","parent_name":"SDLTouchCoord"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(im)initWithTouchEvent:":{"name":"-initWithTouchEvent:","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)identifier":{"name":"identifier","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)location":{"name":"location","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)timeStamp":{"name":"timeStamp","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isFirstFinger":{"name":"isFirstFinger","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTouch.html#/c:objc(cs)SDLTouch(py)isSecondFinger":{"name":"isSecondFinger","abstract":"

    @abstract","parent_name":"SDLTouch"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)pressureTelltale":{"name":"pressureTelltale","abstract":"

    Status of the Tire Pressure Telltale. See WarningLightStatus.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftFront":{"name":"leftFront","abstract":"

    The status of the left front tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightFront":{"name":"rightFront","abstract":"

    The status of the right front tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)leftRear":{"name":"leftRear","abstract":"

    The status of the left rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)rightRear":{"name":"rightRear","abstract":"

    The status of the right rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerLeftRear":{"name":"innerLeftRear","abstract":"

    The status of the inner left rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTireStatus.html#/c:objc(cs)SDLTireStatus(py)innerRightRear":{"name":"innerRightRear","abstract":"

    The status of the innter right rear tire.

    ","parent_name":"SDLTireStatus"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)name":{"name":"name","abstract":"

    The enumeration identifying the field.

    ","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)characterSet":{"name":"characterSet","abstract":"

    The character set that is supported in this field.

    ","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)width":{"name":"width","abstract":"

    The number of characters in one row of this field.

    ","parent_name":"SDLTextField"},"Classes/SDLTextField.html#/c:objc(cs)SDLTextField(py)rows":{"name":"rows","abstract":"

    The number of rows for this text field.

    ","parent_name":"SDLTextField"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:":{"name":"-initWithPrimaryRGBColor:secondaryRGBColor:backgroundRGBColor:","abstract":"

    Undocumented

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(im)initWithPrimaryColor:secondaryColor:backgroundColor:":{"name":"-initWithPrimaryColor:secondaryColor:backgroundColor:","abstract":"

    Undocumented

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)primaryColor":{"name":"primaryColor","abstract":"

    The primary color. This must always be your primary brand color. If the OEM only uses one color, this will be the color. It is recommended to the OEMs that the primaryColor should change the mediaClockTimer bar and the highlight color of soft buttons.

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)secondaryColor":{"name":"secondaryColor","abstract":"

    The secondary color. This may be an accent or complimentary color to your primary brand color. If the OEM uses this color, they must also use the primary color. It is recommended to the OEMs that the secondaryColor should change the background color of buttons, such as soft buttons.

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemplateColorScheme.html#/c:objc(cs)SDLTemplateColorScheme(py)backgroundColor":{"name":"backgroundColor","abstract":"

    The background color to be used on the template. If the OEM does not support this parameter, assume on dayColorScheme that this will be a light color, and on nightColorScheme a dark color. You should do the same for your custom schemes.

    ","parent_name":"SDLTemplateColorScheme"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithFahrenheitValue:":{"name":"-initWithFahrenheitValue:","abstract":"

    Convenience init for a fahrenheit temperature value.

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithCelsiusValue:":{"name":"-initWithCelsiusValue:","abstract":"

    Convenience init for a celsius temperature value.

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(im)initWithUnit:value:":{"name":"-initWithUnit:value:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)unit":{"name":"unit","abstract":"

    Temperature unit

    ","parent_name":"SDLTemperature"},"Classes/SDLTemperature.html#/c:objc(cs)SDLTemperature(py)value":{"name":"value","abstract":"

    Temperature value in specified unit. Range depends on OEM and is not checked by SDL.

    ","parent_name":"SDLTemperature"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(im)initWithText:type:":{"name":"-initWithText:type:","abstract":"

    Initialize with text and a type

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)textChunksFromString:":{"name":"+textChunksFromString:","abstract":"

    Create TTS using text

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)sapiChunksFromString:":{"name":"+sapiChunksFromString:","abstract":"

    Create TTS using SAPI

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)lhPlusChunksFromString:":{"name":"+lhPlusChunksFromString:","abstract":"

    Create TTS using LH Plus

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)prerecordedChunksFromString:":{"name":"+prerecordedChunksFromString:","abstract":"

    Create TTS using prerecorded chunks

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)silenceChunks":{"name":"+silenceChunks","abstract":"

    Create TTS using silence

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(cm)fileChunksWithName:":{"name":"+fileChunksWithName:","abstract":"

    Create TTS to play an audio file previously uploaded to the system.

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)text":{"name":"text","abstract":"

    Text to be spoken, a phoneme specification, or the name of a pre-recorded / pre-uploaded sound. The contents of this field are indicated by the type field.

    ","parent_name":"SDLTTSChunk"},"Classes/SDLTTSChunk.html#/c:objc(cs)SDLTTSChunk(py)type":{"name":"type","abstract":"

    The type of information in the text field (e.g. phrase to be spoken, phoneme specification, name of pre-recorded sound).

    ","parent_name":"SDLTTSChunk"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithType:fileName:":{"name":"-initWithType:fileName:","abstract":"

    Create a generic system request with a file name

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(im)initWithProprietaryType:fileName:":{"name":"-initWithProprietaryType:fileName:","abstract":"

    Create an OEM_PROPRIETARY system request with a subtype and file name

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestType":{"name":"requestType","abstract":"

    The type of system request. Note that Proprietary requests should forward the binary data to the known proprietary module on the system.

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"

    A request subType used when the requestType is OEM_SPECIFIC.

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemRequest.html#/c:objc(cs)SDLSystemRequest(py)fileName":{"name":"fileName","abstract":"

    Filename of HTTP data to store in predefined system staging area.

    ","parent_name":"SDLSystemRequest"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)supportsSubscriptions":{"name":"supportsSubscriptions","abstract":"

    YES if subscriptions are available on the connected head unit. If NO, calls to subscribeToCapabilityType:withBlock and subscribeToCapabilityType:withObserver:selector will fail.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)displayCapabilities":{"name":"displayCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"

    If returned, the platform supports on-screen SoftButtons

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"

    If returned, the platform supports custom on-screen Presets

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)speechCapabilities":{"name":"speechCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)prerecordedSpeechCapabilities":{"name":"prerecordedSpeechCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)vrCapability":{"name":"vrCapability","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)pcmStreamCapability":{"name":"pcmStreamCapability","abstract":"
    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"

    If returned, the platform supports app services

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)navigationCapability":{"name":"navigationCapability","abstract":"

    If returned, the platform supports navigation

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)phoneCapability":{"name":"phoneCapability","abstract":"

    If returned, the platform supports making phone calls

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"

    If returned, the platform supports video streaming

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"

    If returned, the platform supports remote control capabilities

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)init":{"name":"-init","abstract":"

    Init is unavailable. Dependencies must be injected using initWithConnectionManager:

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"

    Creates a new system capability manager with a specified connection manager

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)start":{"name":"-start","abstract":"

    Starts the manager. This method is used internally.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)stop":{"name":"-stop","abstract":"

    Stops the manager. This method is used internally.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)updateCapabilityType:completionHandler:":{"name":"-updateCapabilityType:completionHandler:","abstract":"

    Retrieves a capability type from the remote system. This function must be called in order to retrieve the values for navigationCapability, phoneCapability, videoStreamingCapability, remoteControlCapability, and appServicesCapabilities. If you do not call this method first, those values will be nil. After calling this method, assuming there is no error in the handler, you may retrieve the capability you requested from the manager within the handler.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withBlock:":{"name":"-subscribeToCapabilityType:withBlock:","abstract":"

    Subscribe to a particular capability type using a block callback

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)subscribeToCapabilityType:withObserver:selector:":{"name":"-subscribeToCapabilityType:withObserver:selector:","abstract":"

    Subscribe to a particular capability type with a selector callback. The selector supports the following parameters:

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapabilityManager.html#/c:objc(cs)SDLSystemCapabilityManager(im)unsubscribeFromCapabilityType:withObserver:":{"name":"-unsubscribeFromCapabilityType:withObserver:","abstract":"

    Unsubscribe from a particular capability type. If it was subscribed with a block, the return value should be passed to the observer to unsubscribe the block. If it was subscribed with a selector, the observer object should be passed to unsubscribe the object selector.

    ","parent_name":"SDLSystemCapabilityManager"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithAppServicesCapabilities:":{"name":"-initWithAppServicesCapabilities:","abstract":"

    Convenience init for an App Service Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithNavigationCapability:":{"name":"-initWithNavigationCapability:","abstract":"

    Convenience init for a Navigation Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithPhoneCapability:":{"name":"-initWithPhoneCapability:","abstract":"

    Convenience init for a Phone Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithVideoStreamingCapability:":{"name":"-initWithVideoStreamingCapability:","abstract":"

    Convenience init for a Video Streaming Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(im)initWithRemoteControlCapability:":{"name":"-initWithRemoteControlCapability:","abstract":"

    Convenience init for a Remote Control Capability

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"

    Used as a descriptor of what data to expect in this struct. The corresponding param to this enum should be included and the only other parameter included.

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)appServicesCapabilities":{"name":"appServicesCapabilities","abstract":"

    Describes the capabilities of app services including what service types are supported and the current state of services.

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)navigationCapability":{"name":"navigationCapability","abstract":"

    Describes the extended capabilities of the onboard navigation system

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)phoneCapability":{"name":"phoneCapability","abstract":"

    Describes the extended capabilities of the module’s phone feature

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)videoStreamingCapability":{"name":"videoStreamingCapability","abstract":"

    Describes the capabilities of the module’s video streaming feature

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSystemCapability.html#/c:objc(cs)SDLSystemCapability(py)remoteControlCapability":{"name":"remoteControlCapability","abstract":"

    Describes the extended capabilities of the module’s remote control feature

    ","parent_name":"SDLSystemCapability"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(im)initWithMajorVersion:minorVersion:patchVersion:":{"name":"-initWithMajorVersion:minorVersion:patchVersion:","abstract":"

    Undocumented

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)majorVersion":{"name":"majorVersion","abstract":"

    The major version indicates versions that is not-compatible to previous versions

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)minorVersion":{"name":"minorVersion","abstract":"

    The minor version indicates a change to a previous version that should still allow to be run on an older version (with limited functionality)

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSyncMsgVersion.html#/c:objc(cs)SDLSyncMsgVersion(py)patchVersion":{"name":"patchVersion","abstract":"

    Allows backward-compatible fixes to the API without increasing the minor version of the interface

    ","parent_name":"SDLSyncMsgVersion"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)gps":{"name":"gps","abstract":"

    The result of requesting to subscribe to the GPSData.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)speed":{"name":"speed","abstract":"

    The result of requesting to subscribe to the vehicle speed in kilometers per hour.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"

    The result of requesting to subscribe to the number of revolutions per minute of the engine.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The result of requesting to subscribe to the fuel level in the tank (percentage)

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The result of requesting to subscribe to the fuel level state.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"

    The result of requesting to subscribe to the fuel range.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The result of requesting to subscribe to the instantaneous fuel consumption in microlitres.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The result of requesting to subscribe to the external temperature in degrees celsius.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"

    The result of requesting to subscribe to the PRNDL status.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"

    The result of requesting to subscribe to the tireStatus.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"

    The result of requesting to subscribe to the odometer in km.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"

    The result of requesting to subscribe to the status of the seat belts.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The result of requesting to subscribe to the body information including power modes.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The result of requesting to subscribe to the device status including signal and battery strength.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"

    The result of requesting to subscribe to the status of the brake pedal.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The result of requesting to subscribe to the status of the wipers.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"

    The result of requesting to subscribe to the status of the head lamps.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The result of requesting to subscribe to the estimated percentage of remaining oil life of the engine.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"

    The result of requesting to subscribe to the torque value for engine (in Nm) on non-diesel variants.

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    The result of requesting to subscribe to the accelerator pedal position (percentage depressed)

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    The result of requesting to subscribe to the current angle of the steering wheel (in deg)

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"

    The result of requesting to subscribe to the emergency call info

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The result of requesting to subscribe to the airbag status

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    The result of requesting to subscribe to the emergency event

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)clusterModes":{"name":"clusterModes","abstract":"

    The result of requesting to subscribe to the cluster modes

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"

    The result of requesting to subscribe to the myKey status

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The result of requesting to subscribe to the electronic parking brake status

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"

    The result of requesting to subscribe to the turn signal

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleDataResponse.html#/c:objc(cs)SDLSubscribeVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The result of requesting to subscribe to the cloud app vehicle ID

    ","parent_name":"SDLSubscribeVehicleDataResponse"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:wiperStatus:","abstract":"

    Convenience init for subscribing to all possible vehicle data items.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for subscribing to all possible vehicle data items.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:wiperStatus:","abstract":"

    Convenience init for subscribing to all possible vehicle data items.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)gps":{"name":"gps","abstract":"

    A boolean value. If true, subscribes GPS data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)speed":{"name":"speed","abstract":"

    A boolean value. If true, subscribes Speed data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)rpm":{"name":"rpm","abstract":"

    A boolean value. If true, subscribes RPM data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    A boolean value. If true, subscribes Fuel Level data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    A boolean value. If true, subscribes Fuel Level State data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    A boolean value. If true, subscribes Fuel Range data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    A boolean value. If true, subscribes Instant Fuel Consumption data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    A boolean value. If true, subscribes External Temperature data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)prndl":{"name":"prndl","abstract":"

    A boolean value. If true, subscribes PRNDL data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    A boolean value. If true, subscribes Tire Pressure status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)odometer":{"name":"odometer","abstract":"

    A boolean value. If true, subscribes Odometer data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    A boolean value. If true, subscribes Belt Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    A boolean value. If true, subscribes Body Information data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    A boolean value. If true, subscribes Device Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    A boolean value. If true, subscribes Driver Braking data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    A boolean value. If true, subscribes Wiper Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    A boolean value. If true, subscribes Head Lamp Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    A boolean value. If true, subscribes to Engine Oil Life data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    A boolean value. If true, subscribes Engine Torque data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    A boolean value. If true, subscribes Acc Pedal Position data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    A boolean value. If true, subscribes Steering Wheel Angle data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    A boolean value. If true, subscribes eCall Info data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    A boolean value. If true, subscribes Airbag Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    A boolean value. If true, subscribes Emergency Event data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    A boolean value. If true, subscribes Cluster Mode Status data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)myKey":{"name":"myKey","abstract":"

    A boolean value. If true, subscribes myKey data.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    A boolean value. If true, subscribes to the electronic parking brake status.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    A boolean value. If true, subscribes to the turn signal status.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeVehicleData.html#/c:objc(cs)SDLSubscribeVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    A boolean value. If true, subscribes to the cloud app vehicle ID.

    ","parent_name":"SDLSubscribeVehicleData"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"

    Construct a SDLSubscribeButton with a handler callback when an event occurs.

    ","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(im)initWithButtonName:handler:":{"name":"-initWithButtonName:handler:","abstract":"

    Undocumented

    ","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)handler":{"name":"handler","abstract":"

    A handler that will let you know when the button you subscribed to is selected.

    ","parent_name":"SDLSubscribeButton"},"Classes/SDLSubscribeButton.html#/c:objc(cs)SDLSubscribeButton(py)buttonName":{"name":"buttonName","abstract":"

    The name of the button to subscribe to","parent_name":"SDLSubscribeButton"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)touchManager":{"name":"touchManager","abstract":"

    Touch Manager responsible for providing touch event notifications.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioManager":{"name":"audioManager","abstract":"

    Audio Manager responsible for managing streaming audio.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)rootViewController":{"name":"rootViewController","abstract":"

    This property is used for SDLCarWindow, the ability to stream any view controller. To start, you must set an initial view controller on SDLStreamingMediaConfiguration rootViewController. After streaming begins, you can replace that view controller with a new root by placing the new view controller into this property.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)focusableItemManager":{"name":"focusableItemManager","abstract":"

    A haptic interface that can be updated to reparse views within the window you’ve provided. Send a SDLDidUpdateProjectionView notification or call the updateInterfaceLayout method to reparse. The output of this haptic interface occurs in the touchManager property where it will call the delegate.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)streamingSupported":{"name":"streamingSupported","abstract":"

    Whether or not video streaming is supported

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoConnected":{"name":"videoConnected","abstract":"

    Whether or not the video session is connected.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoEncrypted":{"name":"videoEncrypted","abstract":"

    Whether or not the video session is encrypted. This may be different than the requestedEncryptionType.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioConnected":{"name":"audioConnected","abstract":"

    Whether or not the audio session is connected.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)audioEncrypted":{"name":"audioEncrypted","abstract":"

    Whether or not the audio session is encrypted. This may be different than the requestedEncryptionType.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoStreamingPaused":{"name":"videoStreamingPaused","abstract":"

    Whether or not the video stream is paused due to either the application being backgrounded, the HMI state being either NONE or BACKGROUND, or the video stream not being ready.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)screenSize":{"name":"screenSize","abstract":"

    This is the current screen size of a connected display. This will be the size the video encoder uses to encode the raw image data.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)videoFormat":{"name":"videoFormat","abstract":"

    This is the agreed upon format of video encoder that is in use, or nil if not currently connected.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)supportedFormats":{"name":"supportedFormats","abstract":"

    A list of all supported video formats by this manager

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)pixelBufferPool":{"name":"pixelBufferPool","abstract":"

    The pixel buffer pool reference returned back from an active VTCompressionSessionRef encoder.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(py)requestedEncryptionType":{"name":"requestedEncryptionType","abstract":"

    The requested encryption type when a session attempts to connect. This setting applies to both video and audio sessions.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"

    Create a new streaming media manager for navigation and VPM apps with a specified configuration

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startWithProtocol:":{"name":"-startWithProtocol:","abstract":"

    Start the manager with a completion block that will be called when startup completes. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on SDLManager.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startAudioWithProtocol:":{"name":"-startAudioWithProtocol:","abstract":"

    Start the audio feature of the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on SDLManager.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)startVideoWithProtocol:":{"name":"-startVideoWithProtocol:","abstract":"

    Start the video feature of the manager. This is used internally. To use an SDLStreamingMediaManager, you should use the manager found on SDLManager.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stop":{"name":"-stop","abstract":"

    Stop the manager. This method is used internally.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopAudio":{"name":"-stopAudio","abstract":"

    Stop the audio feature of the manager. This method is used internally.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)stopVideo":{"name":"-stopVideo","abstract":"

    Stop the video feature of the manager. This method is used internally.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:":{"name":"-sendVideoData:","abstract":"

    This method receives raw image data and will run iOS8+‘s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendVideoData:presentationTimestamp:":{"name":"-sendVideoData:presentationTimestamp:","abstract":"

    This method receives raw image data and will run iOS8+‘s hardware video encoder to turn the data into a video stream, which will then be passed to the connected head unit.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaManager.html#/c:objc(cs)SDLStreamingMediaManager(im)sendAudioData:":{"name":"-sendAudioData:","abstract":"

    This method receives PCM audio data and will attempt to send that data across to the head unit for immediate playback.

    ","parent_name":"SDLStreamingMediaManager"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)securityManagers":{"name":"securityManagers","abstract":"

    Set security managers which could be used. This is primarily used with video streaming applications to authenticate and perhaps encrypt traffic data.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)maximumDesiredEncryption":{"name":"maximumDesiredEncryption","abstract":"

    What encryption level video/audio streaming should be. The default is SDLStreamingEncryptionFlagAuthenticateAndEncrypt.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)customVideoEncoderSettings":{"name":"customVideoEncoderSettings","abstract":"

    Properties to use for applications that utilize the video encoder for streaming. See VTCompressionProperties.h for more details. For example, you can set kVTCompressionPropertyKey_ExpectedFrameRate to set your framerate. Setting the framerate this way will also set the framerate if you use CarWindow automatic streaming.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)dataSource":{"name":"dataSource","abstract":"

    Usable to change run time video stream setup behavior. Only use this and modify the results if you really know what you’re doing. The head unit defaults are generally good.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)rootViewController":{"name":"rootViewController","abstract":"

    Set the initial view controller your video streaming content is within.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)carWindowRenderingType":{"name":"carWindowRenderingType","abstract":"

    Declares if CarWindow will use layer rendering or view rendering. Defaults to layer rendering.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)enableForcedFramerateSync":{"name":"enableForcedFramerateSync","abstract":"

    When YES, the StreamingMediaManager will run a CADisplayLink with the framerate set to the video encoder settings kVTCompressionPropertyKey_ExpectedFrameRate. This then forces TouchManager (and CarWindow, if used) to sync their callbacks to the framerate. If using CarWindow, this must be YES. If NO, enableSyncedPanning on SDLTouchManager will be set to NO. Defaults to YES.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(py)allowMultipleViewControllerOrientations":{"name":"allowMultipleViewControllerOrientations","abstract":"

    When YES, the StreamingMediaManager will disable its internal checks that the rootViewController only has one supportedOrientation. Having multiple orientations can cause streaming issues. If you wish to disable this check, set it to YES. Defaults to NO.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)init":{"name":"-init","abstract":"

    Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you’d like custom video encoder settings, you can set the property manually.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithSecurityManagers:encryptionFlag:videoSettings:dataSource:rootViewController:":{"name":"-initWithSecurityManagers:encryptionFlag:videoSettings:dataSource:rootViewController:","abstract":"

    Manually set all the properties to the streaming media configuration

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(im)initWithSecurityManagers:":{"name":"-initWithSecurityManagers:","abstract":"

    Create a secure configuration for each of the security managers provided.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)secureConfigurationWithSecurityManagers:":{"name":"+secureConfigurationWithSecurityManagers:","abstract":"

    Create a secure configuration for each of the security managers provided.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)insecureConfiguration":{"name":"+insecureConfiguration","abstract":"

    Create an insecure video streaming configuration. No security managers will be provided and the encryption flag will be set to None. If you’d like custom video encoder settings, you can set the property manually. This is equivalent to init.

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingInsecureConfigurationWithInitialViewController:":{"name":"+autostreamingInsecureConfigurationWithInitialViewController:","abstract":"

    Create a CarWindow insecure configuration with a view controller

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStreamingMediaConfiguration.html#/c:objc(cs)SDLStreamingMediaConfiguration(cm)autostreamingSecureConfigurationWithSecurityManagers:initialViewController:":{"name":"+autostreamingSecureConfigurationWithSecurityManagers:initialViewController:","abstract":"

    Create a CarWindow secure configuration with a view controller and security managers

    ","parent_name":"SDLStreamingMediaConfiguration"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(im)initWithCountryCode:fccFacilityId:":{"name":"-initWithCountryCode:fccFacilityId:","abstract":"

    Undocumented

    ","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)countryCode":{"name":"countryCode","abstract":"

    @abstract Binary Representation of ITU Country Code. USA Code is 001.

    ","parent_name":"SDLStationIDNumber"},"Classes/SDLStationIDNumber.html#/c:objc(cs)SDLStationIDNumber(py)fccFacilityId":{"name":"fccFacilityId","abstract":"

    @abstract Binary representation of unique facility ID assigned by the FCC","parent_name":"SDLStationIDNumber"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithTimeInterval:":{"name":"-initWithTimeInterval:","abstract":"

    Create a time struct with a time interval (time in seconds). Fractions of the second will be eliminated and rounded down.

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(im)initWithHours:minutes:seconds:":{"name":"-initWithHours:minutes:seconds:","abstract":"

    Create a time struct with hours, minutes, and seconds

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)hours":{"name":"hours","abstract":"

    The hour of the media clock

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)minutes":{"name":"minutes","abstract":"

    The minute of the media clock

    ","parent_name":"SDLStartTime"},"Classes/SDLStartTime.html#/c:objc(cs)SDLStartTime(py)seconds":{"name":"seconds","abstract":"

    The second of the media clock

    ","parent_name":"SDLStartTime"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTS:":{"name":"-initWithTTS:","abstract":"

    Undocumented

    ","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(im)initWithTTSChunks:":{"name":"-initWithTTSChunks:","abstract":"

    Undocumented

    ","parent_name":"SDLSpeak"},"Classes/SDLSpeak.html#/c:objc(cs)SDLSpeak(py)ttsChunks":{"name":"ttsChunks","abstract":"

    An array of TTSChunk structs which, taken together, specify the phrase to be spoken

    ","parent_name":"SDLSpeak"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)name":{"name":"name","abstract":"

    The name of this soft button state

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)artwork":{"name":"artwork","abstract":"

    The artwork to be used with this button or nil if it is text-only

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)text":{"name":"text","abstract":"

    The text to be used with this button or nil if it is image-only

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)highlighted":{"name":"highlighted","abstract":"

    Whether or not the button should be highlighted on the UI

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)systemAction":{"name":"systemAction","abstract":"

    A special system action

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(py)softButton":{"name":"softButton","abstract":"

    An SDLSoftButton describing this state

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:image:":{"name":"-initWithStateName:text:image:","abstract":"

    Create the soft button state. Either the text or artwork or both may be set.

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonState.html#/c:objc(cs)SDLSoftButtonState(im)initWithStateName:text:artwork:":{"name":"-initWithStateName:text:artwork:","abstract":"

    Create the soft button state. Either the text or artwork or both may be set.

    ","parent_name":"SDLSoftButtonState"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)name":{"name":"name","abstract":"

    The name of this button

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)states":{"name":"states","abstract":"

    All states available to this button

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentState":{"name":"currentState","abstract":"

    The name of the current state of this soft button

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)currentStateSoftButton":{"name":"currentStateSoftButton","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(py)eventHandler":{"name":"eventHandler","abstract":"

    The handler to be called when the button is in the current state and is pressed

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:states:initialStateName:handler:":{"name":"-initWithName:states:initialStateName:handler:","abstract":"

    Create a multi-state (or single-state, but you should use initWithName:state: instead for that case) soft button. For example, a button that changes its image or text, such as a repeat or shuffle button.

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)initWithName:state:handler:":{"name":"-initWithName:state:handler:","abstract":"

    Create a single-state soft button. For example, a button that brings up a Perform Interaction menu.

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToStateNamed:":{"name":"-transitionToStateNamed:","abstract":"

    Transition the soft button to another state in the states property. The wrapper considers all transitions valid (assuming a state with that name exists).

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)transitionToNextState":{"name":"-transitionToNextState","abstract":"

    Transition the soft button to the next state of the array set when in the states property

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonObject.html#/c:objc(cs)SDLSoftButtonObject(im)stateWithName:":{"name":"-stateWithName:","abstract":"

    Return a state from the state array with a specific name.

    ","parent_name":"SDLSoftButtonObject"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"

    The button supports a short press.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"

    The button supports a LONG press.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"

    The button supports button down and button up.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButtonCapabilities.html#/c:objc(cs)SDLSoftButtonCapabilities(py)imageSupported":{"name":"imageSupported","abstract":"

    The button supports referencing a static or dynamic image.

    ","parent_name":"SDLSoftButtonCapabilities"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(im)initWithType:text:image:highlighted:buttonId:systemAction:handler:":{"name":"-initWithType:text:image:highlighted:buttonId:systemAction:handler:","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)handler":{"name":"handler","abstract":"

    Undocumented

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)type":{"name":"type","abstract":"

    Describes whether this soft button displays only text, only an image, or both

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)text":{"name":"text","abstract":"

    Optional text to display (if defined as TEXT or BOTH type)

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)image":{"name":"image","abstract":"

    Optional image struct for SoftButton (if defined as IMAGE or BOTH type)

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)isHighlighted":{"name":"isHighlighted","abstract":"

    Displays in an alternate mode, e.g. with a colored background or foreground. Depends on the IVI system.

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)softButtonID":{"name":"softButtonID","abstract":"

    Value which is returned via OnButtonPress / OnButtonEvent

    ","parent_name":"SDLSoftButton"},"Classes/SDLSoftButton.html#/c:objc(cs)SDLSoftButton(py)systemAction":{"name":"systemAction","abstract":"

    Parameter indicating whether selecting a SoftButton shall call a specific system action. This is intended to allow Notifications to bring the callee into full / focus; or in the case of persistent overlays, the overlay can persist when a SoftButton is pressed.

    ","parent_name":"SDLSoftButton"},"Classes/SDLSliderResponse.html#/c:objc(cs)SDLSliderResponse(py)sliderPosition":{"name":"sliderPosition","abstract":"

    The selected position of the slider.

    ","parent_name":"SDLSliderResponse"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:":{"name":"-initWithNumTicks:position:","abstract":"

    Create an SDLSlider with only the number of ticks and position. Note that this is not enough to get a SUCCESS response. You must supply additional data. See below for required parameters.

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooter:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooter:timeout:","abstract":"

    Create an SDLSlider with all required data and a static footer (or no footer).

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(im)initWithNumTicks:position:sliderHeader:sliderFooters:timeout:":{"name":"-initWithNumTicks:position:sliderHeader:sliderFooters:timeout:","abstract":"

    Create an SDLSlider with all required data and a dynamic footer (or no footer).

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)numTicks":{"name":"numTicks","abstract":"

    Represents a number of selectable items on a horizontal axis

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)position":{"name":"position","abstract":"

    An Initial position of slider control

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderHeader":{"name":"sliderHeader","abstract":"

    A text header to display

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)sliderFooter":{"name":"sliderFooter","abstract":"

    A text footer to display

    ","parent_name":"SDLSlider"},"Classes/SDLSlider.html#/c:objc(cs)SDLSlider(py)timeout":{"name":"timeout","abstract":"

    An App defined timeout in milliseconds

    ","parent_name":"SDLSlider"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)status":{"name":"status","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)monitoringSystemStatus":{"name":"monitoringSystemStatus","abstract":"

    The status of TPMS for this particular tire

    ","parent_name":"SDLSingleTireStatus"},"Classes/SDLSingleTireStatus.html#/c:objc(cs)SDLSingleTireStatus(py)pressure":{"name":"pressure","abstract":"

    The pressure value of this particular tire in kPa (kilopascals)

    ","parent_name":"SDLSingleTireStatus"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(im)initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:":{"name":"-initWithNavigationText1:navigationText2:eta:timeToDestination:totalDistance:turnIcon:nextTurnIcon:distanceToManeuver:distanceToManeuverScale:maneuverComplete:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText1":{"name":"navigationText1","abstract":"

    The first line of text in a multi-line overlay screen.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)navigationText2":{"name":"navigationText2","abstract":"

    The second line of text in a multi-line overlay screen.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)eta":{"name":"eta","abstract":"

    Estimated Time of Arrival time at final destination

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)timeToDestination":{"name":"timeToDestination","abstract":"

    The amount of time needed to reach the final destination

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)totalDistance":{"name":"totalDistance","abstract":"

    The distance to the final destination

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)turnIcon":{"name":"turnIcon","abstract":"

    An icon to show with the turn description

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)nextTurnIcon":{"name":"nextTurnIcon","abstract":"

    An icon to show with the next turn description

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuver":{"name":"distanceToManeuver","abstract":"

    Fraction of distance till next maneuver (starting from when AlertManeuver is triggered). Used to calculate progress bar.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)distanceToManeuverScale":{"name":"distanceToManeuverScale","abstract":"

    Distance till next maneuver (starting from) from previous maneuver. Used to calculate progress bar.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)maneuverComplete":{"name":"maneuverComplete","abstract":"

    If and when a maneuver has completed while an AlertManeuver is active, the app must send this value set to TRUE in order to clear the AlertManeuver overlay. If omitted the value will be assumed as FALSE.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShowConstantTBT.html#/c:objc(cs)SDLShowConstantTBT(py)softButtons":{"name":"softButtons","abstract":"

    Three dynamic SoftButtons available (first SoftButton is fixed to Turns). If omitted on supported displays, the currently displayed SoftButton values will not change.

    ","parent_name":"SDLShowConstantTBT"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:":{"name":"-initWithMainField1:mainField2:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:":{"name":"-initWithMainField1:mainField1Type:mainField2:mainField2Type:mainField3:mainField3Type:mainField4:mainField4Type:alignment:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:":{"name":"-initWithMainField1:mainField2:alignment:statusBar:mediaClock:mediaTrack:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(im)initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:":{"name":"-initWithMainField1:mainField2:mainField3:mainField4:alignment:statusBar:mediaClock:mediaTrack:graphic:softButtons:customPresets:textFieldMetadata:","abstract":"

    Undocumented

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField1":{"name":"mainField1","abstract":"

    The text displayed in a single-line display, or in the upper display","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField2":{"name":"mainField2","abstract":"

    The text displayed on the second display line of a two-line display

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField3":{"name":"mainField3","abstract":"

    The text displayed on the first display line of the second page

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mainField4":{"name":"mainField4","abstract":"

    The text displayed on the second display line of the second page

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)alignment":{"name":"alignment","abstract":"

    The alignment that Specifies how mainField1 and mainField2 text","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)statusBar":{"name":"statusBar","abstract":"

    Text in the Status Bar

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaClock":{"name":"mediaClock","abstract":"

    This property is deprecated use SetMediaClockTimer instead.","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)mediaTrack":{"name":"mediaTrack","abstract":"

    The text in the track field

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)graphic":{"name":"graphic","abstract":"

    An image to be shown on supported displays

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"

    An image to be shown on supported displays

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)softButtons":{"name":"softButtons","abstract":"

    The the Soft buttons defined by the App

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)customPresets":{"name":"customPresets","abstract":"

    The Custom Presets defined by the App

    ","parent_name":"SDLShow"},"Classes/SDLShow.html#/c:objc(cs)SDLShow(py)metadataTags":{"name":"metadataTags","abstract":"

    Text Field Metadata

    ","parent_name":"SDLShow"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countUpFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"

    Create a media clock timer that counts up, e.g from 0:00 to 4:18.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countUpFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countUpFromStartTime:toEndTime:playPauseIndicator:","abstract":"

    Create a media clock timer that counts up, e.g from 0:00 to 4:18.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:":{"name":"+countDownFromStartTimeInterval:toEndTimeInterval:playPauseIndicator:","abstract":"

    Create a media clock timer that counts down, e.g. from 4:18 to 0:00

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)countDownFromStartTime:toEndTime:playPauseIndicator:":{"name":"+countDownFromStartTime:toEndTime:playPauseIndicator:","abstract":"

    Create a media clock timer that counts down, e.g. from 4:18 to 0:00

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)pauseWithPlayPauseIndicator:":{"name":"+pauseWithPlayPauseIndicator:","abstract":"

    Pause an existing (counting up / down) media clock timer

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:":{"name":"+updatePauseWithNewStartTimeInterval:endTimeInterval:playPauseIndicator:","abstract":"

    Update a pause time (or pause and update the time) on a media clock timer

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)updatePauseWithNewStartTime:endTime:playPauseIndicator:":{"name":"+updatePauseWithNewStartTime:endTime:playPauseIndicator:","abstract":"

    Update a pause time (or pause and update the time) on a media clock timer

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)resumeWithPlayPauseIndicator:":{"name":"+resumeWithPlayPauseIndicator:","abstract":"

    Resume a paused media clock timer. It resumes at the same time at which it was paused.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(cm)clearWithPlayPauseIndicator:":{"name":"+clearWithPlayPauseIndicator:","abstract":"

    Remove a media clock timer from the screen

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:hours:minutes:seconds:audioStreamingIndicator:":{"name":"-initWithUpdateMode:hours:minutes:seconds:audioStreamingIndicator:","abstract":"

    Undocumented

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:hours:minutes:seconds:":{"name":"-initWithUpdateMode:hours:minutes:seconds:","abstract":"

    Undocumented

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:":{"name":"-initWithUpdateMode:","abstract":"

    Undocumented

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(im)initWithUpdateMode:startTime:endTime:playPauseIndicator:":{"name":"-initWithUpdateMode:startTime:endTime:playPauseIndicator:","abstract":"

    Create a SetMediaClockTimer RPC with all available parameters. It’s recommended to use the specific initializers above.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)startTime":{"name":"startTime","abstract":"

    A Start Time with specifying hour, minute, second values

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)endTime":{"name":"endTime","abstract":"

    An END time of type SDLStartTime, specifying hour, minute, second values

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)updateMode":{"name":"updateMode","abstract":"

    The media clock/timer update mode (COUNTUP/COUNTDOWN/PAUSE/RESUME)

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetMediaClockTimer.html#/c:objc(cs)SDLSetMediaClockTimer(py)audioStreamingIndicator":{"name":"audioStreamingIndicator","abstract":"

    The audio streaming indicator used for a play/pause button.

    ","parent_name":"SDLSetMediaClockTimer"},"Classes/SDLSetInteriorVehicleDataResponse.html#/c:objc(cs)SDLSetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"

    The new module data for the requested module

    ","parent_name":"SDLSetInteriorVehicleDataResponse"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(im)initWithModuleData:":{"name":"-initWithModuleData:","abstract":"

    Undocumented

    ","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetInteriorVehicleData.html#/c:objc(cs)SDLSetInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"

    The module data to set for the requested RC module.

    ","parent_name":"SDLSetInteriorVehicleData"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:":{"name":"-initWithHelpText:timeoutText:","abstract":"

    Initialize SetGlobalProperties with help text and timeout text

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:","abstract":"

    Initialize SetGlobalProperties with help text, timeout text, help title, and help items

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(im)initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:":{"name":"-initWithHelpText:timeoutText:vrHelpTitle:vrHelp:menuTitle:menuIcon:keyboardProperties:","abstract":"

    Initialize SetGlobalProperties with all possible items

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)helpPrompt":{"name":"helpPrompt","abstract":"

    Help prompt for when the user asks for help with an interface prompt

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"

    Help prompt for when an interface prompt times out

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelpTitle":{"name":"vrHelpTitle","abstract":"

    Sets a voice recognition Help Title

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)vrHelp":{"name":"vrHelp","abstract":"

    Sets the items listed in the VR help screen used in an interaction started by Push to Talk

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuTitle":{"name":"menuTitle","abstract":"

    Text for the menu button label

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)menuIcon":{"name":"menuIcon","abstract":"

    Icon for the menu button

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetGlobalProperties.html#/c:objc(cs)SDLSetGlobalProperties(py)keyboardProperties":{"name":"keyboardProperties","abstract":"

    On-screen keyboard (perform interaction) configuration

    ","parent_name":"SDLSetGlobalProperties"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"

    The display capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"

    The button capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"

    The soft button capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayoutResponse.html#/c:objc(cs)SDLSetDisplayLayoutResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"

    The preset bank capabilities of the new template layout

    ","parent_name":"SDLSetDisplayLayoutResponse"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:":{"name":"-initWithPredefinedLayout:","abstract":"

    Undocumented

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithLayout:":{"name":"-initWithLayout:","abstract":"

    Undocumented

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(im)initWithPredefinedLayout:dayColorScheme:nightColorScheme:":{"name":"-initWithPredefinedLayout:dayColorScheme:nightColorScheme:","abstract":"

    Undocumented

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)displayLayout":{"name":"displayLayout","abstract":"

    A display layout. Predefined or dynamically created screen layout.","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)dayColorScheme":{"name":"dayColorScheme","abstract":"

    The color scheme to be used on a head unit using a light or day color scheme. The OEM may only support this theme if their head unit only has a light color scheme.

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetDisplayLayout.html#/c:objc(cs)SDLSetDisplayLayout(py)nightColorScheme":{"name":"nightColorScheme","abstract":"

    The color scheme to be used on a head unit using a dark or night color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.

    ","parent_name":"SDLSetDisplayLayout"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"

    Convenience init.

    ","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetCloudAppProperties.html#/c:objc(cs)SDLSetCloudAppProperties(py)properties":{"name":"properties","abstract":"

    The new cloud application properties.

    ","parent_name":"SDLSetCloudAppProperties"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"

    Undocumented

    ","parent_name":"SDLSetAppIcon"},"Classes/SDLSetAppIcon.html#/c:objc(cs)SDLSetAppIcon(py)syncFileName":{"name":"syncFileName","abstract":"

    A file reference name","parent_name":"SDLSetAppIcon"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:":{"name":"-initWithAddress:addressLines:locationName:locationDescription:phoneNumber:image:deliveryMode:timeStamp:","abstract":"

    Create a SendLocation request with an address object, without Lat/Long coordinates.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:address:phoneNumber:image:","abstract":"

    Create a SendLocation request with Lat/Long coordinate, not an address object

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(im)initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:":{"name":"-initWithLongitude:latitude:locationName:locationDescription:displayAddressLines:phoneNumber:image:deliveryMode:timeStamp:address:","abstract":"

    Create a SendLocation request with Lat/Long coordinate and an address object and let the nav system decide how to parse it

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"

    The longitudinal coordinate of the location. Either the latitude / longitude OR the address must be provided.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"

    The latitudinal coordinate of the location. Either the latitude / longitude OR the address must be provided.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationName":{"name":"locationName","abstract":"

    Name / title of intended location

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationDescription":{"name":"locationDescription","abstract":"

    Description of the intended location / establishment

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)addressLines":{"name":"addressLines","abstract":"

    Location address for display purposes only.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)phoneNumber":{"name":"phoneNumber","abstract":"

    Phone number of intended location / establishment

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)locationImage":{"name":"locationImage","abstract":"

    Image / icon of intended location

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)deliveryMode":{"name":"deliveryMode","abstract":"

    Mode in which the sendLocation request is sent

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)timeStamp":{"name":"timeStamp","abstract":"

    Arrival time of Location. If multiple SendLocations are sent, this will be used for sorting as well.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendLocation.html#/c:objc(cs)SDLSendLocation(py)address":{"name":"address","abstract":"

    Address to be used for setting destination. Either the latitude / longitude OR the address must be provided.

    ","parent_name":"SDLSendLocation"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(im)initWithHapticRectData:":{"name":"-initWithHapticRectData:","abstract":"

    Constructs a new SDLSendHapticData object indicated by the hapticSpatialData parameter

    ","parent_name":"SDLSendHapticData"},"Classes/SDLSendHapticData.html#/c:objc(cs)SDLSendHapticData(py)hapticRectData":{"name":"hapticRectData","abstract":"

    Array of spatial data structures that represent the locations of all user controls present on the HMI. This data should be updated if/when the application presents a new screen. When a request is sent, if successful, it will replace all spatial data previously sent through RPC. If an empty array is sent, the existing spatial data will be cleared

    ","parent_name":"SDLSendHapticData"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:action:":{"name":"-initWithId:action:","abstract":"

    @abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(im)initWithId:label:action:":{"name":"-initWithId:label:action:","abstract":"

    @abstract Constructs a newly allocated SDLSeatMemoryAction object with id, label (max length 100 chars) and action type

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)id":{"name":"id","abstract":"

    @abstract id of the action to be performed.

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)label":{"name":"label","abstract":"

    @abstract label of the action to be performed.

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatMemoryAction.html#/c:objc(cs)SDLSeatMemoryAction(py)action":{"name":"action","abstract":"

    @abstract type of action to be performed

    ","parent_name":"SDLSeatMemoryAction"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:":{"name":"-initWithId:","abstract":"

    Constructs a newly allocated SDLSeatControlData object with cushion and firmness

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(im)initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:":{"name":"-initWithId:heatingEnabled:coolingEnable:heatingLevel:coolingLevel:horizontalPostion:verticalPostion:frontVerticalPostion:backVerticalPostion:backTiltAngle:headSupportedHorizontalPostion:headSupportedVerticalPostion:massageEnabled:massageMode:massageCussionFirmness:memory:","abstract":"

    Constructs a newly allocated SDLSeatControlData object with cushion and firmness

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)id":{"name":"id","abstract":"

    @abstract id of seat that is a remote controllable seat.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingEnabled":{"name":"heatingEnabled","abstract":"

    @abstract Whether or not heating is enabled.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingEnabled":{"name":"coolingEnabled","abstract":"

    @abstract Whether or not cooling is enabled.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)heatingLevel":{"name":"heatingLevel","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)coolingLevel":{"name":"coolingLevel","abstract":"

    @abstract cooling level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)horizontalPosition":{"name":"horizontalPosition","abstract":"

    @abstract horizontal Position in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)verticalPosition":{"name":"verticalPosition","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)frontVerticalPosition":{"name":"frontVerticalPosition","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backVerticalPosition":{"name":"backVerticalPosition","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)backTiltAngle":{"name":"backTiltAngle","abstract":"

    @abstract heating level in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportHorizontalPosition":{"name":"headSupportHorizontalPosition","abstract":"

    @abstract head Support Horizontal Position in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)headSupportVerticalPosition":{"name":"headSupportVerticalPosition","abstract":"

    @abstract head Support Vertical Position in integer

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageEnabled":{"name":"massageEnabled","abstract":"

    @abstract Whether or not massage is enabled.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageMode":{"name":"massageMode","abstract":"

    @abstract Array of massage mode data.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)massageCushionFirmness":{"name":"massageCushionFirmness","abstract":"

    @abstract Array of firmness of a cushion.

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlData.html#/c:objc(cs)SDLSeatControlData(py)memory":{"name":"memory","abstract":"

    @abstract type of action to be performed

    ","parent_name":"SDLSeatControlData"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"

    Undocumented

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(im)initWithName:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:":{"name":"-initWithName:heatingEnabledAvailable:coolingEnabledAvailable:heatingLevelAvailable:coolingLevelAvailable:horizontalPositionAvailable:verticalPositionAvailable:frontVerticalPositionAvailable:backVerticalPositionAvailable:backTiltAngleAvailable:headSupportHorizontalPositionAvailable:headSupportVerticalPositionAvailable:massageEnabledAvailable:massageModeAvailable:massageCushionFirmnessAvailable:memoryAvailable:","abstract":"

    Undocumented

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the light control module.","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingEnabledAvailable":{"name":"heatingEnabledAvailable","abstract":"

    @abstract Whether or not heating is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingEnabledAvailable":{"name":"coolingEnabledAvailable","abstract":"

    @abstract Whether or not cooling is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)heatingLevelAvailable":{"name":"heatingLevelAvailable","abstract":"

    @abstract Whether or not heating level is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)coolingLevelAvailable":{"name":"coolingLevelAvailable","abstract":"

    @abstract Whether or not cooling level is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)horizontalPositionAvailable":{"name":"horizontalPositionAvailable","abstract":"

    @abstract Whether or not horizontal Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)verticalPositionAvailable":{"name":"verticalPositionAvailable","abstract":"

    @abstract Whether or not vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)frontVerticalPositionAvailable":{"name":"frontVerticalPositionAvailable","abstract":"

    @abstract Whether or not front Vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backVerticalPositionAvailable":{"name":"backVerticalPositionAvailable","abstract":"

    @abstract Whether or not back Vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)backTiltAngleAvailable":{"name":"backTiltAngleAvailable","abstract":"

    @abstract Whether or not backTilt Angle Available is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportHorizontalPositionAvailable":{"name":"headSupportHorizontalPositionAvailable","abstract":"

    @abstract Whether or not head Supports for Horizontal Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)headSupportVerticalPositionAvailable":{"name":"headSupportVerticalPositionAvailable","abstract":"

    @abstract Whether or not head Supports for Vertical Position is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageEnabledAvailable":{"name":"massageEnabledAvailable","abstract":"

    @abstract Whether or not massage Enabled is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageModeAvailable":{"name":"massageModeAvailable","abstract":"

    @abstract Whether or not massage Mode is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)massageCushionFirmnessAvailable":{"name":"massageCushionFirmnessAvailable","abstract":"

    @abstract Whether or not massage Cushion Firmness is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLSeatControlCapabilities.html#/c:objc(cs)SDLSeatControlCapabilities(py)memoryAvailable":{"name":"memoryAvailable","abstract":"

    @abstract Whether or not memory is Available.

    ","parent_name":"SDLSeatControlCapabilities"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:":{"name":"-initWithMessage:","abstract":"

    Undocumented

    ","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(im)initWithMessage:timeout:softButtons:":{"name":"-initWithMessage:timeout:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)scrollableMessageBody":{"name":"scrollableMessageBody","abstract":"

    A Body of text that can include newlines and tabs","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)timeout":{"name":"timeout","abstract":"

    Gets/Sets an App defined timeout. Indicates how long of a timeout in milliseconds from the","parent_name":"SDLScrollableMessage"},"Classes/SDLScrollableMessage.html#/c:objc(cs)SDLScrollableMessage(py)softButtons":{"name":"softButtons","abstract":"

    Gets/Sets App defined SoftButtons.If omitted on supported displays, only the","parent_name":"SDLScrollableMessage"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)resolution":{"name":"resolution","abstract":"

    The resolution of the prescribed screen area

    ","parent_name":"SDLScreenParams"},"Classes/SDLScreenParams.html#/c:objc(cs)SDLScreenParams(py)touchEventAvailable":{"name":"touchEventAvailable","abstract":"

    Types of screen touch events available in screen area

    ","parent_name":"SDLScreenParams"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1":{"name":"textField1","abstract":"

    The top text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2":{"name":"textField2","abstract":"

    The second text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3":{"name":"textField3","abstract":"

    The third text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4":{"name":"textField4","abstract":"

    The fourth text field within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)mediaTrackTextField":{"name":"mediaTrackTextField","abstract":"

    The media text field available within the media layout. Often less emphasized than textField(1-4)

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)primaryGraphic":{"name":"primaryGraphic","abstract":"

    The primary graphic within a template layout

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)secondaryGraphic":{"name":"secondaryGraphic","abstract":"

    A secondary graphic used in some template layouts

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textAlignment":{"name":"textAlignment","abstract":"

    What alignment textField(1-4) should use

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField1Type":{"name":"textField1Type","abstract":"

    The type of data textField1 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField2Type":{"name":"textField2Type","abstract":"

    The type of data textField2 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField3Type":{"name":"textField3Type","abstract":"

    The type of data textField3 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)textField4Type":{"name":"textField4Type","abstract":"

    The type of data textField4 describes

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)softButtonObjects":{"name":"softButtonObjects","abstract":"

    The current list of soft buttons within a template layout. Set this array to change the displayed soft buttons.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)menu":{"name":"menu","abstract":"

    The current list of menu cells displayed in the app’s menu.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)dynamicMenuUpdatesMode":{"name":"dynamicMenuUpdatesMode","abstract":"

    Change the mode of the dynamic menu updater to be enabled, disabled, or enabled on known compatible head units.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)voiceCommands":{"name":"voiceCommands","abstract":"

    The current list of voice commands available for the user to speak and be recognized by the IVI’s voice recognition engine.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)keyboardConfiguration":{"name":"keyboardConfiguration","abstract":"

    The default keyboard configuration, this can be additionally customized by each SDLKeyboardDelegate.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(py)preloadedChoices":{"name":"preloadedChoices","abstract":"

    Cells will be hashed by their text, image names, and VR command text. When assembling an SDLChoiceSet, you can pull objects from here, or recreate them. The preloaded versions will be used so long as their text, image names, and VR commands are the same.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)initWithConnectionManager:fileManager:":{"name":"-initWithConnectionManager:fileManager:","abstract":"

    Initialize a screen manager

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"

    Starts the manager and all sub-managers

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)stop":{"name":"-stop","abstract":"

    Stops the manager.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)beginUpdates":{"name":"-beginUpdates","abstract":"

    Delays all screen updates until endUpdatesWithCompletionHandler: is called.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdates":{"name":"-endUpdates","abstract":"

    Update text fields with new text set into the text field properties. Pass an empty string \\@"" to clear the text field.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)endUpdatesWithCompletionHandler:":{"name":"-endUpdatesWithCompletionHandler:","abstract":"

    Update text fields with new text set into the text field properties. Pass an empty string \\@"" to clear the text field.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)softButtonObjectNamed:":{"name":"-softButtonObjectNamed:","abstract":"

    Undocumented

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)preloadChoices:withCompletionHandler:":{"name":"-preloadChoices:withCompletionHandler:","abstract":"

    Preload cells to the head unit. This will greatly reduce the time taken to present a choice set. Any already matching a choice already on the head unit will be ignored. You do not need to wait until the completion handler is called to present a choice set containing choices being loaded. The choice set will wait until the preload completes and then immediately present.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)deleteChoices:":{"name":"-deleteChoices:","abstract":"

    Delete loaded cells from the head unit. If the cells don’t exist on the head unit they will be ignored.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentChoiceSet:mode:":{"name":"-presentChoiceSet:mode:","abstract":"

    Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you’re lazy…for real though, it’s kind of confusing to the user and isn’t recommended.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentSearchableChoiceSet:mode:withKeyboardDelegate:":{"name":"-presentSearchableChoiceSet:mode:withKeyboardDelegate:","abstract":"

    Present a choice set on the head unit with a certain interaction mode. You should present in VR only if the user reached this choice set by using their voice, in Manual only if the user used touch to reach this choice set. Use Both if you’re lazy…for real though, it’s kind of confusing to the user and isn’t recommended.

    ","parent_name":"SDLScreenManager"},"Classes/SDLScreenManager.html#/c:objc(cs)SDLScreenManager(im)presentKeyboardWithInitialText:delegate:":{"name":"-presentKeyboardWithInitialText:delegate:","abstract":"

    Present a keyboard-only interface to the user and receive input. The user will be able to input text in the keyboard when in a non-driver distraction situation.

    ","parent_name":"SDLScreenManager"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(im)initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:":{"name":"-initWithStationShortName:stationIDNumber:stationLongName:stationLocation:stationMessage:","abstract":"

    Undocumented

    ","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationShortName":{"name":"stationShortName","abstract":"

    @abstract Identifies the 4-alpha-character station call sign","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationIDNumber":{"name":"stationIDNumber","abstract":"

    @abstract Used for network Application.","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLongName":{"name":"stationLongName","abstract":"

    @abstract Identifies the station call sign or other identifying","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationLocation":{"name":"stationLocation","abstract":"

    @abstract Provides the 3-dimensional geographic station location

    ","parent_name":"SDLSISData"},"Classes/SDLSISData.html#/c:objc(cs)SDLSISData(py)stationMessage":{"name":"stationMessage","abstract":"

    @abstract May be used to convey textual information of general interest","parent_name":"SDLSISData"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"

    Undocumented

    ","parent_name":"SDLResetGlobalProperties"},"Classes/SDLResetGlobalProperties.html#/c:objc(cs)SDLResetGlobalProperties(py)properties":{"name":"properties","abstract":"

    An array of one or more GlobalProperty enumeration elements","parent_name":"SDLResetGlobalProperties"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:","abstract":"

    Undocumented

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(im)initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:":{"name":"-initWithClimateControlCapabilities:radioControlCapabilities:buttonCapabilities:seatControlCapabilities:audioControlCapabilities:hmiSettingsControlCapabilities:lightControlCapabilities:","abstract":"

    Constructs a newly allocated SDLRemoteControlCapabilities object with given parameters

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)climateControlCapabilities":{"name":"climateControlCapabilities","abstract":"

    If included, the platform supports RC climate controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)radioControlCapabilities":{"name":"radioControlCapabilities","abstract":"

    If included, the platform supports RC radio controls.","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"

    If included, the platform supports RC button controls with the included button names.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)seatControlCapabilities":{"name":"seatControlCapabilities","abstract":"

    If included, the platform supports seat controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)audioControlCapabilities":{"name":"audioControlCapabilities","abstract":"

    If included, the platform supports audio controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)hmiSettingsControlCapabilities":{"name":"hmiSettingsControlCapabilities","abstract":"

    If included, the platform supports hmi setting controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRemoteControlCapabilities.html#/c:objc(cs)SDLRemoteControlCapabilities(py)lightControlCapabilities":{"name":"lightControlCapabilities","abstract":"

    If included, the platform supports light controls.

    ","parent_name":"SDLRemoteControlCapabilities"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)syncMsgVersion":{"name":"syncMsgVersion","abstract":"

    The RPC spec version supported by the connected IVI system.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)language":{"name":"language","abstract":"

    The currently active VR+TTS language on the module. See Language for options.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"

    The currently active display language on the module. See Language for options.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)displayCapabilities":{"name":"displayCapabilities","abstract":"

    Contains information about the display for the SDL system to which the application is currently connected.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)buttonCapabilities":{"name":"buttonCapabilities","abstract":"

    Provides information about the capabilities of a SDL HMI button.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)softButtonCapabilities":{"name":"softButtonCapabilities","abstract":"

    Contains information about a SoftButton’s capabilities.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)presetBankCapabilities":{"name":"presetBankCapabilities","abstract":"

    If returned, the platform supports custom on-screen Presets

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiZoneCapabilities":{"name":"hmiZoneCapabilities","abstract":"

    Specifies HMI Zones in the vehicle.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)speechCapabilities":{"name":"speechCapabilities","abstract":"

    Contains information about TTS capabilities on the SDL platform.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)prerecordedSpeech":{"name":"prerecordedSpeech","abstract":"

    Contains information about the speech capabilities on the SDL platform","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vrCapabilities":{"name":"vrCapabilities","abstract":"

    The VR capabilities of the connected SDL platform.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)audioPassThruCapabilities":{"name":"audioPassThruCapabilities","abstract":"

    Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)pcmStreamCapabilities":{"name":"pcmStreamCapabilities","abstract":"

    Describes different audio type configurations for the audio PCM stream service, e.g. {8kHz,8-bit,PCM}

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)vehicleType":{"name":"vehicleType","abstract":"

    Specifies the connected vehicle’s type

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)supportedDiagModes":{"name":"supportedDiagModes","abstract":"

    Specifies the white-list of supported diagnostic modes (0x00-0xFF) capable for DiagnosticMessage requests. If a mode outside this list is requested, it will be rejected.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)hmiCapabilities":{"name":"hmiCapabilities","abstract":"

    Specifies the availability of various SDL features.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)sdlVersion":{"name":"sdlVersion","abstract":"

    The SmartDeviceLink Core version

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)systemSoftwareVersion":{"name":"systemSoftwareVersion","abstract":"

    The software version of the system that implements SmartDeviceLink Core

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterfaceResponse.html#/c:objc(cs)SDLRegisterAppInterfaceResponse(py)iconResumed":{"name":"iconResumed","abstract":"

    Whether or not the app’s icon already existed on the system and was resumed. That means that the icon does not need to be sent by the app.

    ","parent_name":"SDLRegisterAppInterfaceResponse"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithLifecycleConfiguration:":{"name":"-initWithLifecycleConfiguration:","abstract":"

    Convenience init for registering the application with a lifecycle configuration.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:":{"name":"-initWithAppName:appId:languageDesired:","abstract":"

    Convenience init for registering the application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:","abstract":"

    Convenience init for registering the application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:":{"name":"-initWithAppName:appId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:","abstract":"

    Convenience init for registering the application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(im)initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:":{"name":"-initWithAppName:appId:fullAppId:languageDesired:isMediaApp:appTypes:shortAppName:ttsName:vrSynonyms:hmiDisplayLanguageDesired:resumeHash:dayColorScheme:nightColorScheme:","abstract":"

    Convenience init for registering the application with all possible options.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)syncMsgVersion":{"name":"syncMsgVersion","abstract":"

    The version of the SDL interface

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appName":{"name":"appName","abstract":"

    The mobile application’s name. This name is displayed in the SDL Mobile Applications menu. It also serves as the unique identifier of the application for SmartDeviceLink.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ttsName":{"name":"ttsName","abstract":"

    TTS string for VR recognition of the mobile application name.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"

    A String representing an abbreviated version of the mobile application’s name (if necessary) that will be displayed on the media screen.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)vrSynonyms":{"name":"vrSynonyms","abstract":"

    Defines additional voice recognition commands

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)isMediaApplication":{"name":"isMediaApplication","abstract":"

    Indicates if the application is a media or a non-media application.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)languageDesired":{"name":"languageDesired","abstract":"

    A Language enumeration indicating what language the application intends to use for user interaction (TTS and VR).

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hmiDisplayLanguageDesired":{"name":"hmiDisplayLanguageDesired","abstract":"

    An enumeration indicating what language the application intends to use for user interaction (Display).

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appHMIType":{"name":"appHMIType","abstract":"

    A list of all applicable app types stating which classifications to be given to the app.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)hashID":{"name":"hashID","abstract":"

    ID used to uniquely identify current state of all app data that can persist through connection cycles (e.g. ignition cycles).

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)deviceInfo":{"name":"deviceInfo","abstract":"

    Information about the connecting device

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appID":{"name":"appID","abstract":"

    ID used to validate app with policy table entries

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)fullAppID":{"name":"fullAppID","abstract":"

    A full UUID appID used to validate app with policy table entries.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)appInfo":{"name":"appInfo","abstract":"

    Information about the application running

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)dayColorScheme":{"name":"dayColorScheme","abstract":"

    The color scheme to be used on a head unit using a light or day color scheme. The OEM may only support this theme if their head unit only has a light color scheme.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRegisterAppInterface.html#/c:objc(cs)SDLRegisterAppInterface(py)nightColorScheme":{"name":"nightColorScheme","abstract":"

    The color scheme to be used on a head unit using a dark or night color scheme. The OEM may only support this theme if their head unit only has a dark color scheme.

    ","parent_name":"SDLRegisterAppInterface"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithX:y:width:height:":{"name":"-initWithX:y:width:height:","abstract":"

    Create a Rectangle

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(im)initWithCGRect:":{"name":"-initWithCGRect:","abstract":"

    Create a Rectangle from a CGRect

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)x":{"name":"x","abstract":"

    The X-coordinate of the user control

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)y":{"name":"y","abstract":"

    The Y-coordinate of the user control

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)width":{"name":"width","abstract":"

    The width of the user control’s bounding rectangle

    ","parent_name":"SDLRectangle"},"Classes/SDLRectangle.html#/c:objc(cs)SDLRectangle(py)height":{"name":"height","abstract":"

    The height of the user control’s bounding rectangle

    ","parent_name":"SDLRectangle"},"Classes/SDLReadDIDResponse.html#/c:objc(cs)SDLReadDIDResponse(py)didResult":{"name":"didResult","abstract":"

    Array of requested DID results (with data if available).

    ","parent_name":"SDLReadDIDResponse"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(im)initWithECUName:didLocation:":{"name":"-initWithECUName:didLocation:","abstract":"

    Undocumented

    ","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)ecuName":{"name":"ecuName","abstract":"

    An ID of the vehicle module","parent_name":"SDLReadDID"},"Classes/SDLReadDID.html#/c:objc(cs)SDLReadDID(py)didLocation":{"name":"didLocation","abstract":"

    Raw data from vehicle data DID location(s)","parent_name":"SDLReadDID"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(im)initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:":{"name":"-initWithFrequencyInteger:frequencyFraction:band:hdChannel:radioEnable:hdRadioEnable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyInteger":{"name":"frequencyInteger","abstract":"

    The integer part of the frequency ie for 101.7 this value should be 101

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)frequencyFraction":{"name":"frequencyFraction","abstract":"

    The fractional part of the frequency for 101.7 is 7

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)band":{"name":"band","abstract":"

    Radio band value

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)rdsData":{"name":"rdsData","abstract":"

    Read only parameter. See RDSData data type for details.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)availableHDs":{"name":"availableHDs","abstract":"

    number of HD sub-channels if available

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdChannel":{"name":"hdChannel","abstract":"

    Current HD sub-channel if available

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalStrength":{"name":"signalStrength","abstract":"

    Signal Strength Value

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)signalChangeThreshold":{"name":"signalChangeThreshold","abstract":"

    If the signal strength falls below the set value for this parameter, the radio will tune to an alternative frequency

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)radioEnable":{"name":"radioEnable","abstract":"

    True if the radio is on, false is the radio is off. When the radio is disabled, no data other than radioEnable is included in a GetInteriorVehicleData response

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)state":{"name":"state","abstract":"

    Read only parameter. See RadioState data type for details.

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)hdRadioEnable":{"name":"hdRadioEnable","abstract":"

    True if the hd radio is on, false is the radio is off

    ","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlData.html#/c:objc(cs)SDLRadioControlData(py)sisData":{"name":"sisData","abstract":"

    Read Read-only Station Information Service (SIS) data provides basic information","parent_name":"SDLRadioControlData"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(im)initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:":{"name":"-initWithModuleName:radioEnableAvailable:radioBandAvailable:radioFrequencyAvailable:hdChannelAvailable:rdsDataAvailable:availableHDsAvailable:stateAvailable:signalStrengthAvailable:signalChangeThresholdAvailable:hdRadioEnableAvailable:siriusXMRadioAvailable:sisDataAvailable:","abstract":"

    Constructs a newly allocated SDLRadioControlCapabilities object with given parameters.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    The short friendly name of the radio control module.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioEnableAvailable":{"name":"radioEnableAvailable","abstract":"

    Availability of the control of enable/disable radio.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioBandAvailable":{"name":"radioBandAvailable","abstract":"

    Availability of the control of radio band.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)radioFrequencyAvailable":{"name":"radioFrequencyAvailable","abstract":"

    Availability of the control of radio frequency.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdChannelAvailable":{"name":"hdChannelAvailable","abstract":"

    Availability of the control of HD radio channel.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)rdsDataAvailable":{"name":"rdsDataAvailable","abstract":"

    Availability of the getting Radio Data System (RDS) data.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)availableHDsAvailable":{"name":"availableHDsAvailable","abstract":"

    Availability of the getting the number of available HD channels.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)stateAvailable":{"name":"stateAvailable","abstract":"

    Availability of the getting the Radio state.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalStrengthAvailable":{"name":"signalStrengthAvailable","abstract":"

    Availability of the getting the signal strength.

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)signalChangeThresholdAvailable":{"name":"signalChangeThresholdAvailable","abstract":"

    Availability of the getting the signal Change Threshold

    ","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)hdRadioEnableAvailable":{"name":"hdRadioEnableAvailable","abstract":"

    Availability of the control of enable/disable HD radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)siriusXMRadioAvailable":{"name":"siriusXMRadioAvailable","abstract":"

    Availability of sirius XM radio.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRadioControlCapabilities.html#/c:objc(cs)SDLRadioControlCapabilities(py)sisDataAvailable":{"name":"sisDataAvailable","abstract":"

    Availability of the getting HD radio Station Information Service (SIS) data.","parent_name":"SDLRadioControlCapabilities"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(py)store":{"name":"store","abstract":"

    Undocumented

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)initWithDictionary:":{"name":"-initWithDictionary:","abstract":"

    Convenience init

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCStruct.html#/c:objc(cs)SDLRPCStruct(im)serializeAsDictionary:":{"name":"-serializeAsDictionary:","abstract":"

    Converts struct to JSON formatted data

    ","parent_name":"SDLRPCStruct"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(py)response":{"name":"response","abstract":"

    The response to be included within the userinfo dictionary

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)initWithName:object:rpcResponse:":{"name":"-initWithName:object:rpcResponse:","abstract":"

    Create an NSNotification object containing an SDLRPCResponse

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseMemberOfClass:":{"name":"-isResponseMemberOfClass:","abstract":"

    Returns whether or not the containing response is equal to a class, not including subclasses.

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponseNotification.html#/c:objc(cs)SDLRPCResponseNotification(im)isResponseKindOfClass:":{"name":"-isResponseKindOfClass:","abstract":"

    Returns whether or not the containing response is a kind of class, including subclasses.

    ","parent_name":"SDLRPCResponseNotification"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)correlationID":{"name":"correlationID","abstract":"

    The correlation id of the corresponding SDLRPCRequest.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)success":{"name":"success","abstract":"

    Whether or not the SDLRPCRequest was successful.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)resultCode":{"name":"resultCode","abstract":"

    The result of the SDLRPCRequest. If the request failed, the result code contains the failure reason.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCResponse.html#/c:objc(cs)SDLRPCResponse(py)info":{"name":"info","abstract":"

    More detailed success or error message.

    ","parent_name":"SDLRPCResponse"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(py)request":{"name":"request","abstract":"

    The request to be included in the userinfo dictionary

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)initWithName:object:rpcRequest:":{"name":"-initWithName:object:rpcRequest:","abstract":"

    Create an NSNotification object containing an SDLRPCRequest

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestMemberOfClass:":{"name":"-isRequestMemberOfClass:","abstract":"

    Returns whether or not the containing request is equal to a class, not including subclasses.

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequestNotification.html#/c:objc(cs)SDLRPCRequestNotification(im)isRequestKindOfClass:":{"name":"-isRequestKindOfClass:","abstract":"

    Returns whether or not the containing request is a kind of class, including subclasses.

    ","parent_name":"SDLRPCRequestNotification"},"Classes/SDLRPCRequest.html#/c:objc(cs)SDLRPCRequest(py)correlationID":{"name":"correlationID","abstract":"

    A unique id assigned to message sent to Core. The Correlation ID is used to map a request to its response.

    ","parent_name":"SDLRPCRequest"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(py)notification":{"name":"notification","abstract":"

    The notification within the userinfo dictionary

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)initWithName:object:rpcNotification:":{"name":"-initWithName:object:rpcNotification:","abstract":"

    Create an NSNotification object caontaining an SDLRPCNotification

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationMemberOfClass:":{"name":"-isNotificationMemberOfClass:","abstract":"

    Returns whether or not the containing notification is equal to a class, not including subclasses.

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCNotificationNotification.html#/c:objc(cs)SDLRPCNotificationNotification(im)isNotificationKindOfClass:":{"name":"-isNotificationKindOfClass:","abstract":"

    Returns whether or not the containing notification is a kind of class, including subclasses.

    ","parent_name":"SDLRPCNotificationNotification"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)initWithName:":{"name":"-initWithName:","abstract":"

    Convenience init

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)getFunctionName":{"name":"-getFunctionName","abstract":"

    Returns the function name.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setFunctionName:":{"name":"-setFunctionName:","abstract":"

    Sets the function name.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)getParameters:":{"name":"-getParameters:","abstract":"

    Returns the value associated with the provided key. If the key does not exist, null is returned.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(im)setParameters:value:":{"name":"-setParameters:value:","abstract":"

    Sets a key-value pair using the function name as the key.

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)bulkData":{"name":"bulkData","abstract":"

    The data in the message

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)name":{"name":"name","abstract":"

    The name of the message

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)parameters":{"name":"parameters","abstract":"

    The JSON-RPC parameters

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRPCMessage.html#/c:objc(cs)SDLRPCMessage(py)messageType":{"name":"messageType","abstract":"

    The type of data in the message

    ","parent_name":"SDLRPCMessage"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithRed:green:blue:":{"name":"-initWithRed:green:blue:","abstract":"

    Create an SDL color object with red / green / blue values between 0-255

    ","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(im)initWithColor:":{"name":"-initWithColor:","abstract":"

    Create an SDL color object with a UIColor object.

    ","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)red":{"name":"red","abstract":"

    The red value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)green":{"name":"green","abstract":"

    The green value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRGBColor.html#/c:objc(cs)SDLRGBColor(py)blue":{"name":"blue","abstract":"

    The blue value of the RGB color","parent_name":"SDLRGBColor"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(im)initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:":{"name":"-initWithProgramService:radioText:clockText:programIdentification:programType:trafficProgramIdentification:trafficAnnouncementIdentification:region:","abstract":"

    Undocumented

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programService":{"name":"programService","abstract":"

    Program Service Name

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)radioText":{"name":"radioText","abstract":"

    Radio Text

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)clockText":{"name":"clockText","abstract":"

    The clock text in UTC format as YYYY-MM-DDThh:mm:ss.sTZD

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programIdentification":{"name":"programIdentification","abstract":"

    Program Identification - the call sign for the radio station

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)programType":{"name":"programType","abstract":"

    The program type - The region should be used to differentiate between EU","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficProgramIdentification":{"name":"trafficProgramIdentification","abstract":"

    Traffic Program Identification - Identifies a station that offers traffic

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)trafficAnnouncementIdentification":{"name":"trafficAnnouncementIdentification","abstract":"

    Traffic Announcement Identification - Indicates an ongoing traffic announcement

    ","parent_name":"SDLRDSData"},"Classes/SDLRDSData.html#/c:objc(cs)SDLRDSData(py)region":{"name":"region","abstract":"

    Region

    ","parent_name":"SDLRDSData"},"Classes/SDLPutFileResponse.html#/c:objc(cs)SDLPutFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"

    Provides the total local space available in SDL Core for the registered app. If the transfer has systemFile enabled, then the value will be set to 0 automatically.

    ","parent_name":"SDLPutFileResponse"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)init":{"name":"-init","abstract":"

    Init

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:":{"name":"-initWithFileName:fileType:","abstract":"

    Convenience init for creating a putfile with a name and file format.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:":{"name":"-initWithFileName:fileType:persistentFile:","abstract":"

    Convenience init for creating a putfile with a name, file format, and persistance.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:","abstract":"

    Convenience init for creating a putfile that is part of a multiple frame payload.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:crc:","abstract":"

    Convenience init for creating a putfile that is part of a multiple frame payload.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(im)initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:":{"name":"-initWithFileName:fileType:persistentFile:systemFile:offset:length:bulkData:","abstract":"

    Convenience init for creating a putfile that is part of a multiple frame payload. A CRC checksum is calculated for the bulk data.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)syncFileName":{"name":"syncFileName","abstract":"

    File reference name

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)fileType":{"name":"fileType","abstract":"

    A FileType value representing a selected file type

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)persistentFile":{"name":"persistentFile","abstract":"

    A value to indicates if the file is meant to persist between sessions / ignition cycles. If set to TRUE, then the system will aim to persist this file through session / cycles. While files with this designation will have priority over others, they are subject to deletion by the system at any time. In the event of automatic deletion by the system, the app will receive a rejection and have to resend the file. If omitted, the value will be set to false.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)systemFile":{"name":"systemFile","abstract":"

    Indicates if the file is meant to be passed through core to elsewhere on the system. If set to TRUE, then the system will instead pass the data thru as it arrives to a predetermined area outside of core.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)offset":{"name":"offset","abstract":"

    Offset in bytes for resuming partial data chunks.

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)length":{"name":"length","abstract":"

    Length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded

    ","parent_name":"SDLPutFile"},"Classes/SDLPutFile.html#/c:objc(cs)SDLPutFile(py)crc":{"name":"crc","abstract":"

    Additional CRC32 checksum to protect data integrity up to 512 Mbits.

    ","parent_name":"SDLPutFile"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(im)initWithAppServiceRecord:":{"name":"-initWithAppServiceRecord:","abstract":"

    Convenience init.

    ","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppServiceResponse.html#/c:objc(cs)SDLPublishAppServiceResponse(py)appServiceRecord":{"name":"appServiceRecord","abstract":"

    If the request was successful, this object will be the current status of the service record for the published service. This will include the Core supplied service ID.

    ","parent_name":"SDLPublishAppServiceResponse"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(im)initWithAppServiceManifest:":{"name":"-initWithAppServiceManifest:","abstract":"

    Convenience init.

    ","parent_name":"SDLPublishAppService"},"Classes/SDLPublishAppService.html#/c:objc(cs)SDLPublishAppService(py)appServiceManifest":{"name":"appServiceManifest","abstract":"

    The manifest of the service that wishes to be published.

    ","parent_name":"SDLPublishAppService"},"Classes/SDLPresetBankCapabilities.html#/c:objc(cs)SDLPresetBankCapabilities(py)onScreenPresetsAvailable":{"name":"onScreenPresetsAvailable","abstract":"

    If Onscreen custom presets are available.

    ","parent_name":"SDLPresetBankCapabilities"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(im)initWithFirstTouch:secondTouch:":{"name":"-initWithFirstTouch:secondTouch:","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)firstTouch":{"name":"firstTouch","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)secondTouch":{"name":"secondTouch","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)distance":{"name":"distance","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)center":{"name":"center","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPinchGesture.html#/c:objc(cs)SDLPinchGesture(py)isValid":{"name":"isValid","abstract":"

    @abstract","parent_name":"SDLPinchGesture"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(im)initWithDialNumber:":{"name":"-initWithDialNumber:","abstract":"

    Undocumented

    ","parent_name":"SDLPhoneCapability"},"Classes/SDLPhoneCapability.html#/c:objc(cs)SDLPhoneCapability(py)dialNumberEnabled":{"name":"dialNumberEnabled","abstract":"

    Whether or not the DialNumber RPC is enabled.

    ","parent_name":"SDLPhoneCapability"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"

    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.

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)stop":{"name":"-stop","abstract":"

    Stop the manager. This method is used internally.

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)isRPCAllowed:":{"name":"-isRPCAllowed:","abstract":"

    Determine if an individual RPC is allowed for the current HMI level

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)groupStatusOfRPCs:":{"name":"-groupStatusOfRPCs:","abstract":"

    Determine if all RPCs are allowed for the current HMI level

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)statusOfRPCs:":{"name":"-statusOfRPCs:","abstract":"

    Retrieve a dictionary with keys that are the passed in RPC names, and objects of an NSNumber specifying if that RPC is currently allowed

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)addObserverForRPCs:groupType:withHandler:":{"name":"-addObserverForRPCs:groupType:withHandler:","abstract":"

    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.

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeAllObservers":{"name":"-removeAllObservers","abstract":"

    Remove every current observer

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionManager.html#/c:objc(cs)SDLPermissionManager(im)removeObserverForIdentifier:":{"name":"-removeObserverForIdentifier:","abstract":"

    Remove block observers for the specified RPC

    ","parent_name":"SDLPermissionManager"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)rpcName":{"name":"rpcName","abstract":"

    Name of the individual RPC in the policy table.

    ","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)hmiPermissions":{"name":"hmiPermissions","abstract":"

    HMI Permissions for the individual RPC; i.e. which HMI levels may it be used in

    ","parent_name":"SDLPermissionItem"},"Classes/SDLPermissionItem.html#/c:objc(cs)SDLPermissionItem(py)parameterPermissions":{"name":"parameterPermissions","abstract":"

    RPC parameters for the individual RPC

    ","parent_name":"SDLPermissionItem"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)choiceID":{"name":"choiceID","abstract":"

    ID of the choice that was selected in response to PerformInteraction. Only is valid if general result is success:true.

    ","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)manualTextEntry":{"name":"manualTextEntry","abstract":"

    Manually entered text selection, e.g. through keyboard. Can be returned in lieu of choiceID, depending on the trigger source.

    ","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteractionResponse.html#/c:objc(cs)SDLPerformInteractionResponse(py)triggerSource":{"name":"triggerSource","abstract":"

    A SDLTriggerSource object which will be shown in the HMI. Only is valid if resultCode is SUCCESS.

    ","parent_name":"SDLPerformInteractionResponse"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInteractionChoiceSetId:":{"name":"-initWithInteractionChoiceSetId:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInteractionChoiceSetIdList:":{"name":"-initWithInteractionChoiceSetIdList:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetID:vrHelp:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialPrompt:initialText:interactionChoiceSetIDList:helpPrompt:timeoutPrompt:interactionMode:timeout:vrHelp:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(im)initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:":{"name":"-initWithInitialChunks:initialText:interactionChoiceSetIDList:helpChunks:timeoutChunks:interactionMode:timeout:vrHelp:interactionLayout:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialText":{"name":"initialText","abstract":"

    The Text that Displayed when the interaction begins. This text may","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)initialPrompt":{"name":"initialPrompt","abstract":"

    An array of one or more TTSChunks that, taken together, specify","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionMode":{"name":"interactionMode","abstract":"

    The Indicates mode that indicate how user selects interaction","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionChoiceSetIDList":{"name":"interactionChoiceSetIDList","abstract":"

    A Vector value representing an Array of one or more Choice","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)helpPrompt":{"name":"helpPrompt","abstract":"

    A Vector which taken together, specify the help phrase to","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"

    An array of TTSChunks which, taken together, specify the phrase to","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)timeout":{"name":"timeout","abstract":"

    An Integer value representing the amount of time, in milliseconds,","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)vrHelp":{"name":"vrHelp","abstract":"

    A Voice recognition Help, which is a suggested VR Help Items to","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformInteraction.html#/c:objc(cs)SDLPerformInteraction(py)interactionLayout":{"name":"interactionLayout","abstract":"

    Undocumented

    ","parent_name":"SDLPerformInteraction"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:":{"name":"-initWithSamplingRate:bitsPerSample:audioType:maxDuration:audioDataHandler:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(im)initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:":{"name":"-initWithInitialPrompt:audioPassThruDisplayText1:audioPassThruDisplayText2:samplingRate:bitsPerSample:audioType:maxDuration:muteAudio:audioDataHandler:","abstract":"

    Undocumented

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)initialPrompt":{"name":"initialPrompt","abstract":"

    initial prompt which will be spoken before opening the audio pass","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText1":{"name":"audioPassThruDisplayText1","abstract":"

    a line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioPassThruDisplayText2":{"name":"audioPassThruDisplayText2","abstract":"

    A line of text displayed during audio capture","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)samplingRate":{"name":"samplingRate","abstract":"

    A samplingRate

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)maxDuration":{"name":"maxDuration","abstract":"

    the maximum duration of audio recording in milliseconds

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)bitsPerSample":{"name":"bitsPerSample","abstract":"

    the quality the audio is recorded - 8 bit or 16 bit

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioType":{"name":"audioType","abstract":"

    an audioType

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)muteAudio":{"name":"muteAudio","abstract":"

    a Boolean value representing if the current audio source should be","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAudioPassThru.html#/c:objc(cs)SDLPerformAudioPassThru(py)audioDataHandler":{"name":"audioDataHandler","abstract":"

    A handler that will be called whenever an onAudioPassThru notification is received.

    ","parent_name":"SDLPerformAudioPassThru"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(im)initWithServiceSpecificResult:":{"name":"-initWithServiceSpecificResult:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteractionResponse.html#/c:objc(cs)SDLPerformAppServiceInteractionResponse(py)serviceSpecificResult":{"name":"serviceSpecificResult","abstract":"

    The service can provide specific result strings to the consumer through this param.

    ","parent_name":"SDLPerformAppServiceInteractionResponse"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:":{"name":"-initWithServiceUri:serviceID:originApp:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(im)initWithServiceUri:serviceID:originApp:requestServiceActive:":{"name":"-initWithServiceUri:serviceID:originApp:requestServiceActive:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceUri":{"name":"serviceUri","abstract":"

    Fully qualified URI based on a predetermined scheme provided by the app service. SDL makes no guarantee that this URI is correct.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)serviceID":{"name":"serviceID","abstract":"

    The service ID that the app consumer wishes to send this URI.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)originApp":{"name":"originApp","abstract":"

    This string is the appID of the app requesting the app service provider take the specific action.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLPerformAppServiceInteraction.html#/c:objc(cs)SDLPerformAppServiceInteraction(py)requestServiceActive":{"name":"requestServiceActive","abstract":"

    This flag signals the requesting consumer would like this service to become the active primary service of the destination’s type.

    ","parent_name":"SDLPerformAppServiceInteraction"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)allowed":{"name":"allowed","abstract":"

    A set of all parameters that are permitted for this given RPC.

    ","parent_name":"SDLParameterPermissions"},"Classes/SDLParameterPermissions.html#/c:objc(cs)SDLParameterPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"

    A set of all parameters that are prohibited for this given RPC.

    ","parent_name":"SDLParameterPermissions"},"Classes/SDLOnWayPointChange.html#/c:objc(cs)SDLOnWayPointChange(py)waypoints":{"name":"waypoints","abstract":"

    Location address for display purposes only

    ","parent_name":"SDLOnWayPointChange"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)gps":{"name":"gps","abstract":"

    The car current GPS coordinates

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)speed":{"name":"speed","abstract":"

    The vehicle speed in kilometers per hour

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)rpm":{"name":"rpm","abstract":"

    The number of revolutions per minute of the engine.

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The fuel level in the tank (percentage)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The fuel level state

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    The estimate range in KM the vehicle can travel based on fuel level and consumption

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The instantaneous fuel consumption in microlitres

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The external temperature in degrees celsius.

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)vin":{"name":"vin","abstract":"

    The Vehicle Identification Number

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)prndl":{"name":"prndl","abstract":"

    The current gear shift state of the user’s vehicle

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    The current pressure warnings for the user’s vehicle

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)odometer":{"name":"odometer","abstract":"

    Odometer reading in km

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    The status of the seat belts

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The body information including power modes

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The IVI system status including signal and battery strength

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    The status of the brake pedal

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The status of the wipers

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    Status of the head lamps

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The estimated percentage (0% - 100%) of remaining oil life of the engine

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    Torque value for engine (in Nm) on non-diesel variants

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    Accelerator pedal position (percentage depressed)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    Current angle of the steering wheel (in deg)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    Emergency Call notification and confirmation data

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The status of the air bags

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    Information related to an emergency event (and if it occurred)

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    The status modes of the cluster

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)myKey":{"name":"myKey","abstract":"

    Information related to the MyKey feature

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The status of the electronic parking brake

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    The status of the turn signal

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnVehicleData.html#/c:objc(cs)SDLOnVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The cloud app vehicle ID

    ","parent_name":"SDLOnVehicleData"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)type":{"name":"type","abstract":"

    The type of touch event.

    ","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTouchEvent.html#/c:objc(cs)SDLOnTouchEvent(py)event":{"name":"event","abstract":"

    List of all individual touches involved in this event.

    ","parent_name":"SDLOnTouchEvent"},"Classes/SDLOnTBTClientState.html#/c:objc(cs)SDLOnTBTClientState(py)state":{"name":"state","abstract":"

    Current State of TBT client

    ","parent_name":"SDLOnTBTClientState"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestType":{"name":"requestType","abstract":"

    The type of system request.

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)requestSubType":{"name":"requestSubType","abstract":"

    A request subType used when the requestType is OEM_SPECIFIC.

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)url":{"name":"url","abstract":"

    Optional URL for HTTP requests. If blank, the binary data shall be forwarded to the app. If not blank, the binary data shall be forwarded to the url with a provided timeout in seconds.

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)timeout":{"name":"timeout","abstract":"

    Optional timeout for HTTP requests Required if a URL is provided

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)fileType":{"name":"fileType","abstract":"

    Optional file type (meant for HTTP file requests).

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)offset":{"name":"offset","abstract":"

    Optional offset in bytes for resuming partial data chunks

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemRequest.html#/c:objc(cs)SDLOnSystemRequest(py)length":{"name":"length","abstract":"

    Optional length in bytes for resuming partial data chunks

    ","parent_name":"SDLOnSystemRequest"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(im)initWithSystemCapability:":{"name":"-initWithSystemCapability:","abstract":"

    Convenience init for required parameters

    ","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSystemCapabilityUpdated.html#/c:objc(cs)SDLOnSystemCapabilityUpdated(py)systemCapability":{"name":"systemCapability","abstract":"

    The system capability that has been updated.

    ","parent_name":"SDLOnSystemCapabilityUpdated"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)URL":{"name":"URL","abstract":"

    Undocumented

    ","parent_name":"SDLOnSyncPData"},"Classes/SDLOnSyncPData.html#/c:objc(cs)SDLOnSyncPData(py)Timeout":{"name":"Timeout","abstract":"

    Undocumented

    ","parent_name":"SDLOnSyncPData"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allocatedModules":{"name":"allocatedModules","abstract":"

    @abstract Contains a list (zero or more) of module types that","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)freeModules":{"name":"freeModules","abstract":"

    @abstract Contains a list (zero or more) of module types that are free to access for the application.

    ","parent_name":"SDLOnRCStatus"},"Classes/SDLOnRCStatus.html#/c:objc(cs)SDLOnRCStatus(py)allowed":{"name":"allowed","abstract":"

    Issued by SDL to notify the application about remote control status change on SDL","parent_name":"SDLOnRCStatus"},"Classes/SDLOnPermissionsChange.html#/c:objc(cs)SDLOnPermissionsChange(py)permissionItem":{"name":"permissionItem","abstract":"

    Describes change in permissions for a given set of RPCs

    ","parent_name":"SDLOnPermissionsChange"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)driverDistractionStatus":{"name":"driverDistractionStatus","abstract":"

    Get the current driver distraction status(i.e. whether driver distraction rules are in effect, or not)

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)userSelected":{"name":"userSelected","abstract":"

    Get user selection status for the application (has the app been selected via hmi or voice command)

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)lockScreenStatus":{"name":"lockScreenStatus","abstract":"

    Indicates if the lockscreen should be required, optional or off

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLockScreenStatus.html#/c:objc(cs)SDLOnLockScreenStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"

    Get HMILevel in effect for the application

    ","parent_name":"SDLOnLockScreenStatus"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)language":{"name":"language","abstract":"

    Current SDL voice engine (VR+TTS) language

    ","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnLanguageChange.html#/c:objc(cs)SDLOnLanguageChange(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"

    Current display language

    ","parent_name":"SDLOnLanguageChange"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)event":{"name":"event","abstract":"

    The type of keyboard input

    ","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnKeyboardInput.html#/c:objc(cs)SDLOnKeyboardInput(py)data":{"name":"data","abstract":"

    The current keyboard string input from the user

    ","parent_name":"SDLOnKeyboardInput"},"Classes/SDLOnInteriorVehicleData.html#/c:objc(cs)SDLOnInteriorVehicleData(py)moduleData":{"name":"moduleData","abstract":"

    The subscribed module data that changed

    ","parent_name":"SDLOnInteriorVehicleData"},"Classes/SDLOnHashChange.html#/c:objc(cs)SDLOnHashChange(py)hashID":{"name":"hashID","abstract":"

    Calculated hash ID to be referenced during RegisterAppInterface request.

    ","parent_name":"SDLOnHashChange"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)hmiLevel":{"name":"hmiLevel","abstract":"

    SDLHMILevel in effect for the application

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)audioStreamingState":{"name":"audioStreamingState","abstract":"

    Current state of audio streaming for the application. When this parameter has a value of NOT_AUDIBLE, the application must stop streaming audio to SDL.

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)videoStreamingState":{"name":"videoStreamingState","abstract":"

    Current availablility of video streaming for the application. When this parameter is NOT_STREAMABLE, the application must stop video streaming to SDL.

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnHMIStatus.html#/c:objc(cs)SDLOnHMIStatus(py)systemContext":{"name":"systemContext","abstract":"

    Whether a user-initiated interaction is in-progress (VRSESSION or MENU), or not (MAIN)

    ","parent_name":"SDLOnHMIStatus"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)data":{"name":"data","abstract":"

    Contains base64 encoded string of SyncP packets.

    ","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)URL":{"name":"URL","abstract":"

    If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded to the provided URL.

    ","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnEncodedSyncPData.html#/c:objc(cs)SDLOnEncodedSyncPData(py)Timeout":{"name":"Timeout","abstract":"

    If blank, the SyncP data shall be forwarded to the app. If not blank, the SyncP data shall be forwarded with the provided timeout in seconds.

    ","parent_name":"SDLOnEncodedSyncPData"},"Classes/SDLOnDriverDistraction.html#/c:objc(cs)SDLOnDriverDistraction(py)state":{"name":"state","abstract":"

    The driver distraction state (i.e. whether driver distraction rules are in effect, or not)

    ","parent_name":"SDLOnDriverDistraction"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)cmdID":{"name":"cmdID","abstract":"

    The command ID of the command the user selected. This is the command ID value provided by the application in the SDLAddCommand operation that created the command.

    ","parent_name":"SDLOnCommand"},"Classes/SDLOnCommand.html#/c:objc(cs)SDLOnCommand(py)triggerSource":{"name":"triggerSource","abstract":"

    Indicates whether command was selected via voice or via a menu selection (using the OK button).

    ","parent_name":"SDLOnCommand"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonName":{"name":"buttonName","abstract":"

    The button’s name

    ","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"

    Indicates whether this is a LONG or SHORT button press event

    ","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonPress.html#/c:objc(cs)SDLOnButtonPress(py)customButtonID":{"name":"customButtonID","abstract":"

    If ButtonName is CUSTOM_BUTTON, this references the integer ID passed by a custom button. (e.g. softButton ID)

    ","parent_name":"SDLOnButtonPress"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonName":{"name":"buttonName","abstract":"

    The name of the button

    ","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)buttonEventMode":{"name":"buttonEventMode","abstract":"

    Indicates whether this is an UP or DOWN event

    ","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnButtonEvent.html#/c:objc(cs)SDLOnButtonEvent(py)customButtonID":{"name":"customButtonID","abstract":"

    If ButtonName is CUSTOM_BUTTON, this references the integer ID passed by a custom button. (e.g. softButton ID)

    ","parent_name":"SDLOnButtonEvent"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(im)initWithServiceData:":{"name":"-initWithServiceData:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppServiceData.html#/c:objc(cs)SDLOnAppServiceData(py)serviceData":{"name":"serviceData","abstract":"

    The updated app service data.

    ","parent_name":"SDLOnAppServiceData"},"Classes/SDLOnAppInterfaceUnregistered.html#/c:objc(cs)SDLOnAppInterfaceUnregistered(py)reason":{"name":"reason","abstract":"

    The reason application’s interface was terminated

    ","parent_name":"SDLOnAppInterfaceUnregistered"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:","abstract":"

    Undocumented

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(im)initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:":{"name":"-initWithSubThoroughfare:thoroughfare:locality:administrativeArea:postalCode:countryCode:countryName:subAdministrativeArea:subLocality:","abstract":"

    Undocumented

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryName":{"name":"countryName","abstract":"

    Name of the country (localized)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)countryCode":{"name":"countryCode","abstract":"

    countryCode of the country(ISO 3166-2)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)postalCode":{"name":"postalCode","abstract":"

    postalCode of location (PLZ, ZIP, PIN, CAP etc.)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)administrativeArea":{"name":"administrativeArea","abstract":"

    Portion of country (e.g. state)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subAdministrativeArea":{"name":"subAdministrativeArea","abstract":"

    Portion of administrativeArea (e.g. county)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)locality":{"name":"locality","abstract":"

    Hypernym for city/village

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subLocality":{"name":"subLocality","abstract":"

    Hypernym for district

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)thoroughfare":{"name":"thoroughfare","abstract":"

    Hypernym for street, road etc.

    ","parent_name":"SDLOasisAddress"},"Classes/SDLOasisAddress.html#/c:objc(cs)SDLOasisAddress(py)subThoroughfare":{"name":"subThoroughfare","abstract":"

    Portion of thoroughfare (e.g. house number)

    ","parent_name":"SDLOasisAddress"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allResponseNames":{"name":"+allResponseNames","abstract":"

    All of the possible SDL RPC Response notification names

    ","parent_name":"SDLNotificationConstants"},"Classes/SDLNotificationConstants.html#/c:objc(cs)SDLNotificationConstants(cm)allButtonEventNotifications":{"name":"+allButtonEventNotifications","abstract":"

    All of the possible SDL Button event notification names

    ","parent_name":"SDLNotificationConstants"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(im)initWithAcceptsWayPoints:":{"name":"-initWithAcceptsWayPoints:","abstract":"

    Convenience init.

    ","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceManifest.html#/c:objc(cs)SDLNavigationServiceManifest(py)acceptsWayPoints":{"name":"acceptsWayPoints","abstract":"

    Informs the subscriber if this service can actually accept way points.

    ","parent_name":"SDLNavigationServiceManifest"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:":{"name":"-initWithTimestamp:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(im)initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:":{"name":"-initWithTimestamp:origin:destination:destinationETA:instructions:nextInstructionETA:nextInstructionDistance:nextInstructionDistanceScale:prompt:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)timestamp":{"name":"timestamp","abstract":"

    This is the timestamp of when the data was generated. This is to ensure any time or distance given in the data can accurately be adjusted if necessary.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)origin":{"name":"origin","abstract":"

    The start location.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destination":{"name":"destination","abstract":"

    The final destination location.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)destinationETA":{"name":"destinationETA","abstract":"

    The estimated time of arrival at the final destination location.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)instructions":{"name":"instructions","abstract":"

    This array should be ordered with all remaining instructions. The start of this array should always contain the next instruction.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionETA":{"name":"nextInstructionETA","abstract":"

    The estimated time of arrival at the next destination.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistance":{"name":"nextInstructionDistance","abstract":"

    The distance to this instruction from current location. This should only be updated ever .1 unit of distance. For more accuracy the consumer can use the GPS location of itself and the next instruction.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)nextInstructionDistanceScale":{"name":"nextInstructionDistanceScale","abstract":"

    Distance till next maneuver (starting from) from previous maneuver.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationServiceData.html#/c:objc(cs)SDLNavigationServiceData(py)prompt":{"name":"prompt","abstract":"

    This is a prompt message that should be conveyed to the user through either display or voice (TTS). This param will change often as it should represent the following: approaching instruction, post instruction, alerts that affect the current navigation session, etc.

    ","parent_name":"SDLNavigationServiceData"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:":{"name":"-initWithLocationDetails:action:","abstract":"

    Convenience init for required parameters

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(im)initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:":{"name":"-initWithLocationDetails:action:eta:bearing:junctionType:drivingSide:details:image:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)locationDetails":{"name":"locationDetails","abstract":"

    The location details.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)action":{"name":"action","abstract":"

    The navigation action.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)eta":{"name":"eta","abstract":"

    The estimated time of arrival.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)bearing":{"name":"bearing","abstract":"

    The angle at which this instruction takes place. For example, 0 would mean straight, <=45 is bearing right, >= 135 is sharp right, between 45 and 135 is a regular right, and 180 is a U-Turn, etc.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)junctionType":{"name":"junctionType","abstract":"

    The navigation junction type.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)drivingSide":{"name":"drivingSide","abstract":"

    Used to infer which side of the road this instruction takes place. For a U-Turn (action=TURN, bearing=180) this will determine which direction the turn should take place.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)details":{"name":"details","abstract":"

    This is a string representation of this instruction, used to display instructions to the users. This is not intended to be read aloud to the users, see the param prompt in NavigationServiceData for that.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationInstruction.html#/c:objc(cs)SDLNavigationInstruction(py)image":{"name":"image","abstract":"

    An image representation of this instruction.

    ","parent_name":"SDLNavigationInstruction"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(im)initWithSendLocation:waypoints:":{"name":"-initWithSendLocation:waypoints:","abstract":"

    Undocumented

    ","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)sendLocationEnabled":{"name":"sendLocationEnabled","abstract":"

    Whether or not the SendLocation RPC is enabled.

    ","parent_name":"SDLNavigationCapability"},"Classes/SDLNavigationCapability.html#/c:objc(cs)SDLNavigationCapability(py)getWayPointsEnabled":{"name":"getWayPointsEnabled","abstract":"

    Whether or not Waypoint related RPCs are enabled.

    ","parent_name":"SDLNavigationCapability"},"Classes/SDLMyKey.html#/c:objc(cs)SDLMyKey(py)e911Override":{"name":"e911Override","abstract":"

    Indicates whether e911 override is on. References signal MyKey_e911Override_St. See VehicleDataStatus.

    ","parent_name":"SDLMyKey"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithRadioControlData:":{"name":"-initWithRadioControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with radio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithClimateControlData:":{"name":"-initWithClimateControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with climate control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithAudioControlData:":{"name":"-initWithAudioControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with audio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithLightControlData:":{"name":"-initWithLightControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with light control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithHMISettingsControlData:":{"name":"-initWithHMISettingsControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with hmi settings data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(im)initWithSeatControlData:":{"name":"-initWithSeatControlData:","abstract":"

    Constructs a newly allocated SDLModuleData object with seat control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)moduleType":{"name":"moduleType","abstract":"

    The moduleType indicates which type of data should be changed and identifies which data object exists in this struct.

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)radioControlData":{"name":"radioControlData","abstract":"

    The radio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)climateControlData":{"name":"climateControlData","abstract":"

    The climate control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)seatControlData":{"name":"seatControlData","abstract":"

    The seat control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)audioControlData":{"name":"audioControlData","abstract":"

    The audio control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)lightControlData":{"name":"lightControlData","abstract":"

    The light control data

    ","parent_name":"SDLModuleData"},"Classes/SDLModuleData.html#/c:objc(cs)SDLModuleData(py)hmiSettingsControlData":{"name":"hmiSettingsControlData","abstract":"

    The hmi control data

    ","parent_name":"SDLModuleData"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:":{"name":"-initWithTextFieldTypes:mainField2:","abstract":"

    Constructs a newly allocated SDLMetadataType object with NSArrays

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(im)initWithTextFieldTypes:mainField2:mainField3:mainField4:":{"name":"-initWithTextFieldTypes:mainField2:mainField3:mainField4:","abstract":"

    Undocumented

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField1":{"name":"mainField1","abstract":"

    The type of data contained in the mainField1 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField2":{"name":"mainField2","abstract":"

    The type of data contained in the mainField2 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField3":{"name":"mainField3","abstract":"

    The type of data contained in the mainField3 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMetadataTags.html#/c:objc(cs)SDLMetadataTags(py)mainField4":{"name":"mainField4","abstract":"

    The type of data contained in the mainField4 text field.

    ","parent_name":"SDLMetadataTags"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:":{"name":"-initWithMenuName:","abstract":"

    Undocumented

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(im)initWithMenuName:parentId:position:":{"name":"-initWithMenuName:parentId:position:","abstract":"

    Undocumented

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)parentID":{"name":"parentID","abstract":"

    The unique ID of an existing submenu to which a command will be added

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)position":{"name":"position","abstract":"

    The position within the items of the parent Command Menu

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuParams.html#/c:objc(cs)SDLMenuParams(py)menuName":{"name":"menuName","abstract":"

    The menu name which appears in menu, representing this command

    ","parent_name":"SDLMenuParams"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)title":{"name":"title","abstract":"

    The cell’s text to be displayed

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)icon":{"name":"icon","abstract":"

    The cell’s icon to be displayed

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)voiceCommands":{"name":"voiceCommands","abstract":"

    The strings the user can say to activate this voice command

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)handler":{"name":"handler","abstract":"

    The handler that will be called when the command is activated

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(py)subCells":{"name":"subCells","abstract":"

    If this is non-nil, this cell will be a sub-menu button, displaying the subcells in a menu when pressed.

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:voiceCommands:handler:":{"name":"-initWithTitle:icon:voiceCommands:handler:","abstract":"

    Create a menu cell that has no subcells.

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:subCells:":{"name":"-initWithTitle:subCells:","abstract":"

    Create a menu cell that has subcells and when selected will go into a deeper part of the menu

    ","parent_name":"SDLMenuCell"},"Classes/SDLMenuCell.html#/c:objc(cs)SDLMenuCell(im)initWithTitle:icon:subCells:":{"name":"-initWithTitle:icon:subCells:","abstract":"

    Create a menu cell that has subcells and when selected will go into a deeper part of the menu

    ","parent_name":"SDLMenuCell"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(im)initWithMediaType:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:":{"name":"-initWithMediaType:mediaTitle:mediaArtist:mediaAlbum:playlistName:isExplicit:trackPlaybackProgress:trackPlaybackDuration:queuePlaybackProgress:queuePlaybackDuration:queueCurrentTrackNumber:queueTotalTrackCount:","abstract":"

    Convenience init

    ","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaType":{"name":"mediaType","abstract":"

    The type of the currently playing or paused track.

    ","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaTitle":{"name":"mediaTitle","abstract":"

    Music: The name of the current track","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaArtist":{"name":"mediaArtist","abstract":"

    Music: The name of the current album artist","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)mediaAlbum":{"name":"mediaAlbum","abstract":"

    Music: The name of the current album","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)playlistName":{"name":"playlistName","abstract":"

    Music: The name of the playlist or radio station, if the user is playing from a playlist, otherwise, Null","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)isExplicit":{"name":"isExplicit","abstract":"

    Whether or not the content currently playing (e.g. the track, episode, or book) contains explicit content.

    ","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackProgress":{"name":"trackPlaybackProgress","abstract":"

    Music: The current progress of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)trackPlaybackDuration":{"name":"trackPlaybackDuration","abstract":"

    Music: The total duration of the track in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackProgress":{"name":"queuePlaybackProgress","abstract":"

    Music: The current progress of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queuePlaybackDuration":{"name":"queuePlaybackDuration","abstract":"

    Music: The total duration of the playback queue in seconds","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueCurrentTrackNumber":{"name":"queueCurrentTrackNumber","abstract":"

    Music: The current number (1 based) of the track in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMediaServiceData.html#/c:objc(cs)SDLMediaServiceData(py)queueTotalTrackCount":{"name":"queueTotalTrackCount","abstract":"

    Music: The total number of tracks in the playback queue","parent_name":"SDLMediaServiceData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(im)initWithMassageMode:massageZone:":{"name":"-initWithMassageMode:massageZone:","abstract":"

    @abstract Constructs a newly allocated SDLMassageModeData object with massageMode and massageZone

    ","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageMode":{"name":"massageMode","abstract":"

    @abstract mode of a massage zone

    ","parent_name":"SDLMassageModeData"},"Classes/SDLMassageModeData.html#/c:objc(cs)SDLMassageModeData(py)massageZone":{"name":"massageZone","abstract":"

    @abstract zone of a multi-contour massage seat.

    ","parent_name":"SDLMassageModeData"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(im)initWithMassageCushion:firmness:":{"name":"-initWithMassageCushion:firmness:","abstract":"

    Constructs a newly allocated SDLMassageCushionFirmness object with cushion and firmness

    ","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)cushion":{"name":"cushion","abstract":"

    @abstract cushion of a multi-contour massage seat.

    ","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLMassageCushionFirmness.html#/c:objc(cs)SDLMassageCushionFirmness(py)firmness":{"name":"firmness","abstract":"

    @abstract zone of a multi-contour massage seat.

    ","parent_name":"SDLMassageCushionFirmness"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)configuration":{"name":"configuration","abstract":"

    The configuration the manager was set up with.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)hmiLevel":{"name":"hmiLevel","abstract":"

    The current HMI level of the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)audioStreamingState":{"name":"audioStreamingState","abstract":"

    The current audio streaming state of the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemContext":{"name":"systemContext","abstract":"

    The current system context of the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)fileManager":{"name":"fileManager","abstract":"

    The file manager to be used by the running app.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)permissionManager":{"name":"permissionManager","abstract":"

    The permission manager monitoring RPC permissions.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)streamManager":{"name":"streamManager","abstract":"

    The streaming media manager to be used for starting video sessions.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)screenManager":{"name":"screenManager","abstract":"

    The screen manager for sending UI related RPCs.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)systemCapabilityManager":{"name":"systemCapabilityManager","abstract":"

    Centralized manager for retrieving all system capabilities.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)registerResponse":{"name":"registerResponse","abstract":"

    The response of a register call after it has been received.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)authToken":{"name":"authToken","abstract":"

    The auth token, if received. This should be used to log into a user account. Primarily used for cloud apps with companion app stores.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)delegate":{"name":"delegate","abstract":"

    The manager’s delegate.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)pendingRPCTransactions":{"name":"pendingRPCTransactions","abstract":"

    The currently pending RPC request send transactions

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(py)proxy":{"name":"proxy","abstract":"

    Undocumented

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)initWithConfiguration:delegate:":{"name":"-initWithConfiguration:delegate:","abstract":"

    Initialize the manager with a configuration. Call startWithHandler to begin waiting for a connection.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)startWithReadyHandler:":{"name":"-startWithReadyHandler:","abstract":"

    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.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)stop":{"name":"-stop","abstract":"

    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.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRPC:":{"name":"-sendRPC:","abstract":"

    Send an RPC of type Response, Notification or Request. Responses and notifications sent to Core do not a response back from Core. Each request sent to Core does get a response, so if you need the response and/or error, call sendRequest:withResponseHandler: instead.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:":{"name":"-sendRequest:","abstract":"

    Send an RPC request and don’t bother with the response or error. If you need the response or error, call sendRequest:withCompletionHandler: instead.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequest:withResponseHandler:":{"name":"-sendRequest:withResponseHandler:","abstract":"

    Send an RPC request and set a completion handler that will be called with the response when the response returns.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendRequests:progressHandler:completionHandler:":{"name":"-sendRequests:progressHandler:completionHandler:","abstract":"

    Send all of the requests given as quickly as possible, but in order. Call the completionHandler after all requests have either failed or given a response.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)sendSequentialRequests:progressHandler:completionHandler:":{"name":"-sendSequentialRequests:progressHandler:completionHandler:","abstract":"

    Send all of the requests one at a time, with the next one going out only after the previous one has received a response. Call the completionHandler after all requests have either failed or given a response.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withBlock:":{"name":"-subscribeToRPC:withBlock:","abstract":"

    Subscribe to callbacks about a particular RPC request, notification, or response with a block callback.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)subscribeToRPC:withObserver:selector:":{"name":"-subscribeToRPC:withObserver:selector:","abstract":"

    Subscribe to callbacks about a particular RPC request, notification, or response with a selector callback.

    ","parent_name":"SDLManager"},"Classes/SDLManager.html#/c:objc(cs)SDLManager(im)unsubscribeFromRPC:withObserver:":{"name":"-unsubscribeFromRPC:withObserver:","abstract":"

    Unsubscribe to callbacks about a particular RPC request, notification, or response.

    ","parent_name":"SDLManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)modules":{"name":"modules","abstract":"

    Active log modules

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)targets":{"name":"targets","abstract":"

    Active log targets

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)filters":{"name":"filters","abstract":"

    Active log filters

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)globalLogLevel":{"name":"globalLogLevel","abstract":"

    Any modules that do not have an explicitly specified level will by default use this log level

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)formatType":{"name":"formatType","abstract":"

    Active log format

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)asynchronous":{"name":"asynchronous","abstract":"

    Whether or not verbose, debug, and warning logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"

    Whether or not error logs are logged asynchronously. If logs are performed async, then some may be missed in the event of a terminating signal such as an exception, but performance is improved and your code will not be slowed by logging.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(py)disableAssertions":{"name":"disableAssertions","abstract":"

    Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)dateFormatter":{"name":"dateFormatter","abstract":"

    Active date formatter

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cpy)logQueue":{"name":"logQueue","abstract":"

    The queue asynchronously logged logs are logged on. Say that 10 times fast.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)sharedManager":{"name":"+sharedManager","abstract":"

    The singleton object

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)setConfiguration:":{"name":"+setConfiguration:","abstract":"

    Sets a configuration to be used by the log manager’s sharedManager. This is generally for internal use and you should set your configuration using SDLManager’s startWithConfiguration: method.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)setConfiguration:":{"name":"-setConfiguration:","abstract":"

    Sets a configuration to be used by the log manager. This is generally for internal use and you should set your configuration using SDLManager’s startWithConfiguration: method.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log to the sharedManager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:formatMessage:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log to this log manager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"+logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"

    Log to this sharedManager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logWithLevel:timestamp:file:functionName:line:queue:message:":{"name":"-logWithLevel:timestamp:file:functionName:line:queue:message:","abstract":"

    Log to this log manager’s active log targets. This is used internally to log. If you want to create a log, you should use macros such as SDLLogD.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"+logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"

    Log to this sharedManager’s active log targets. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logBytes:direction:timestamp:file:functionName:line:queue:":{"name":"-logBytes:direction:timestamp:file:functionName:line:queue:","abstract":"

    Log to this manager’s active log targets. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(cm)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"+logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log an error to the sharedManager’s active log targets and assert. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogManager.html#/c:objc(cs)SDLLogManager(im)logAssertWithTimestamp:file:functionName:line:queue:formatMessage:":{"name":"-logAssertWithTimestamp:file:functionName:line:queue:formatMessage:","abstract":"

    Log an error to this manager’s active log targets and assert. This is used internally to log.

    ","parent_name":"SDLLogManager"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(py)filter":{"name":"filter","abstract":"

    Undocumented

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(im)initWithCustomFilter:":{"name":"-initWithCustomFilter:","abstract":"

    Create a new filter with a custom filter block. The filter block will take a log model and return a BOOL of pass / fail.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingString:caseSensitive:":{"name":"+filterByDisallowingString:caseSensitive:","abstract":"

    Returns a filter that only allows logs not containing the passed string within their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingString:caseSensitive:":{"name":"+filterByAllowingString:caseSensitive:","abstract":"

    Returns a filter that only allows logs containing the passed string within their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingRegex:":{"name":"+filterByDisallowingRegex:","abstract":"

    Returns a filter that only allows logs not passing the passed regex against their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingRegex:":{"name":"+filterByAllowingRegex:","abstract":"

    Returns a filter that only allows logs passing the passed regex against their message.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingModules:":{"name":"+filterByDisallowingModules:","abstract":"

    Returns a filter that only allows logs not within the specified file modules to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingModules:":{"name":"+filterByAllowingModules:","abstract":"

    Returns a filter that only allows logs of the specified file modules to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByDisallowingFileNames:":{"name":"+filterByDisallowingFileNames:","abstract":"

    Returns a filter that only allows logs not within the specified files to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFilter.html#/c:objc(cs)SDLLogFilter(cm)filterByAllowingFileNames:":{"name":"+filterByAllowingFileNames:","abstract":"

    Returns a filter that only allows logs within the specified files to be logged.

    ","parent_name":"SDLLogFilter"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)name":{"name":"name","abstract":"

    The name of the this module, e.g. Transport

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)files":{"name":"files","abstract":"

    All of the files contained within this module. When a log is logged, the __FILE__ (in Obj-C) or #file (in Swift) is automatically captured and checked to see if any module has a file in this set that matches. If it does, it will be logged using the module’s log level and the module’s name will be printed in the formatted log.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(py)logLevel":{"name":"logLevel","abstract":"

    The custom level of the log. This is SDLLogLevelDefault (whatever the current global log level is) by default.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)init":{"name":"-init","abstract":"

    This method is unavailable and may not be used.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:level:":{"name":"-initWithName:files:level:","abstract":"

    Returns an initialized SDLLogFileModule that contains a custom name, set of files, and associated log level.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)initWithName:files:":{"name":"-initWithName:files:","abstract":"

    Returns an initialized SDLLogFileModule that contains a custom name and set of files. The logging level is the same as the current global logging file by using SDLLogLevelDefault.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(cm)moduleWithName:files:":{"name":"+moduleWithName:files:","abstract":"

    Returns an initialized SDLLogFileModule that contains a custom name and set of files. The logging level is the same as the current global logging file by using SDLLogLevelDefault.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogFileModule.html#/c:objc(cs)SDLLogFileModule(im)containsFile:":{"name":"-containsFile:","abstract":"

    Returns whether or not this module contains a given file.

    ","parent_name":"SDLLogFileModule"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)modules":{"name":"modules","abstract":"

    Any custom logging modules used by the developer’s code. Defaults to none.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)targets":{"name":"targets","abstract":"

    Where the logs will attempt to output. Defaults to Console.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)filters":{"name":"filters","abstract":"

    What log filters will run over this session. Defaults to none.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)formatType":{"name":"formatType","abstract":"

    How detailed of logs will be output. Defaults to Default.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)asynchronous":{"name":"asynchronous","abstract":"

    Whether or not logs will be run on a separate queue, asynchronously, allowing the following code to run before the log completes. Or if it will occur synchronously, which will prevent logs from being missed, but will slow down surrounding code. Defaults to YES.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)errorsAsynchronous":{"name":"errorsAsynchronous","abstract":"

    Whether or not error logs will be dispatched to loggers asynchronously. Defaults to NO.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)disableAssertions":{"name":"disableAssertions","abstract":"

    Whether or not assert logs will fire assertions in DEBUG mode. Assertions are always disabled in RELEASE builds. If assertions are disabled, only an error log will fire instead. Defaults to NO.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(py)globalLogLevel":{"name":"globalLogLevel","abstract":"

    Any modules that do not have an explicitly specified level will by default use the global log level. Defaults to Error.","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"

    A default logger for production. This sets the format type to Default, the log level to Error, and only enables the ASL logger.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLogConfiguration.html#/c:objc(cs)SDLLogConfiguration(cm)debugConfiguration":{"name":"+debugConfiguration","abstract":"

    A debug logger for use in development. This sets the format type to Detailed, the log level to Debug, and enables the Console and ASL loggers.

    ","parent_name":"SDLLogConfiguration"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)appIcon":{"name":"appIcon","abstract":"

    The app’s icon. This will be set by the lock screen configuration.

    ","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)vehicleIcon":{"name":"vehicleIcon","abstract":"

    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.

    ","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenViewController.html#/c:objc(cs)SDLLockScreenViewController(py)backgroundColor":{"name":"backgroundColor","abstract":"

    The designated background color set in the lock screen configuration, or the default SDL gray-blue.

    ","parent_name":"SDLLockScreenViewController"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)showInOptionalState":{"name":"showInOptionalState","abstract":"

    Whether or not the lock screen should be shown in the lock screen optional state. Defaults to false.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)enableAutomaticLockScreen":{"name":"enableAutomaticLockScreen","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)backgroundColor":{"name":"backgroundColor","abstract":"

    The background color of the lock screen. This could be a branding color, or leave at the default for a dark blue-gray.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)appIcon":{"name":"appIcon","abstract":"

    Your app icon as it will appear on the lock screen.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(py)customViewController":{"name":"customViewController","abstract":"

    A custom view controller that the lock screen will manage the presentation of.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)disabledConfiguration":{"name":"+disabledConfiguration","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfiguration":{"name":"+enabledConfiguration","abstract":"

    Use this configuration for the basic default lock screen. A custom app icon will not be used.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithAppIcon:backgroundColor:":{"name":"+enabledConfigurationWithAppIcon:backgroundColor:","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLockScreenConfiguration.html#/c:objc(cs)SDLLockScreenConfiguration(cm)enabledConfigurationWithViewController:":{"name":"+enabledConfigurationWithViewController:","abstract":"

    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.

    ","parent_name":"SDLLockScreenConfiguration"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:":{"name":"-initWithCoordinate:","abstract":"

    Convenience init for location coordinate.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(im)initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:":{"name":"-initWithCoordinate:locationName:addressLines:locationDescription:phoneNumber:locationImage:searchAddress:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)coordinate":{"name":"coordinate","abstract":"

    Latitude/Longitude of the location

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationName":{"name":"locationName","abstract":"

    Name of location.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)addressLines":{"name":"addressLines","abstract":"

    Location address for display purposes only.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationDescription":{"name":"locationDescription","abstract":"

    Description intended location / establishment.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)phoneNumber":{"name":"phoneNumber","abstract":"

    Phone number of location / establishment.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)locationImage":{"name":"locationImage","abstract":"

    Image / icon of intended location.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationDetails.html#/c:objc(cs)SDLLocationDetails(py)searchAddress":{"name":"searchAddress","abstract":"

    Address to be used by navigation engines for search.

    ","parent_name":"SDLLocationDetails"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(im)initWithLatitudeDegrees:longitudeDegrees:":{"name":"-initWithLatitudeDegrees:longitudeDegrees:","abstract":"

    Convenience init for location coordinates

    ","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"

    Latitude of the location

    ","parent_name":"SDLLocationCoordinate"},"Classes/SDLLocationCoordinate.html#/c:objc(cs)SDLLocationCoordinate(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"

    Latitude of the location

    ","parent_name":"SDLLocationCoordinate"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)filenames":{"name":"filenames","abstract":"

    An array of all filenames resident on the module for the given registered app. If omitted, then no files currently reside on the system.

    ","parent_name":"SDLListFilesResponse"},"Classes/SDLListFilesResponse.html#/c:objc(cs)SDLListFilesResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"

    Provides the total local space available on the module for the registered app.

    ","parent_name":"SDLListFilesResponse"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:":{"name":"-initWithId:status:","abstract":"

    Constructs a newly allocated SDLLightState object with given parameters

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:status:density:color:":{"name":"-initWithId:status:density:color:","abstract":"

    Constructs a newly allocated SDLLightState object with given parameters

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(im)initWithId:lightStatus:lightDensity:lightColor:":{"name":"-initWithId:lightStatus:lightDensity:lightColor:","abstract":"

    Constructs a newly allocated SDLLightState object with given parameters

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)id":{"name":"id","abstract":"

    @abstract The name of a light or a group of lights

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)status":{"name":"status","abstract":"

    @abstract Reflects the status of Light.

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)density":{"name":"density","abstract":"

    @abstract Reflects the density of Light.

    ","parent_name":"SDLLightState"},"Classes/SDLLightState.html#/c:objc(cs)SDLLightState(py)color":{"name":"color","abstract":"

    @abstract Reflects the color of Light.

    ","parent_name":"SDLLightState"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(im)initWithLightStates:":{"name":"-initWithLightStates:","abstract":"

    Constructs a newly allocated SDLLightControlData object with lightState

    ","parent_name":"SDLLightControlData"},"Classes/SDLLightControlData.html#/c:objc(cs)SDLLightControlData(py)lightState":{"name":"lightState","abstract":"

    @abstract An array of LightNames and their current or desired status.","parent_name":"SDLLightControlData"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(im)initWithModuleName:supportedLights:":{"name":"-initWithModuleName:supportedLights:","abstract":"

    Constructs a newly allocated SDLLightControlCapabilities object with given parameters

    ","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the light control module.","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightControlCapabilities.html#/c:objc(cs)SDLLightControlCapabilities(py)supportedLights":{"name":"supportedLights","abstract":"

    @abstract An array of available LightCapabilities that are controllable.

    ","parent_name":"SDLLightControlCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:":{"name":"-initWithName:","abstract":"

    Constructs a newly allocated SDLLightCapabilities object with the name of the light or group of lights

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(im)initWithName:densityAvailable:colorAvailable:statusAvailable:":{"name":"-initWithName:densityAvailable:colorAvailable:statusAvailable:","abstract":"

    Constructs a newly allocated SDLLightCapabilities object with given parameters

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)name":{"name":"name","abstract":"

    @abstract The name of a light or a group of lights

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)densityAvailable":{"name":"densityAvailable","abstract":"

    @abstract Indicates if the light’s density can be set remotely (similar to a dimmer).

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)colorAvailable":{"name":"colorAvailable","abstract":"

    @abstract Indicates if the light’s color can be set remotely by using the RGB color space.

    ","parent_name":"SDLLightCapabilities"},"Classes/SDLLightCapabilities.html#/c:objc(cs)SDLLightCapabilities(py)statusAvailable":{"name":"statusAvailable","abstract":"

    @abstract Indicates if the status (ON/OFF) can be set remotely.","parent_name":"SDLLightCapabilities"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)appName":{"name":"appName","abstract":"

    The full name of the app to that the configuration should be updated to.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)shortAppName":{"name":"shortAppName","abstract":"

    An abbrevited application name that will be used on the app launching screen if the full one would be truncated.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)ttsName":{"name":"ttsName","abstract":"

    A Text to Speech String for voice recognition of the mobile application name.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"

    Additional voice recognition commands. May not interfere with any other app name or global commands.

    ","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfigurationUpdate.html#/c:objc(cs)SDLLifecycleConfigurationUpdate(im)initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:":{"name":"-initWithAppName:shortAppName:ttsName:voiceRecognitionCommandNames:","abstract":"

    Initializes and returns a newly allocated lifecycle configuration update object with the specified app data.","parent_name":"SDLLifecycleConfigurationUpdate"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:appId:":{"name":"+defaultConfigurationWithAppName:appId:","abstract":"

    A production configuration that runs using IAP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)defaultConfigurationWithAppName:fullAppId:":{"name":"+defaultConfigurationWithAppName:fullAppId:","abstract":"

    A production configuration that runs using IAP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:appId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:appId:ipAddress:port:","abstract":"

    A debug configuration that runs using TCP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(cm)debugConfigurationWithAppName:fullAppId:ipAddress:port:":{"name":"+debugConfigurationWithAppName:fullAppId:ipAddress:port:","abstract":"

    A debug configuration that runs using TCP. Additional functionality should be customized on the properties.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugMode":{"name":"tcpDebugMode","abstract":"

    Whether or not debug mode is enabled

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugIPAddress":{"name":"tcpDebugIPAddress","abstract":"

    The ip address at which the library will look for a server

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)tcpDebugPort":{"name":"tcpDebugPort","abstract":"

    The port at which the library will look for a server

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appName":{"name":"appName","abstract":"

    The full name of the app

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appId":{"name":"appId","abstract":"

    The app id. This must be the same as the app id received from the SDL developer portal.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)fullAppId":{"name":"fullAppId","abstract":"

    The full app id. This must be the same as the full app id received from the SDL developer portal.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)resumeHash":{"name":"resumeHash","abstract":"

    A hash id which should be passed to the remote system in the RegisterAppInterface

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)isMedia":{"name":"isMedia","abstract":"

    This is an automatically set based on the app type

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appType":{"name":"appType","abstract":"

    The application type

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)additionalAppTypes":{"name":"additionalAppTypes","abstract":"

    Additional application types beyond appType

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)language":{"name":"language","abstract":"

    The default language to use

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)languagesSupported":{"name":"languagesSupported","abstract":"

    An array of all the supported languages

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)appIcon":{"name":"appIcon","abstract":"

    The application icon to be used on an app launching screen

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)shortAppName":{"name":"shortAppName","abstract":"

    An abbrevited application name that will be used on the app launching screen if the full one would be truncated

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)ttsName":{"name":"ttsName","abstract":"

    A Text to Speech String for voice recognition of the mobile application name.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)voiceRecognitionCommandNames":{"name":"voiceRecognitionCommandNames","abstract":"

    Additional voice recognition commands. May not interfere with any other app name or global commands.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)dayColorScheme":{"name":"dayColorScheme","abstract":"

    The color scheme to use when the head unit is in a light / day situation.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)nightColorScheme":{"name":"nightColorScheme","abstract":"

    The color scheme to use when the head unit is in a dark / night situation.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumProtocolVersion":{"name":"minimumProtocolVersion","abstract":"

    The minimum protocol version that will be permitted to connect. This defaults to 1.0.0. If the protocol version of the head unit connected is below this version, the app will disconnect with an EndService protocol message and will not register.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLLifecycleConfiguration.html#/c:objc(cs)SDLLifecycleConfiguration(py)minimumRPCVersion":{"name":"minimumRPCVersion","abstract":"

    The minimum RPC version that will be permitted to connect. This defaults to 1.0.0. If the RPC version of the head unit connected is below this version, an UnregisterAppInterface will be sent.

    ","parent_name":"SDLLifecycleConfiguration"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(im)initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:":{"name":"-initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:","abstract":"

    Undocumented

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)language":{"name":"language","abstract":"

    The keyboard language

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keyboardLayout":{"name":"keyboardLayout","abstract":"

    Desired keyboard layout

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)keypressMode":{"name":"keypressMode","abstract":"

    Desired keypress mode.

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)limitedCharacterList":{"name":"limitedCharacterList","abstract":"

    Array of keyboard characters to enable. All omitted characters will be greyed out (disabled) on the keyboard. If omitted, the entire keyboard will be enabled.

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLKeyboardProperties.html#/c:objc(cs)SDLKeyboardProperties(py)autoCompleteText":{"name":"autoCompleteText","abstract":"

    Allows an app to prepopulate the text field with a suggested or completed entry as the user types

    ","parent_name":"SDLKeyboardProperties"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionWidth":{"name":"resolutionWidth","abstract":"

    Resolution width

    ","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(py)resolutionHeight":{"name":"resolutionHeight","abstract":"

    Resolution height

    ","parent_name":"SDLImageResolution"},"Classes/SDLImageResolution.html#/c:objc(cs)SDLImageResolution(im)initWithWidth:height:":{"name":"-initWithWidth:height:","abstract":"

    Undocumented

    ","parent_name":"SDLImageResolution"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)name":{"name":"name","abstract":"

    The name that identifies the field.

    ","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageTypeSupported":{"name":"imageTypeSupported","abstract":"

    The image types that are supported in this field.

    ","parent_name":"SDLImageField"},"Classes/SDLImageField.html#/c:objc(cs)SDLImageField(py)imageResolution":{"name":"imageResolution","abstract":"

    The image resolution of this field

    ","parent_name":"SDLImageField"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:":{"name":"-initWithName:ofType:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:ofType:isTemplate:":{"name":"-initWithName:ofType:isTemplate:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:":{"name":"-initWithName:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithName:isTemplate:":{"name":"-initWithName:isTemplate:","abstract":"

    Convenience init for displaying a dynamic image. The image must be uploaded to SDL Core before being displayed.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticImageValue:":{"name":"-initWithStaticImageValue:","abstract":"

    Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image’s value.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(im)initWithStaticIconName:":{"name":"-initWithStaticIconName:","abstract":"

    Convenience init for displaying a static image. Static images are already on-board SDL Core and can be used by providing the image’s value.

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)value":{"name":"value","abstract":"

    The static hex icon value or the binary image file name identifier (sent by SDLPutFile)

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)imageType":{"name":"imageType","abstract":"

    Describes whether the image is static or dynamic

    ","parent_name":"SDLImage"},"Classes/SDLImage.html#/c:objc(cs)SDLImage(py)isTemplate":{"name":"isTemplate","abstract":"

    Indicates that this image can be (re)colored by the HMI to best fit the current color scheme.

    ","parent_name":"SDLImage"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)lowBeamsOn":{"name":"lowBeamsOn","abstract":"

    Low beams are on or off.

    ","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)highBeamsOn":{"name":"highBeamsOn","abstract":"

    High beams are on or off

    ","parent_name":"SDLHeadLampStatus"},"Classes/SDLHeadLampStatus.html#/c:objc(cs)SDLHeadLampStatus(py)ambientLightSensorStatus":{"name":"ambientLightSensorStatus","abstract":"

    Status of the ambient light senser

    ","parent_name":"SDLHeadLampStatus"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(im)initWithId:rect:":{"name":"-initWithId:rect:","abstract":"

    Undocumented

    ","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)id":{"name":"id","abstract":"

    A user control spatial identifier

    ","parent_name":"SDLHapticRect"},"Classes/SDLHapticRect.html#/c:objc(cs)SDLHapticRect(py)rect":{"name":"rect","abstract":"

    The position of the haptic rectangle to be highlighted. The center of this rectangle will be touched when a press occurs.

    ","parent_name":"SDLHapticRect"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(im)initWithDisplaymode:temperatureUnit:distanceUnit:":{"name":"-initWithDisplaymode:temperatureUnit:distanceUnit:","abstract":"

    Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)displayMode":{"name":"displayMode","abstract":"

    @abstract Display the Display Mode used HMI setting

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)temperatureUnit":{"name":"temperatureUnit","abstract":"

    @abstract Display the temperature unit used HMI setting

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlData.html#/c:objc(cs)SDLHMISettingsControlData(py)distanceUnit":{"name":"distanceUnit","abstract":"

    @abstract Display the distance unit used HMI setting

    ","parent_name":"SDLHMISettingsControlData"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:":{"name":"-initWithModuleName:","abstract":"

    Constructs a newly allocated SDLHMISettingsControlCapabilities object with moduleName

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(im)initWithModuleName:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:":{"name":"-initWithModuleName:distanceUnitAvailable:temperatureUnitAvailable:displayModeUnitAvailable:","abstract":"

    Constructs a newly allocated SDLHMISettingsControlCapabilities object with given parameters

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the hmi setting module.","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)distanceUnitAvailable":{"name":"distanceUnitAvailable","abstract":"

    @abstract Availability of the control of distance unit.

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)temperatureUnitAvailable":{"name":"temperatureUnitAvailable","abstract":"

    @abstract Availability of the control of temperature unit.

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMISettingsControlCapabilities.html#/c:objc(cs)SDLHMISettingsControlCapabilities(py)displayModeUnitAvailable":{"name":"displayModeUnitAvailable","abstract":"

    @abstract Availability of the control of HMI display mode.

    ","parent_name":"SDLHMISettingsControlCapabilities"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)allowed":{"name":"allowed","abstract":"

    A set of all HMI levels that are permitted for this given RPC

    ","parent_name":"SDLHMIPermissions"},"Classes/SDLHMIPermissions.html#/c:objc(cs)SDLHMIPermissions(py)userDisallowed":{"name":"userDisallowed","abstract":"

    A set of all HMI levels that are prohibited for this given RPC

    ","parent_name":"SDLHMIPermissions"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)navigation":{"name":"navigation","abstract":"

    Availability of built in Nav. True: Available, False: Not Available

    ","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)phoneCall":{"name":"phoneCall","abstract":"

    Availability of built in phone. True: Available, False: Not Available

    ","parent_name":"SDLHMICapabilities"},"Classes/SDLHMICapabilities.html#/c:objc(cs)SDLHMICapabilities(py)videoStreaming":{"name":"videoStreaming","abstract":"

    Availability of built in video streaming. True: Available, False: Not Available

    ","parent_name":"SDLHMICapabilities"},"Classes/SDLGetWayPointsResponse.html#/c:objc(cs)SDLGetWayPointsResponse(py)waypoints":{"name":"waypoints","abstract":"

    Provides additional human readable info regarding the result.

    ","parent_name":"SDLGetWayPointsResponse"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(im)initWithType:":{"name":"-initWithType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetWayPoints"},"Classes/SDLGetWayPoints.html#/c:objc(cs)SDLGetWayPoints(py)waypointType":{"name":"waypointType","abstract":"

    To request for either the destination","parent_name":"SDLGetWayPoints"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)gps":{"name":"gps","abstract":"

    The car current GPS coordinates

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)speed":{"name":"speed","abstract":"

    The vehicle speed in kilometers per hour

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)rpm":{"name":"rpm","abstract":"

    The number of revolutions per minute of the engine.

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel":{"name":"fuelLevel","abstract":"

    The fuel level in the tank (percentage)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    The fuel level state

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)fuelRange":{"name":"fuelRange","abstract":"

    The estimate range in KM the vehicle can travel based on fuel level and consumption

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    The instantaneous fuel consumption in microlitres

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)externalTemperature":{"name":"externalTemperature","abstract":"

    The external temperature in degrees celsius.

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)vin":{"name":"vin","abstract":"

    The Vehicle Identification Number

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)prndl":{"name":"prndl","abstract":"

    The current gear shift state of the user’s vehicle

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)tirePressure":{"name":"tirePressure","abstract":"

    The current pressure warnings for the user’s vehicle

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)odometer":{"name":"odometer","abstract":"

    Odometer reading in km

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)beltStatus":{"name":"beltStatus","abstract":"

    The status of the seat belts

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)bodyInformation":{"name":"bodyInformation","abstract":"

    The body information including power modes

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)deviceStatus":{"name":"deviceStatus","abstract":"

    The IVI system status including signal and battery strength

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)driverBraking":{"name":"driverBraking","abstract":"

    The status of the brake pedal

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)wiperStatus":{"name":"wiperStatus","abstract":"

    The status of the wipers

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)headLampStatus":{"name":"headLampStatus","abstract":"

    Status of the head lamps

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineOilLife":{"name":"engineOilLife","abstract":"

    The estimated percentage (0% - 100%) of remaining oil life of the engine

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)engineTorque":{"name":"engineTorque","abstract":"

    Torque value for engine (in Nm) on non-diesel variants

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    Accelerator pedal position (percentage depressed)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    Current angle of the steering wheel (in deg)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)eCallInfo":{"name":"eCallInfo","abstract":"

    Emergency Call notification and confirmation data

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)airbagStatus":{"name":"airbagStatus","abstract":"

    The status of the air bags

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    Information related to an emergency event (and if it occurred)

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    The status modes of the cluster

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)myKey":{"name":"myKey","abstract":"

    Information related to the MyKey feature

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    The status of the electronic parking brake

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)turnSignal":{"name":"turnSignal","abstract":"

    The status of the turn signal

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleDataResponse.html#/c:objc(cs)SDLGetVehicleDataResponse(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    The cloud app vehicle ID

    ","parent_name":"SDLGetVehicleDataResponse"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:emergencyEvent:engineTorque:externalTemperature:fuelLevel:fuelLevelState:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:vin:wiperStatus:","abstract":"

    Convenience init for getting data for all possible vehicle data items.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"

    Convenience init for getting data for all possible vehicle data items.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(im)initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:":{"name":"-initWithAccelerationPedalPosition:airbagStatus:beltStatus:bodyInformation:cloudAppVehicleID:clusterModeStatus:deviceStatus:driverBraking:eCallInfo:electronicParkBrakeStatus:emergencyEvent:engineOilLife:engineTorque:externalTemperature:fuelLevel:fuelLevelState:fuelRange:gps:headLampStatus:instantFuelConsumption:myKey:odometer:prndl:rpm:speed:steeringWheelAngle:tirePressure:turnSignal:vin:wiperStatus:","abstract":"

    Convenience init for getting data for all possible vehicle data items.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)gps":{"name":"gps","abstract":"

    A boolean value. If true, requests GPS data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)speed":{"name":"speed","abstract":"

    A boolean value. If true, requests Speed data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)rpm":{"name":"rpm","abstract":"

    A boolean value. If true, requests RPM data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel":{"name":"fuelLevel","abstract":"

    A boolean value. If true, requests Fuel Level data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelLevel_State":{"name":"fuelLevel_State","abstract":"

    A boolean value. If true, requests Fuel Level State data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)fuelRange":{"name":"fuelRange","abstract":"

    A boolean value. If true, requests Fuel Range data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)instantFuelConsumption":{"name":"instantFuelConsumption","abstract":"

    A boolean value. If true, requests Instant Fuel Consumption data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)externalTemperature":{"name":"externalTemperature","abstract":"

    A boolean value. If true, requests External Temperature data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)vin":{"name":"vin","abstract":"

    A boolean value. If true, requests the Vehicle Identification Number.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)prndl":{"name":"prndl","abstract":"

    A boolean value. If true, requests PRNDL data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)tirePressure":{"name":"tirePressure","abstract":"

    A boolean value. If true, requests Tire Pressure data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)odometer":{"name":"odometer","abstract":"

    A boolean value. If true, requests Odometer data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)beltStatus":{"name":"beltStatus","abstract":"

    A boolean value. If true, requests Belt Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)bodyInformation":{"name":"bodyInformation","abstract":"

    A boolean value. If true, requests Body Information data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)deviceStatus":{"name":"deviceStatus","abstract":"

    A boolean value. If true, requests Device Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)driverBraking":{"name":"driverBraking","abstract":"

    A boolean value. If true, requests Driver Braking data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)wiperStatus":{"name":"wiperStatus","abstract":"

    A boolean value. If true, requests Wiper Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)headLampStatus":{"name":"headLampStatus","abstract":"

    A boolean value. If true, requests Head Lamp Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineOilLife":{"name":"engineOilLife","abstract":"

    A boolean value. If true, requests Engine Oil Life data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)engineTorque":{"name":"engineTorque","abstract":"

    A boolean value. If true, requests Engine Torque data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)accPedalPosition":{"name":"accPedalPosition","abstract":"

    A boolean value. If true, requests Acc Pedal Position data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)steeringWheelAngle":{"name":"steeringWheelAngle","abstract":"

    A boolean value. If true, requests Steering Wheel Angle data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)eCallInfo":{"name":"eCallInfo","abstract":"

    A boolean value. If true, requests Emergency Call Info data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)airbagStatus":{"name":"airbagStatus","abstract":"

    A boolean value. If true, requests Air Bag Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)emergencyEvent":{"name":"emergencyEvent","abstract":"

    A boolean value. If true, requests Emergency Event (if it occurred) data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)clusterModeStatus":{"name":"clusterModeStatus","abstract":"

    A boolean value. If true, requests Cluster Mode Status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)myKey":{"name":"myKey","abstract":"

    A boolean value. If true, requests MyKey data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)electronicParkBrakeStatus":{"name":"electronicParkBrakeStatus","abstract":"

    A boolean value. If true, requests Electronic Parking Brake status data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)turnSignal":{"name":"turnSignal","abstract":"

    A boolean value. If true, requests Turn Signal data.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetVehicleData.html#/c:objc(cs)SDLGetVehicleData(py)cloudAppVehicleID":{"name":"cloudAppVehicleID","abstract":"

    A boolean value. If true, requests the Cloud App Vehicle ID.

    ","parent_name":"SDLGetVehicleData"},"Classes/SDLGetSystemCapabilityResponse.html#/c:objc(cs)SDLGetSystemCapabilityResponse(py)systemCapability":{"name":"systemCapability","abstract":"

    The requested system capability, of the type that was sent in the request

    ","parent_name":"SDLGetSystemCapabilityResponse"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:":{"name":"-initWithType:","abstract":"

    Convenience init

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(im)initWithType:subscribe:":{"name":"-initWithType:subscribe:","abstract":"

    Convenience init

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)systemCapabilityType":{"name":"systemCapabilityType","abstract":"

    The type of system capability to get more information on

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetSystemCapability.html#/c:objc(cs)SDLGetSystemCapability(py)subscribe":{"name":"subscribe","abstract":"

    Flag to subscribe to updates of the supplied service capability type. If true, the requester will be subscribed. If false, the requester will not be subscribed and be removed as a subscriber if it was previously subscribed.

    ","parent_name":"SDLGetSystemCapability"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)moduleData":{"name":"moduleData","abstract":"

    The requested data

    ","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleDataResponse.html#/c:objc(cs)SDLGetInteriorVehicleDataResponse(py)isSubscribed":{"name":"isSubscribed","abstract":"

    It is a conditional-mandatory parameter: must be returned in case subscribe parameter was present in the related request.

    ","parent_name":"SDLGetInteriorVehicleDataResponse"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initWithModuleType:":{"name":"-initWithModuleType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndSubscribeToModuleType:":{"name":"-initAndSubscribeToModuleType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(im)initAndUnsubscribeToModuleType:":{"name":"-initAndUnsubscribeToModuleType:","abstract":"

    Undocumented

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)moduleType":{"name":"moduleType","abstract":"

    The type of a RC module to retrieve module data from the vehicle.

    ","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetInteriorVehicleData.html#/c:objc(cs)SDLGetInteriorVehicleData(py)subscribe":{"name":"subscribe","abstract":"

    If subscribe is true, the head unit will register onInteriorVehicleData notifications for the requested moduelType.","parent_name":"SDLGetInteriorVehicleData"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(im)initWithOffset:length:fileType:crc:":{"name":"-initWithOffset:length:fileType:crc:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)offset":{"name":"offset","abstract":"

    Optional offset in bytes for resuming partial data chunks.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)length":{"name":"length","abstract":"

    Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)fileType":{"name":"fileType","abstract":"

    File type that is being sent in response.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFileResponse.html#/c:objc(cs)SDLGetFileResponse(py)crc":{"name":"crc","abstract":"

    Additional CRC32 checksum to protect data integrity up to 512 Mbits.

    ","parent_name":"SDLGetFileResponse"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:":{"name":"-initWithFileName:appServiceId:fileType:","abstract":"

    Convenience init for sending a small file.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(im)initWithFileName:appServiceId:fileType:offset:length:":{"name":"-initWithFileName:appServiceId:fileType:offset:length:","abstract":"

    Convenience init for sending a large file in multiple data chunks.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileName":{"name":"fileName","abstract":"

    File name that should be retrieved.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)appServiceId":{"name":"appServiceId","abstract":"

    ID of the service that should have uploaded the requested file.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)fileType":{"name":"fileType","abstract":"

    Selected file type.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)offset":{"name":"offset","abstract":"

    Optional offset in bytes for resuming partial data chunks.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetFile.html#/c:objc(cs)SDLGetFile(py)length":{"name":"length","abstract":"

    Optional length in bytes for resuming partial data chunks. If offset is set to 0, then length is the total length of the file to be downloaded.

    ","parent_name":"SDLGetFile"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)ecuHeader":{"name":"ecuHeader","abstract":"

    2 byte ECU Header for DTC response (as defined in VHR_Layout_Specification_DTCs.pdf)

    ","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCsResponse.html#/c:objc(cs)SDLGetDTCsResponse(py)dtc":{"name":"dtc","abstract":"

    Array of all reported DTCs on module (ecuHeader contains information if list is truncated). Each DTC is represented by 4 bytes (3 bytes of data and 1 byte status as defined in VHR_Layout_Specification_DTCs.pdf).

    ","parent_name":"SDLGetDTCsResponse"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:":{"name":"-initWithECUName:","abstract":"

    Undocumented

    ","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(im)initWithECUName:mask:":{"name":"-initWithECUName:mask:","abstract":"

    Undocumented

    ","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)ecuName":{"name":"ecuName","abstract":"

    a name of the module to receive the DTC form","parent_name":"SDLGetDTCs"},"Classes/SDLGetDTCs.html#/c:objc(cs)SDLGetDTCs(py)dtcMask":{"name":"dtcMask","abstract":"

    DTC Mask Byte to be sent in diagnostic request to module. NSNumber* dtcMask Minvalue:0; Maxvalue:255

    ","parent_name":"SDLGetDTCs"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(im)initWithProperties:":{"name":"-initWithProperties:","abstract":"

    Convenience init.

    ","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppPropertiesResponse.html#/c:objc(cs)SDLGetCloudAppPropertiesResponse(py)properties":{"name":"properties","abstract":"

    The requested cloud application properties.

    ","parent_name":"SDLGetCloudAppPropertiesResponse"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"

    Convenience init.

    ","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetCloudAppProperties.html#/c:objc(cs)SDLGetCloudAppProperties(py)appID":{"name":"appID","abstract":"

    The id of the cloud app.

    ","parent_name":"SDLGetCloudAppProperties"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(im)initWithAppServiceData:":{"name":"-initWithAppServiceData:","abstract":"

    Convenience init.

    ","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceDataResponse.html#/c:objc(cs)SDLGetAppServiceDataResponse(py)serviceData":{"name":"serviceData","abstract":"

    Contains all the current data of the app service.

    ","parent_name":"SDLGetAppServiceDataResponse"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"

    Convenience init for service type.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndSubscribeToAppServiceType:":{"name":"-initAndSubscribeToAppServiceType:","abstract":"

    Convenience init for subscribing to a service type.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(im)initAndUnsubscribeToAppServiceType:":{"name":"-initAndUnsubscribeToAppServiceType:","abstract":"

    Convenience init for unsubscribing to a service type

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)serviceType":{"name":"serviceType","abstract":"

    The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGetAppServiceData.html#/c:objc(cs)SDLGetAppServiceData(py)subscribe":{"name":"subscribe","abstract":"

    If true, the consumer is requesting to subscribe to all future updates from the service publisher. If false, the consumer doesn’t wish to subscribe and should be unsubscribed if it was previously subscribed.

    ","parent_name":"SDLGetAppServiceData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)longitudeDegrees":{"name":"longitudeDegrees","abstract":"

    longitude degrees

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)latitudeDegrees":{"name":"latitudeDegrees","abstract":"

    latitude degrees

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcYear":{"name":"utcYear","abstract":"

    utc year

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMonth":{"name":"utcMonth","abstract":"

    utc month

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcDay":{"name":"utcDay","abstract":"

    utc day

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcHours":{"name":"utcHours","abstract":"

    utc hours

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcMinutes":{"name":"utcMinutes","abstract":"

    utc minutes

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)utcSeconds":{"name":"utcSeconds","abstract":"

    utc seconds

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)compassDirection":{"name":"compassDirection","abstract":"

    Optional, Potential Compass Directions

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)pdop":{"name":"pdop","abstract":"

    The 3D positional dilution of precision.

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)hdop":{"name":"hdop","abstract":"

    The horizontal dilution of precision

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)vdop":{"name":"vdop","abstract":"

    the vertical dilution of precision

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)actual":{"name":"actual","abstract":"

    What the coordinates are based on

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)satellites":{"name":"satellites","abstract":"

    The number of satellites in view

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)dimension":{"name":"dimension","abstract":"

    The supported dimensions of the GPS

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)altitude":{"name":"altitude","abstract":"

    Altitude in meters

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)heading":{"name":"heading","abstract":"

    Heading based on the GPS data.

    ","parent_name":"SDLGPSData"},"Classes/SDLGPSData.html#/c:objc(cs)SDLGPSData(py)speed":{"name":"speed","abstract":"

    Speed in KPH

    ","parent_name":"SDLGPSData"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(cm)sharedInstance":{"name":"+sharedInstance","abstract":"

    Undocumented

    ","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionNameForId:":{"name":"-functionNameForId:","abstract":"

    Undocumented

    ","parent_name":"SDLFunctionID"},"Classes/SDLFunctionID.html#/c:objc(cs)SDLFunctionID(im)functionIdForName:":{"name":"-functionIdForName:","abstract":"

    Undocumented

    ","parent_name":"SDLFunctionID"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)type":{"name":"type","abstract":"

    The vehicle’s fuel type

    ","parent_name":"SDLFuelRange"},"Classes/SDLFuelRange.html#/c:objc(cs)SDLFuelRange(py)range":{"name":"range","abstract":"

    The estimate range in KM the vehicle can travel based on fuel level and consumption.

    ","parent_name":"SDLFuelRange"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)artworkRetryCount":{"name":"artworkRetryCount","abstract":"

    Defines the number of times the file manager will attempt to reupload SDLArtwork files in the event of a failed upload to Core.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(py)fileRetryCount":{"name":"fileRetryCount","abstract":"

    Defines the number of times the file manager will attempt to reupload general SDLFiles in the event of a failed upload to Core.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(cm)defaultConfiguration":{"name":"+defaultConfiguration","abstract":"

    Creates a default file manager configuration.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)init":{"name":"-init","abstract":"

    Use defaultConfiguration instead

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManagerConfiguration.html#/c:objc(cs)SDLFileManagerConfiguration(im)initWithArtworkRetryCount:fileRetryCount:":{"name":"-initWithArtworkRetryCount:fileRetryCount:","abstract":"

    Creates a file manager configuration with customized upload retry counts.

    ","parent_name":"SDLFileManagerConfiguration"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)remoteFileNames":{"name":"remoteFileNames","abstract":"

    A set of all names of files known on the remote head unit. Known files can be used or deleted on the remote system.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)bytesAvailable":{"name":"bytesAvailable","abstract":"

    The number of bytes still available for files for this app.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)currentState":{"name":"currentState","abstract":"

    The state of the file manager.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)pendingTransactions":{"name":"pendingTransactions","abstract":"

    The currently pending transactions (Upload, Delete, and List Files) in the file manager

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(py)suspended":{"name":"suspended","abstract":"

    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.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)init":{"name":"-init","abstract":"

    Initialize the class…or not, since this method is unavailable. Dependencies must be injected using initWithConnectionManager:

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:":{"name":"-initWithConnectionManager:","abstract":"

    Creates a new file manager with a specified connection manager

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)initWithConnectionManager:configuration:":{"name":"-initWithConnectionManager:configuration:","abstract":"

    Creates a new file manager with a specified connection manager and configuration

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)startWithCompletionHandler:":{"name":"-startWithCompletionHandler:","abstract":"

    The manager stars up and attempts to fetch its initial list and transfer initial files.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)stop":{"name":"-stop","abstract":"

    Cancels all file manager operations and deletes all associated data.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)hasUploadedFile:":{"name":"-hasUploadedFile:","abstract":"

    Check if the remote system contains a file

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFileWithName:completionHandler:":{"name":"-deleteRemoteFileWithName:completionHandler:","abstract":"

    Delete a file stored on the remote system

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)deleteRemoteFilesWithNames:completionHandler:":{"name":"-deleteRemoteFilesWithNames:completionHandler:","abstract":"

    Deletes an array of files on the remote file system. The files are deleted in the order in which they are added to the array, with the first file to be deleted at index 0. The delete queue is sequential, meaning that once a delete request is sent to Core, the queue waits until a response is received from Core before the next the next delete request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFile:completionHandler:":{"name":"-uploadFile:completionHandler:","abstract":"

    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.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:progressHandler:completionHandler:":{"name":"-uploadFiles:progressHandler:completionHandler:","abstract":"

    Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadFiles:completionHandler:":{"name":"-uploadFiles:completionHandler:","abstract":"

    Uploads an array of files to the remote file system. The files will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtwork:completionHandler:":{"name":"-uploadArtwork:completionHandler:","abstract":"

    Uploads an artwork file to the remote file system and returns the name of the uploaded artwork once completed. If an artwork with the same name is already on the remote system, the artwork is not uploaded and the artwork name is simply returned.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:completionHandler:":{"name":"-uploadArtworks:completionHandler:","abstract":"

    Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(im)uploadArtworks:progressHandler:completionHandler:":{"name":"-uploadArtworks:progressHandler:completionHandler:","abstract":"

    Uploads an array of artworks to the remote file system. The artworks will be uploaded in the order in which they are added to the array, with the first file to be uploaded at index 0. The upload queue is sequential, meaning that once a upload request is sent to Core, the queue waits until a response is received from Core before the next the next upload request is sent.

    ","parent_name":"SDLFileManager"},"Classes/SDLFileManager.html#/c:objc(cs)SDLFileManager(cm)temporaryFileDirectory":{"name":"+temporaryFileDirectory","abstract":"

    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.

    ","parent_name":"SDLFileManager"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)persistent":{"name":"persistent","abstract":"

    Whether or not the file should persist on disk between car ignition cycles.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)overwrite":{"name":"overwrite","abstract":"

    Whether or not the file should overwrite an existing file on the remote disk with the same name.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)name":{"name":"name","abstract":"

    The name the file should be stored under on the remote disk. This is how the file will be referenced in all later calls.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileURL":{"name":"fileURL","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)data":{"name":"data","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileSize":{"name":"fileSize","abstract":"

    The size of the binary data of the SDLFile.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)fileType":{"name":"fileType","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)inputStream":{"name":"inputStream","abstract":"

    A stream to pull binary data from a SDLFile. The stream only pulls required data from the file on disk or in memory. This reduces memory usage while uploading a large file to the remote system as each chunk of data can be released immediately after it is uploaded.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(py)isStaticIcon":{"name":"isStaticIcon","abstract":"

    Describes whether or not this file is represented by static icon data. The head unit will present its representation of the static icon concept when sent this data.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)init":{"name":"-init","abstract":"

    Undocumented

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithFileURL:name:persistent:":{"name":"-initWithFileURL:name:persistent:","abstract":"

    The designated initializer for an SDL File. The only major property that is not set using this is overwrite, which defaults to NO.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileAtFileURL:name:":{"name":"+persistentFileAtFileURL:name:","abstract":"

    Create an SDL file using a local file URL.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileAtFileURL:name:":{"name":"+fileAtFileURL:name:","abstract":"

    Create an SDL file using a local file URL.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(im)initWithData:name:fileExtension:persistent:":{"name":"-initWithData:name:fileExtension:persistent:","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)persistentFileWithData:name:fileExtension:":{"name":"+persistentFileWithData:name:fileExtension:","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLFile.html#/c:objc(cs)SDLFile(cm)fileWithData:name:fileExtension:":{"name":"+fileWithData:name:fileExtension:","abstract":"

    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.

    ","parent_name":"SDLFile"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(im)initWithChannelId:channelSetting:":{"name":"-initWithChannelId:channelSetting:","abstract":"

    Undocumented

    ","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelName":{"name":"channelName","abstract":"

    @abstract Read-only channel / frequency name","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelSetting":{"name":"channelSetting","abstract":"

    @abstract Reflects the setting, from 0%-100%.

    ","parent_name":"SDLEqualizerSettings"},"Classes/SDLEqualizerSettings.html#/c:objc(cs)SDLEqualizerSettings(py)channelId":{"name":"channelId","abstract":"

    @abstract id of the channel.

    ","parent_name":"SDLEqualizerSettings"},"Classes/SDLEncodedSyncPData.html#/c:objc(cs)SDLEncodedSyncPData(py)data":{"name":"data","abstract":"

    Contains base64 encoded string of SyncP packets.

    ","parent_name":"SDLEncodedSyncPData"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)emergencyEventType":{"name":"emergencyEventType","abstract":"

    References signal VedsEvntType_D_Ltchd. See EmergencyEventType.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)fuelCutoffStatus":{"name":"fuelCutoffStatus","abstract":"

    References signal RCM_FuelCutoff. See FuelCutoffStatus.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)rolloverEvent":{"name":"rolloverEvent","abstract":"

    References signal VedsEvntRoll_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)maximumChangeVelocity":{"name":"maximumChangeVelocity","abstract":"

    References signal VedsMaxDeltaV_D_Ltchd. Change in velocity in KPH.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLEmergencyEvent.html#/c:objc(cs)SDLEmergencyEvent(py)multipleEvents":{"name":"multipleEvents","abstract":"

    References signal VedsMultiEvnt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLEmergencyEvent"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallNotificationStatus":{"name":"eCallNotificationStatus","abstract":"

    References signal eCallNotification_4A. See VehicleDataNotificationStatus.

    ","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)auxECallNotificationStatus":{"name":"auxECallNotificationStatus","abstract":"

    References signal eCallNotification. See VehicleDataNotificationStatus.

    ","parent_name":"SDLECallInfo"},"Classes/SDLECallInfo.html#/c:objc(cs)SDLECallInfo(py)eCallConfirmationStatus":{"name":"eCallConfirmationStatus","abstract":"

    References signal eCallConfirmation. See ECallConfirmationStatus.

    ","parent_name":"SDLECallInfo"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayType":{"name":"displayType","abstract":"

    The type of display

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)displayName":{"name":"displayName","abstract":"

    The name of the connected display

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)textFields":{"name":"textFields","abstract":"

    An array of SDLTextField structures, each of which describes a field in the HMI which the application can write to using operations such as SDLShow, SDLSetMediaClockTimer, etc.

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)imageFields":{"name":"imageFields","abstract":"

    An array of SDLImageField elements

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)mediaClockFormats":{"name":"mediaClockFormats","abstract":"

    An array of SDLMediaClockFormat elements, defining the valid string formats used in specifying the contents of the media clock field

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)graphicSupported":{"name":"graphicSupported","abstract":"

    The display’s persistent screen supports.

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)templatesAvailable":{"name":"templatesAvailable","abstract":"

    Number of presets the screen supports

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)screenParams":{"name":"screenParams","abstract":"

    A set of all parameters related to a prescribed screen area (e.g. for video / touch input)

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDisplayCapabilities.html#/c:objc(cs)SDLDisplayCapabilities(py)numCustomPresetsAvailable":{"name":"numCustomPresetsAvailable","abstract":"

    The number of on-screen custom presets available (if any); otherwise omitted

    ","parent_name":"SDLDisplayCapabilities"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(im)initWithNumber:":{"name":"-initWithNumber:","abstract":"

    Undocumented

    ","parent_name":"SDLDialNumber"},"Classes/SDLDialNumber.html#/c:objc(cs)SDLDialNumber(py)number":{"name":"number","abstract":"

    Up to 40 character string representing the phone number. All characters stripped except for ‘0’-‘9’, ‘*’, ‘#’, ‘,’, ‘;’, and ‘+’

    ","parent_name":"SDLDialNumber"},"Classes/SDLDiagnosticMessageResponse.html#/c:objc(cs)SDLDiagnosticMessageResponse(py)messageDataResult":{"name":"messageDataResult","abstract":"

    Array of bytes comprising CAN message result.

    ","parent_name":"SDLDiagnosticMessageResponse"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(im)initWithTargetId:length:data:":{"name":"-initWithTargetId:length:data:","abstract":"

    Undocumented

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)targetID":{"name":"targetID","abstract":"

    Name of target ECU

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageLength":{"name":"messageLength","abstract":"

    Length of message (in bytes)

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDiagnosticMessage.html#/c:objc(cs)SDLDiagnosticMessage(py)messageData":{"name":"messageData","abstract":"

    Array of bytes comprising CAN message.

    ","parent_name":"SDLDiagnosticMessage"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)voiceRecOn":{"name":"voiceRecOn","abstract":"

    Indicates whether the voice recognition is on or off

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)btIconOn":{"name":"btIconOn","abstract":"

    Indicates whether the bluetooth connection established

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)callActive":{"name":"callActive","abstract":"

    Indicates whether a call is being active

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)phoneRoaming":{"name":"phoneRoaming","abstract":"

    Indicates whether the phone is in roaming mode

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)textMsgAvailable":{"name":"textMsgAvailable","abstract":"

    Indicates whether a textmessage is available

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)battLevelStatus":{"name":"battLevelStatus","abstract":"

    Battery level status

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)stereoAudioOutputMuted":{"name":"stereoAudioOutputMuted","abstract":"

    The status of the stereo audio output channel

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)monoAudioOutputMuted":{"name":"monoAudioOutputMuted","abstract":"

    The status of the mono audio output channel

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)signalLevelStatus":{"name":"signalLevelStatus","abstract":"

    Signal level status

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)primaryAudioSource":{"name":"primaryAudioSource","abstract":"

    The current primary audio source of SDL (if selected).

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceStatus.html#/c:objc(cs)SDLDeviceStatus(py)eCallEventActive":{"name":"eCallEventActive","abstract":"

    Indicates if an emergency call is active

    ","parent_name":"SDLDeviceStatus"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(cm)currentDevice":{"name":"+currentDevice","abstract":"

    Undocumented

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)hardware":{"name":"hardware","abstract":"

    Device model

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)firmwareRev":{"name":"firmwareRev","abstract":"

    Device firmware version

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)os":{"name":"os","abstract":"

    Device OS

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)osVersion":{"name":"osVersion","abstract":"

    Device OS version

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)carrier":{"name":"carrier","abstract":"

    Device mobile carrier

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeviceInfo.html#/c:objc(cs)SDLDeviceInfo(py)maxNumberRFCOMMPorts":{"name":"maxNumberRFCOMMPorts","abstract":"

    Number of bluetooth RFCOMM ports available.

    ","parent_name":"SDLDeviceInfo"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(im)initWithId:":{"name":"-initWithId:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteSubMenu.html#/c:objc(cs)SDLDeleteSubMenu(py)menuID":{"name":"menuID","abstract":"

    the MenuID that identifies the SDLSubMenu to be delete","parent_name":"SDLDeleteSubMenu"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(im)initWithId:":{"name":"-initWithId:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteInteractionChoiceSet.html#/c:objc(cs)SDLDeleteInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"

    a unique ID that identifies the Choice Set","parent_name":"SDLDeleteInteractionChoiceSet"},"Classes/SDLDeleteFileResponse.html#/c:objc(cs)SDLDeleteFileResponse(py)spaceAvailable":{"name":"spaceAvailable","abstract":"

    The remaining available space for your application to store data on the remote system.

    ","parent_name":"SDLDeleteFileResponse"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(im)initWithFileName:":{"name":"-initWithFileName:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteFile.html#/c:objc(cs)SDLDeleteFile(py)syncFileName":{"name":"syncFileName","abstract":"

    a file reference name","parent_name":"SDLDeleteFile"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(im)initWithId:":{"name":"-initWithId:","abstract":"

    Undocumented

    ","parent_name":"SDLDeleteCommand"},"Classes/SDLDeleteCommand.html#/c:objc(cs)SDLDeleteCommand(py)cmdID":{"name":"cmdID","abstract":"

    the Command ID that identifies the Command to be deleted from Command Menu","parent_name":"SDLDeleteCommand"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:":{"name":"-initWithHour:minute:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:":{"name":"-initWithHour:minute:second:millisecond:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(im)initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:":{"name":"-initWithHour:minute:second:millisecond:day:month:year:timezoneMinuteOffset:timezoneHourOffset:","abstract":"

    Undocumented

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)millisecond":{"name":"millisecond","abstract":"

    Milliseconds part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)second":{"name":"second","abstract":"

    Seconds part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)minute":{"name":"minute","abstract":"

    Minutes part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)hour":{"name":"hour","abstract":"

    Hour part of time

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)day":{"name":"day","abstract":"

    Day of the month

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)month":{"name":"month","abstract":"

    Month of the year

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)year":{"name":"year","abstract":"

    The year in YYYY format

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneMinuteOffset":{"name":"timezoneMinuteOffset","abstract":"

    Time zone offset in Min with regard to UTC

    ","parent_name":"SDLDateTime"},"Classes/SDLDateTime.html#/c:objc(cs)SDLDateTime(py)timezoneHourOffset":{"name":"timezoneHourOffset","abstract":"

    Time zone offset in Hours with regard to UTC

    ","parent_name":"SDLDateTime"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)resultCode":{"name":"resultCode","abstract":"

    Individual DID result code.

    ","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)didLocation":{"name":"didLocation","abstract":"

    Location of raw data from vehicle data DID

    ","parent_name":"SDLDIDResult"},"Classes/SDLDIDResult.html#/c:objc(cs)SDLDIDResult(py)data":{"name":"data","abstract":"

    Raw DID-based data returned for requested element.

    ","parent_name":"SDLDIDResult"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(im)initWithId:choiceSet:":{"name":"-initWithId:choiceSet:","abstract":"

    Undocumented

    ","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)interactionChoiceSetID":{"name":"interactionChoiceSetID","abstract":"

    A unique ID that identifies the Choice Set

    ","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLCreateInteractionChoiceSet.html#/c:objc(cs)SDLCreateInteractionChoiceSet(py)choiceSet":{"name":"choiceSet","abstract":"

    Array of choices, which the user can select by menu or voice recognition

    ","parent_name":"SDLCreateInteractionChoiceSet"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lifecycleConfig":{"name":"lifecycleConfig","abstract":"

    The lifecycle configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)lockScreenConfig":{"name":"lockScreenConfig","abstract":"

    The lock screen configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)loggingConfig":{"name":"loggingConfig","abstract":"

    The log configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)streamingMediaConfig":{"name":"streamingMediaConfig","abstract":"

    The streaming media configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(py)fileManagerConfig":{"name":"fileManagerConfig","abstract":"

    The file manager configuration.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:":{"name":"-initWithLifecycle:lockScreen:logging:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:":{"name":"+configurationWithLifecycle:lockScreen:logging:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen and logging configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(im)initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"-initWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging and streaming media configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLConfiguration.html#/c:objc(cs)SDLConfiguration(cm)configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:":{"name":"+configurationWithLifecycle:lockScreen:logging:streamingMedia:fileManager:","abstract":"

    Creates a new configuration to be passed to the SDLManager with custom lifecycle, lock screen, logging, streaming media and file manager configurations.

    ","parent_name":"SDLConfiguration"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeActive":{"name":"powerModeActive","abstract":"

    References signal PowerMode_UB.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeQualificationStatus":{"name":"powerModeQualificationStatus","abstract":"

    References signal PowerModeQF. See PowerModeQualificationStatus.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)carModeStatus":{"name":"carModeStatus","abstract":"

    References signal CarMode. See CarMode.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLClusterModeStatus.html#/c:objc(cs)SDLClusterModeStatus(py)powerModeStatus":{"name":"powerModeStatus","abstract":"

    References signal PowerMode. See PowerMode.

    ","parent_name":"SDLClusterModeStatus"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:":{"name":"-initWithAppID:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(im)initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:":{"name":"-initWithAppID:nicknames:enabled:authToken:cloudTransportType:hybridAppPreference:endpoint:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)nicknames":{"name":"nicknames","abstract":"

    An array of app names a cloud app is allowed to register with. If included in a SetCloudAppProperties request, this value will overwrite the existing nicknames field in the app policies section of the policy table.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)appID":{"name":"appID","abstract":"

    The id of the cloud app.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)enabled":{"name":"enabled","abstract":"

    If true, the cloud app will appear in the HMI’s app list; if false, the cloud app will not appear in the HMI’s app list.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)authToken":{"name":"authToken","abstract":"

    Used to authenticate websocket connection on app activation.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)cloudTransportType":{"name":"cloudTransportType","abstract":"

    Specifies the connection type Core should use. Currently the ones that work in SDL Core are WS or WSS, but an OEM can implement their own transport adapter to handle different values.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)hybridAppPreference":{"name":"hybridAppPreference","abstract":"

    Specifies the user preference to use the cloud app version or mobile app version when both are available.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLCloudAppProperties.html#/c:objc(cs)SDLCloudAppProperties(py)endpoint":{"name":"endpoint","abstract":"

    The websocket endpoint.

    ","parent_name":"SDLCloudAppProperties"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(im)initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:":{"name":"-initWithFanSpeed:desiredTemperature:acEnable:circulateAirEnable:autoModeEnable:defrostZone:dualModeEnable:acMaxEnable:ventilationMode:heatedSteeringWheelEnable:heatedWindshieldEnable:heatedRearWindowEnable:heatedMirrorsEnable:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)fanSpeed":{"name":"fanSpeed","abstract":"

    Speed of Fan in integer

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)currentTemperature":{"name":"currentTemperature","abstract":"

    The Current Temperature in SDLTemperature

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)desiredTemperature":{"name":"desiredTemperature","abstract":"

    Desired Temperature in SDLTemperature

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acEnable":{"name":"acEnable","abstract":"

    Represents if AC is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)circulateAirEnable":{"name":"circulateAirEnable","abstract":"

    Represents if circulation of air is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)autoModeEnable":{"name":"autoModeEnable","abstract":"

    Represents if auto mode is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)defrostZone":{"name":"defrostZone","abstract":"

    Represents the kind of defrost zone

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)dualModeEnable":{"name":"dualModeEnable","abstract":"

    Represents if dual mode is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)acMaxEnable":{"name":"acMaxEnable","abstract":"

    Represents if ac max is enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)ventilationMode":{"name":"ventilationMode","abstract":"

    Represents the kind of Ventilation zone

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedSteeringWheelEnable":{"name":"heatedSteeringWheelEnable","abstract":"

    @abstract value false means disabled/turn off, value true means enabled/turn on.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedWindshieldEnable":{"name":"heatedWindshieldEnable","abstract":"

    @abstract value false means disabled, value true means enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedRearWindowEnable":{"name":"heatedRearWindowEnable","abstract":"

    @abstract value false means disabled, value true means enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlData.html#/c:objc(cs)SDLClimateControlData(py)heatedMirrorsEnable":{"name":"heatedMirrorsEnable","abstract":"

    @abstract Value false means disabled, value true means enabled.

    ","parent_name":"SDLClimateControlData"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(im)initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:":{"name":"-initWithModuleName:fanSpeedAvailable:desiredTemperatureAvailable:acEnableAvailable:acMaxEnableAvailable:circulateAirAvailable:autoModeEnableAvailable:dualModeEnableAvailable:defrostZoneAvailable:ventilationModeAvailable:heatedSteeringWheelAvailable:heatedWindshieldAvailable:heatedRearWindowAvailable:heatedMirrorsAvailable:","abstract":"

    Undocumented

    ","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)moduleName":{"name":"moduleName","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)fanSpeedAvailable":{"name":"fanSpeedAvailable","abstract":"

    Availability of the control of fan speed.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)desiredTemperatureAvailable":{"name":"desiredTemperatureAvailable","abstract":"

    Availability of the control of desired temperature.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acEnableAvailable":{"name":"acEnableAvailable","abstract":"

    Availability of the control of turn on/off AC.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)acMaxEnableAvailable":{"name":"acMaxEnableAvailable","abstract":"

    Availability of the control of enable/disable air conditioning is ON on the maximum level.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)circulateAirEnableAvailable":{"name":"circulateAirEnableAvailable","abstract":"

    Availability of the control of enable/disable circulate Air mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)autoModeEnableAvailable":{"name":"autoModeEnableAvailable","abstract":"

    Availability of the control of enable/disable auto mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)dualModeEnableAvailable":{"name":"dualModeEnableAvailable","abstract":"

    Availability of the control of enable/disable dual mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZoneAvailable":{"name":"defrostZoneAvailable","abstract":"

    Availability of the control of defrost zones.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)defrostZone":{"name":"defrostZone","abstract":"

    A set of all defrost zones that are controllable.

    ","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationModeAvailable":{"name":"ventilationModeAvailable","abstract":"

    Availability of the control of air ventilation mode.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)ventilationMode":{"name":"ventilationMode","abstract":"

    A set of all ventilation modes that are controllable.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedSteeringWheelAvailable":{"name":"heatedSteeringWheelAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Steering Wheel.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedWindshieldAvailable":{"name":"heatedWindshieldAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Windshield.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedRearWindowAvailable":{"name":"heatedRearWindowAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Rear Window.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLClimateControlCapabilities.html#/c:objc(cs)SDLClimateControlCapabilities(py)heatedMirrorsAvailable":{"name":"heatedMirrorsAvailable","abstract":"

    @abstract Availability of the control (enable/disable) of heated Mirrors.","parent_name":"SDLClimateControlCapabilities"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultTimeout":{"name":"defaultTimeout","abstract":"

    Set this to change the default timeout for all choice sets. If a timeout is not set on an individual choice set object (or if it is set to 0.0), then it will use this timeout instead. See timeout for more details. If this is not set by you, it will default to 10 seconds.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(cpy)defaultLayout":{"name":"defaultLayout","abstract":"

    Set this to change the default layout for all choice sets. If a layout is not set on an individual choice set object, then it will use this layout instead. See layout for more details. If this is not set by you, it will default to SDLChoiceSetLayoutList.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)title":{"name":"title","abstract":"

    Maps to PerformInteraction.initialText. The title of the choice set, and/or the initial text on a keyboard prompt.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)initialPrompt":{"name":"initialPrompt","abstract":"

    Maps to PerformInteraction.initialPrompt. The initial prompt spoken to the user at the start of an interaction.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)layout":{"name":"layout","abstract":"

    Maps to PerformInteraction.interactionLayout. Whether the presented choices are arranged as a set of tiles or a list.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeout":{"name":"timeout","abstract":"

    Maps to PerformInteraction.timeout. This applies only to a manual selection (not a voice selection, which has its timeout handled by the system). Defaults to defaultTimeout.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)timeoutPrompt":{"name":"timeoutPrompt","abstract":"

    Maps to PerformInteraction.timeoutPrompt. This text is spoken when a VR interaction times out. If this set is presented in a manual (non-voice) only interaction, this will be ignored.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpPrompt":{"name":"helpPrompt","abstract":"

    Maps to PerformInteraction.helpPrompt. This is the spoken string when a user speaks help when the interaction is occurring.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)helpList":{"name":"helpList","abstract":"

    Maps to PerformInteraction.vrHelp. This is a list of help text presented to the user when they are in a voice recognition interaction from your choice set of options. If this set is presented in a touch only interaction, this will be ignored.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)delegate":{"name":"delegate","abstract":"

    The delegate of this choice set, called when the user interacts with it.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(py)choices":{"name":"choices","abstract":"

    The choices to be displayed to the user within this choice set. These choices could match those already preloaded via SDLScreenManager preloadChoices:withCompletionHandler:.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:choices:":{"name":"-initWithTitle:delegate:choices:","abstract":"

    Initialize with a title, delegate, and choices. It will use the default timeout and layout, all other properties (such as prompts) will be nil.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPromptString:timeoutPromptString:helpPromptString:vrHelpList:choices:","abstract":"

    Initializer with all possible properties.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceSet.html#/c:objc(cs)SDLChoiceSet(im)initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:":{"name":"-initWithTitle:delegate:layout:timeout:initialPrompt:timeoutPrompt:helpPrompt:vrHelpList:choices:","abstract":"

    Initializer with all possible properties.

    ","parent_name":"SDLChoiceSet"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)text":{"name":"text","abstract":"

    Maps to Choice.menuName. The primary text of the cell. Duplicates within an SDLChoiceSet are not permitted and will result in the SDLChoiceSet failing to initialize.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryText":{"name":"secondaryText","abstract":"

    Maps to Choice.secondaryText. Optional secondary text of the cell, if available. Duplicates within an SDLChoiceSet are permitted.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)tertiaryText":{"name":"tertiaryText","abstract":"

    Maps to Choice.tertiaryText. Optional tertitary text of the cell, if available. Duplicates within an SDLChoiceSet are permitted.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)voiceCommands":{"name":"voiceCommands","abstract":"

    Maps to Choice.vrCommands. Optional voice commands the user can speak to activate the cell. If not set and the head unit requires it, this will be set to the number in the list that this item appears. However, this would be a very poor experience for a user if the choice set is presented as a voice only interaction or both interaction mode. Therefore, consider not setting this only when you know the choice set will be presented as a touch only interaction.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)artwork":{"name":"artwork","abstract":"

    Maps to Choice.image. Optional image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(py)secondaryArtwork":{"name":"secondaryArtwork","abstract":"

    Maps to Choice.secondaryImage. Optional secondary image for the cell. This will be uploaded before the cell is used when the cell is preloaded or presented for the first time.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)init":{"name":"-init","abstract":"

    Initialize the cell with nothing. This is unavailable

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:":{"name":"-initWithText:","abstract":"

    Initialize the cell with text and nothing else.

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:artwork:voiceCommands:":{"name":"-initWithText:artwork:voiceCommands:","abstract":"

    Initialize the cell with text, optional artwork, and optional voice commands

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoiceCell.html#/c:objc(cs)SDLChoiceCell(im)initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:":{"name":"-initWithText:secondaryText:tertiaryText:voiceCommands:artwork:secondaryArtwork:","abstract":"

    Initialize the cell with all optional items

    ","parent_name":"SDLChoiceCell"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:":{"name":"-initWithId:menuName:vrCommands:","abstract":"

    Undocumented

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(im)initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:":{"name":"-initWithId:menuName:vrCommands:image:secondaryText:secondaryImage:tertiaryText:","abstract":"

    Undocumented

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)choiceID":{"name":"choiceID","abstract":"

    The application-scoped identifier that uniquely identifies this choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)menuName":{"name":"menuName","abstract":"

    Text which appears in menu, representing this choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)vrCommands":{"name":"vrCommands","abstract":"

    VR synonyms for this choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)image":{"name":"image","abstract":"

    The image of the choice

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryText":{"name":"secondaryText","abstract":"

    Secondary text to display; e.g. address of POI in a search result entry

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)tertiaryText":{"name":"tertiaryText","abstract":"

    Tertiary text to display; e.g. distance to POI for a search result entry

    ","parent_name":"SDLChoice"},"Classes/SDLChoice.html#/c:objc(cs)SDLChoice(py)secondaryImage":{"name":"secondaryImage","abstract":"

    Secondary image for choice

    ","parent_name":"SDLChoice"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:":{"name":"-initWithLanguage:hmiDisplayLanguage:","abstract":"

    Undocumented

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(im)initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:":{"name":"-initWithLanguage:hmiDisplayLanguage:appName:ttsName:ngnMediaScreenAppName:vrSynonyms:","abstract":"

    Undocumented

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)language":{"name":"language","abstract":"

    The language the app wants to change to

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)hmiDisplayLanguage":{"name":"hmiDisplayLanguage","abstract":"

    HMI display language

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)appName":{"name":"appName","abstract":"

    Request a new app name registration

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ttsName":{"name":"ttsName","abstract":"

    Request a new TTSName registration.

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)ngnMediaScreenAppName":{"name":"ngnMediaScreenAppName","abstract":"

    Request a new app short name registration

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLChangeRegistration.html#/c:objc(cs)SDLChangeRegistration(py)vrSynonyms":{"name":"vrSynonyms","abstract":"

    Request a new VR synonyms registration

    ","parent_name":"SDLChangeRegistration"},"Classes/SDLCarWindowViewController.html#/c:objc(cs)SDLCarWindowViewController(py)supportedOrientation":{"name":"supportedOrientation","abstract":"

    The supported interface orientation you wish to use. Defaults to MaskPortrait.

    ","parent_name":"SDLCarWindowViewController"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(im)initWithButtonName:moduleType:":{"name":"-initWithButtonName:moduleType:","abstract":"

    Undocumented

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)moduleType":{"name":"moduleType","abstract":"

    The module where the button should be pressed.

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonName":{"name":"buttonName","abstract":"

    The name of supported RC climate or radio button.

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonPress.html#/c:objc(cs)SDLButtonPress(py)buttonPressMode":{"name":"buttonPressMode","abstract":"

    Indicates whether this is a LONG or SHORT button press event.

    ","parent_name":"SDLButtonPress"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)name":{"name":"name","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)shortPressAvailable":{"name":"shortPressAvailable","abstract":"

    A NSNumber value indicates whether the button supports a SHORT press

    ","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)longPressAvailable":{"name":"longPressAvailable","abstract":"

    A NSNumber value indicates whether the button supports a LONG press

    ","parent_name":"SDLButtonCapabilities"},"Classes/SDLButtonCapabilities.html#/c:objc(cs)SDLButtonCapabilities(py)upDownAvailable":{"name":"upDownAvailable","abstract":"

    A NSNumber value indicates whether the button supports button down and button up

    ","parent_name":"SDLButtonCapabilities"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)parkBrakeActive":{"name":"parkBrakeActive","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStableStatus":{"name":"ignitionStableStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)ignitionStatus":{"name":"ignitionStatus","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)driverDoorAjar":{"name":"driverDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)passengerDoorAjar":{"name":"passengerDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearLeftDoorAjar":{"name":"rearLeftDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBodyInformation.html#/c:objc(cs)SDLBodyInformation(py)rearRightDoorAjar":{"name":"rearRightDoorAjar","parent_name":"SDLBodyInformation"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBeltDeployed":{"name":"driverBeltDeployed","abstract":"

    References signal VedsDrvBelt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBeltDeployed":{"name":"passengerBeltDeployed","abstract":"

    References signal VedsPasBelt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerBuckleBelted":{"name":"passengerBuckleBelted","abstract":"

    References signal VedsRw1PasBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)driverBuckleBelted":{"name":"driverBuckleBelted","abstract":"

    References signal VedsRw1DrvBckl_D_Ltchd. See VehicleDataEventStatus

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow2BuckleBelted":{"name":"leftRow2BuckleBelted","abstract":"

    References signal VedsRw2lBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)passengerChildDetected":{"name":"passengerChildDetected","abstract":"

    References signal VedsRw1PasChld_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow2BuckleBelted":{"name":"rightRow2BuckleBelted","abstract":"

    References signal VedsRw2rBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow2BuckleBelted":{"name":"middleRow2BuckleBelted","abstract":"

    References signal VedsRw2mBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow3BuckleBelted":{"name":"middleRow3BuckleBelted","abstract":"

    References signal VedsRw3mBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRow3BuckleBelted":{"name":"leftRow3BuckleBelted","abstract":"

    References signal VedsRw3lBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRow3BuckleBelted":{"name":"rightRow3BuckleBelted","abstract":"

    References signal VedsRw3rBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)leftRearInflatableBelted":{"name":"leftRearInflatableBelted","abstract":"

    References signal VedsRw2lRib_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)rightRearInflatableBelted":{"name":"rightRearInflatableBelted","abstract":"

    References signal VedsRw2rRib_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BeltDeployed":{"name":"middleRow1BeltDeployed","abstract":"

    References signal VedsRw1mBelt_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLBeltStatus.html#/c:objc(cs)SDLBeltStatus(py)middleRow1BuckleBelted":{"name":"middleRow1BuckleBelted","abstract":"

    References signal VedsRw1mBckl_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLBeltStatus"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)delegate":{"name":"delegate","abstract":"

    The delegate describing when files are done playing or any errors that occur

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)playing":{"name":"playing","abstract":"

    Whether or not we are currently playing audio

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(py)queue":{"name":"queue","abstract":"

    The queue of audio files that will be played in sequence

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)init":{"name":"-init","abstract":"

    Init should only occur with dependencies. use initWithManager:

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)initWithManager:":{"name":"-initWithManager:","abstract":"

    Create an audio stream manager with a reference to the parent stream manager.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithFileURL:":{"name":"-pushWithFileURL:","abstract":"

    Push a new file URL onto the queue after converting it into the correct PCM format for streaming binary data. Call playNextWhenReady to start playing the next completed pushed file.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)pushWithData:":{"name":"-pushWithData:","abstract":"

    Push a new audio buffer onto the queue. Call playNextWhenReady to start playing the pushed audio buffer.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)playNextWhenReady":{"name":"-playNextWhenReady","abstract":"

    Play the next item in the queue. If an item is currently playing, it will continue playing and this item will begin playing after it is completed.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioStreamManager.html#/c:objc(cs)SDLAudioStreamManager(im)stop":{"name":"-stop","abstract":"

    Stop playing the queue after the current item completes and clear the queue. If nothing is playing, the queue will be cleared.

    ","parent_name":"SDLAudioStreamManager"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)samplingRate":{"name":"samplingRate","abstract":"

    The sampling rate for AudioPassThru

    ","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)bitsPerSample":{"name":"bitsPerSample","abstract":"

    The sample depth in bit for AudioPassThru

    ","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioPassThruCapabilities.html#/c:objc(cs)SDLAudioPassThruCapabilities(py)audioType":{"name":"audioType","abstract":"

    The audiotype for AudioPassThru

    ","parent_name":"SDLAudioPassThruCapabilities"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)inputFileURL":{"name":"inputFileURL","abstract":"

    If initialized with a file URL, the file URL it came from

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)outputFileURL":{"name":"outputFileURL","abstract":"

    If initialized with a file URL, where the transcoder should produce the transcoded PCM audio file

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)estimatedDuration":{"name":"estimatedDuration","abstract":"

    In seconds. UINT32_MAX if unknown.

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)data":{"name":"data","abstract":"

    The PCM audio data to be transferred and played

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(py)fileSize":{"name":"fileSize","abstract":"

    The size of the PCM audio data in bytes

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithInputFileURL:outputFileURL:estimatedDuration:":{"name":"-initWithInputFileURL:outputFileURL:estimatedDuration:","abstract":"

    Initialize an audio file to be queued and played

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioFile.html#/c:objc(cs)SDLAudioFile(im)initWithData:":{"name":"-initWithData:","abstract":"

    Initialize a buffer of PCM audio data to be queued and played

    ","parent_name":"SDLAudioFile"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(im)initWithSource:keepContext:volume:equalizerSettings:":{"name":"-initWithSource:keepContext:volume:equalizerSettings:","abstract":"

    Constructs a newly allocated SDLAudioControlData object with given parameters

    ","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)source":{"name":"source","abstract":"

    @abstract In a getter response or a notification,","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)keepContext":{"name":"keepContext","abstract":"

    @abstract This parameter shall not be present in any getter responses or notifications.","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)volume":{"name":"volume","abstract":"

    @abstract Reflects the volume of audio, from 0%-100%.

    ","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlData.html#/c:objc(cs)SDLAudioControlData(py)equalizerSettings":{"name":"equalizerSettings","abstract":"

    @abstract Defines the list of supported channels (band) and their current/desired settings on HMI

    ","parent_name":"SDLAudioControlData"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:":{"name":"-initWithModuleName:","abstract":"

    Constructs a newly allocated SDLAudioControlCapabilities object with audio control module name (max 100 chars)

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(im)initWithModuleName:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:":{"name":"-initWithModuleName:sourceAvailable:keepContextAvailable:volumeAvailable:equalizerAvailable:equalizerMaxChannelID:","abstract":"

    Constructs a newly allocated SDLAudioControlCapabilities object with given parameters

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)moduleName":{"name":"moduleName","abstract":"

    @abstract The short friendly name of the audio control module.","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)sourceAvailable":{"name":"sourceAvailable","abstract":"

    @abstract Availability of the control of audio source.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)keepContextAvailable":{"name":"keepContextAvailable","abstract":"

    Availability of the keepContext parameter.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)volumeAvailable":{"name":"volumeAvailable","abstract":"

    @abstract Availability of the control of audio volume.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerAvailable":{"name":"equalizerAvailable","abstract":"

    @abstract Availability of the control of Equalizer Settings.

    ","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLAudioControlCapabilities.html#/c:objc(cs)SDLAudioControlCapabilities(py)equalizerMaxChannelId":{"name":"equalizerMaxChannelId","abstract":"

    @abstract Must be included if equalizerAvailable=true,","parent_name":"SDLAudioControlCapabilities"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)isTemplate":{"name":"isTemplate","abstract":"

    Describes whether or not the image is a template that can be (re)colored by the SDL HMI. To make the artwork a template, set the UIImages rendering mode to UIImageRenderingModeAlwaysTemplate. In order for templates to work successfully, the icon must be one solid color with a clear background. The artwork should be created using the PNG image format.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(py)imageRPC":{"name":"imageRPC","abstract":"

    The Image RPC representing this artwork. Generally for use internally, you should instead pass an artwork to a Screen Manager method.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:name:asImageFormat:":{"name":"+artworkWithImage:name:asImageFormat:","abstract":"

    Convenience helper to create an ephemeral artwork from an image.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithImage:asImageFormat:":{"name":"+artworkWithImage:asImageFormat:","abstract":"

    Convenience helper to create an ephemeral artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image’s data which is created by hashing the data using the MD5 algorithm.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)artworkWithStaticIcon:":{"name":"+artworkWithStaticIcon:","abstract":"

    Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:name:asImageFormat:":{"name":"+persistentArtworkWithImage:name:asImageFormat:","abstract":"

    Convenience helper to create a persistent artwork from an image.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(cm)persistentArtworkWithImage:asImageFormat:":{"name":"+persistentArtworkWithImage:asImageFormat:","abstract":"

    Convenience helper to create a persistent artwork from an image. A unique name will be assigned to the image. This name is a string representation of the image’s data which is created by hashing the data using the MD5 algorithm.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:name:persistent:asImageFormat:":{"name":"-initWithImage:name:persistent:asImageFormat:","abstract":"

    Create a file for transmission to the remote system from a UIImage.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithImage:persistent:asImageFormat:":{"name":"-initWithImage:persistent:asImageFormat:","abstract":"

    Create a file for transmission to the remote system from a UIImage. A unique name will be assigned to the image. This name is a string representation of the image’s data which is created by hashing the data using the MD5 algorithm.

    ","parent_name":"SDLArtwork"},"Classes/SDLArtwork.html#/c:objc(cs)SDLArtwork(im)initWithStaticIcon:":{"name":"-initWithStaticIcon:","abstract":"

    Create an SDLArtwork that represents a static icon. This can only be passed to the screen manager; passing this directly to the file manager will fail.

    ","parent_name":"SDLArtwork"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(im)initWithAppServices:":{"name":"-initWithAppServices:","abstract":"

    Convenience init.

    ","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServicesCapabilities.html#/c:objc(cs)SDLAppServicesCapabilities(py)appServices":{"name":"appServices","abstract":"

    An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item.

    ","parent_name":"SDLAppServicesCapabilities"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(im)initWithServiceID:serviceManifest:servicePublished:serviceActive:":{"name":"-initWithServiceID:serviceManifest:servicePublished:serviceActive:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceID":{"name":"serviceID","abstract":"

    A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceManifest":{"name":"serviceManifest","abstract":"

    Manifest for the service that this record is for.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)servicePublished":{"name":"servicePublished","abstract":"

    If true, the service is published and available. If false, the service has likely just been unpublished, and should be considered unavailable.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceRecord.html#/c:objc(cs)SDLAppServiceRecord(py)serviceActive":{"name":"serviceActive","abstract":"

    If true, the service is the active primary service of the supplied service type. It will receive all potential RPCs that are passed through to that service type. If false, it is not the primary service of the supplied type. See servicePublished for its availability.

    ","parent_name":"SDLAppServiceRecord"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithAppServiceType:":{"name":"-initWithAppServiceType:","abstract":"

    Convenience init for serviceType.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithMediaServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:":{"name":"-initWithMediaServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:","abstract":"

    Convenience init for a media service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithWeatherServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:weatherServiceManifest:":{"name":"-initWithWeatherServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:weatherServiceManifest:","abstract":"

    Convenience init for a weather service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithNavigationServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:navigationServiceManifest:":{"name":"-initWithNavigationServiceName:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:navigationServiceManifest:","abstract":"

    Convenience init for a navigation service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(im)initWithServiceName:serviceType:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:":{"name":"-initWithServiceName:serviceType:serviceIcon:allowAppConsumers:rpcSpecVersion:handledRPCs:mediaServiceManifest:weatherServiceManifest:navigationServiceManifest:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceName":{"name":"serviceName","abstract":"

    Unique name of this service.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceType":{"name":"serviceType","abstract":"

    The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)serviceIcon":{"name":"serviceIcon","abstract":"

    The file name of the icon to be associated with this service. Most likely the same as the appIcon.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)allowAppConsumers":{"name":"allowAppConsumers","abstract":"

    If true, app service consumers beyond the IVI system will be able to access this service. If false, only the IVI system will be able consume the service. If not provided, it is assumed to be false.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)rpcSpecVersion":{"name":"rpcSpecVersion","abstract":"

    This is the max RPC Spec version the app service understands. This is important during the RPC passthrough functionality. If not included, it is assumed the max version of the module is acceptable.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)handledRPCs":{"name":"handledRPCs","abstract":"

    This field contains the Function IDs for the RPCs that this service intends to handle correctly. This means the service will provide meaningful responses. See FunctionID for enum equivalent values. This parameter is an integer to allow for new function IDs to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)mediaServiceManifest":{"name":"mediaServiceManifest","abstract":"

    A media service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)weatherServiceManifest":{"name":"weatherServiceManifest","abstract":"

    A weather service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceManifest.html#/c:objc(cs)SDLAppServiceManifest(py)navigationServiceManifest":{"name":"navigationServiceManifest","abstract":"

    A navigation service manifest.

    ","parent_name":"SDLAppServiceManifest"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:":{"name":"-initWithAppServiceType:serviceId:","abstract":"

    Convenience init for service type and service id.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithMediaServiceData:serviceId:":{"name":"-initWithMediaServiceData:serviceId:","abstract":"

    Convenience init for media service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithWeatherServiceData:serviceId:":{"name":"-initWithWeatherServiceData:serviceId:","abstract":"

    Convenience init for weather service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithNavigationServiceData:serviceId:":{"name":"-initWithNavigationServiceData:serviceId:","abstract":"

    Convenience init for navigation service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(im)initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:":{"name":"-initWithAppServiceType:serviceId:mediaServiceData:weatherServiceData:navigationServiceData:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceType":{"name":"serviceType","abstract":"

    The type of service that is to be offered by this app. See AppServiceType for known enum equivalent types. Parameter is a string to allow for new service types to be used by apps on older versions of SDL Core.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)serviceId":{"name":"serviceId","abstract":"

    A unique ID tied to this specific service record. The ID is supplied by the module that services publish themselves.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)mediaServiceData":{"name":"mediaServiceData","abstract":"

    The media service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)weatherServiceData":{"name":"weatherServiceData","abstract":"

    The weather service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceData.html#/c:objc(cs)SDLAppServiceData(py)navigationServiceData":{"name":"navigationServiceData","abstract":"

    The navigation service data.

    ","parent_name":"SDLAppServiceData"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdatedAppServiceRecord:":{"name":"-initWithUpdatedAppServiceRecord:","abstract":"

    Convenience init for required parameters.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(im)initWithUpdateReason:updatedAppServiceRecord:":{"name":"-initWithUpdateReason:updatedAppServiceRecord:","abstract":"

    Convenience init for all parameters.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updateReason":{"name":"updateReason","abstract":"

    Only included in OnSystemCapbilityUpdated. Update reason for this service record.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppServiceCapability.html#/c:objc(cs)SDLAppServiceCapability(py)updatedAppServiceRecord":{"name":"updatedAppServiceRecord","abstract":"

    Service record for a specific app service provider.

    ","parent_name":"SDLAppServiceCapability"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(cm)currentAppInfo":{"name":"+currentAppInfo","abstract":"

    Undocumented

    ","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appDisplayName":{"name":"appDisplayName","abstract":"

    The name displayed for the mobile application on the mobile device (can differ from the app name set in the initial RAI request).

    ","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appBundleID":{"name":"appBundleID","abstract":"

    The AppBundleID of an iOS application or package name of the Android application. This supports App Launch strategies for each platform.

    ","parent_name":"SDLAppInfo"},"Classes/SDLAppInfo.html#/c:objc(cs)SDLAppInfo(py)appVersion":{"name":"appVersion","abstract":"

    Represents the build version number of this particular mobile app.

    ","parent_name":"SDLAppInfo"},"Classes/SDLAlertResponse.html#/c:objc(cs)SDLAlertResponse(py)tryAgainTime":{"name":"tryAgainTime","abstract":"

    Undocumented

    ","parent_name":"SDLAlertResponse"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTS:softButtons:":{"name":"-initWithTTS:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(im)initWithTTSChunks:softButtons:":{"name":"-initWithTTSChunks:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)ttsChunks":{"name":"ttsChunks","abstract":"

    An array of text chunks.

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlertManeuver.html#/c:objc(cs)SDLAlertManeuver(py)softButtons":{"name":"softButtons","abstract":"

    An arry of soft buttons. If omitted on supported displays, only the system defined Close SoftButton shall be displayed.

    ","parent_name":"SDLAlertManeuver"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:duration:":{"name":"-initWithAlertText1:alertText2:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:":{"name":"-initWithAlertText1:alertText2:alertText3:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithAlertText1:alertText2:alertText3:duration:softButtons:":{"name":"-initWithAlertText1:alertText2:alertText3:duration:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:playTone:":{"name":"-initWithTTS:playTone:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:playTone:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTS:alertText1:alertText2:alertText3:playTone:duration:":{"name":"-initWithTTS:alertText1:alertText2:alertText3:playTone:duration:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:playTone:":{"name":"-initWithTTSChunks:playTone:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(im)initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:":{"name":"-initWithTTSChunks:alertText1:alertText2:alertText3:playTone:duration:softButtons:","abstract":"

    Undocumented

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText1":{"name":"alertText1","abstract":"

    The String to be displayed in the first field of the display during the Alert

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText2":{"name":"alertText2","abstract":"

    The String to be displayed in the second field of the display during the Alert

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)alertText3":{"name":"alertText3","abstract":"

    the String to be displayed in the third field of the display during the Alert","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)ttsChunks":{"name":"ttsChunks","abstract":"

    An array which, taken together, specify what is to be spoken to the user

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)duration":{"name":"duration","abstract":"

    The duration of the displayed portion of the alert, in milliseconds.

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)playTone":{"name":"playTone","abstract":"

    Whether the alert tone should be played before the TTS (if any) is spoken.

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)progressIndicator":{"name":"progressIndicator","abstract":"

    If supported on the given platform, the alert GUI will include some sort of animation indicating that loading of a feature is progressing. e.g. a spinning wheel or hourglass, etc.

    ","parent_name":"SDLAlert"},"Classes/SDLAlert.html#/c:objc(cs)SDLAlert(py)softButtons":{"name":"softButtons","abstract":"

    App defined SoftButtons.

    ","parent_name":"SDLAlert"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverAirbagDeployed":{"name":"driverAirbagDeployed","abstract":"

    References signal VedsDrvBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverSideAirbagDeployed":{"name":"driverSideAirbagDeployed","abstract":"

    References signal VedsDrvSideBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverCurtainAirbagDeployed":{"name":"driverCurtainAirbagDeployed","abstract":"

    References signal VedsDrvCrtnBag_D_Ltchd. See VehicleDataEventStatus

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerAirbagDeployed":{"name":"passengerAirbagDeployed","abstract":"

    References signal VedsPasBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerCurtainAirbagDeployed":{"name":"passengerCurtainAirbagDeployed","abstract":"

    References signal VedsPasCrtnBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)driverKneeAirbagDeployed":{"name":"driverKneeAirbagDeployed","abstract":"

    References signal VedsKneeDrvBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerSideAirbagDeployed":{"name":"passengerSideAirbagDeployed","abstract":"

    References signal VedsPasSideBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAirbagStatus.html#/c:objc(cs)SDLAirbagStatus(py)passengerKneeAirbagDeployed":{"name":"passengerKneeAirbagDeployed","abstract":"

    References signal VedsKneePasBag_D_Ltchd. See VehicleDataEventStatus.

    ","parent_name":"SDLAirbagStatus"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:":{"name":"-initWithId:menuName:","abstract":"

    Undocumented

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:position:":{"name":"-initWithId:menuName:position:","abstract":"

    Undocumented

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(im)initWithId:menuName:menuIcon:position:":{"name":"-initWithId:menuName:menuIcon:position:","abstract":"

    Undocumented

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuID":{"name":"menuID","abstract":"

    a Menu ID that identifies a sub menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)position":{"name":"position","abstract":"

    a position of menu","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuName":{"name":"menuName","abstract":"

    a menuName which is displayed representing this submenu item","parent_name":"SDLAddSubMenu"},"Classes/SDLAddSubMenu.html#/c:objc(cs)SDLAddSubMenu(py)menuIcon":{"name":"menuIcon","abstract":"

    An image that is displayed alongside this submenu item

    ","parent_name":"SDLAddSubMenu"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithHandler:":{"name":"-initWithHandler:","abstract":"

    Constructs a SDLAddCommand with a handler callback when an event occurs.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:handler:":{"name":"-initWithId:vrCommands:handler:","abstract":"

    Convenience init for creating a voice command menu item.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:handler:":{"name":"-initWithId:vrCommands:menuName:handler:","abstract":"

    Convenience init for creating a menu item with text.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:handler:","abstract":"

    Convenience init for creating a menu item with text and a custom icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:iconValue:iconType:iconIsTemplate:handler:","abstract":"

    Convenience init for creating a menu item with text and a custom icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(im)initWithId:vrCommands:menuName:parentId:position:icon:handler:":{"name":"-initWithId:vrCommands:menuName:parentId:position:icon:handler:","abstract":"

    Convenience init for creating a menu item with text and a custom icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)handler":{"name":"handler","abstract":"

    A handler that will let you know when the button you created is subscribed.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdID":{"name":"cmdID","abstract":"

    A unique id that identifies the command.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)menuParams":{"name":"menuParams","abstract":"

    A SDLMenuParams pointer which defines the command and how it is added to the command menu.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)vrCommands":{"name":"vrCommands","abstract":"

    An array of strings to be used as VR synonyms for this command.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html#/c:objc(cs)SDLAddCommand(py)cmdIcon":{"name":"cmdIcon","abstract":"

    Image struct containing a static or dynamic icon.

    ","parent_name":"SDLAddCommand"},"Classes/SDLAddCommand.html":{"name":"SDLAddCommand","abstract":"

    This class will add a command to the application’s Command Menu

    "},"Classes.html#/c:objc(cs)SDLAddCommandResponse":{"name":"SDLAddCommandResponse","abstract":"

    Response to SDLAddCommand

    "},"Classes/SDLAddSubMenu.html":{"name":"SDLAddSubMenu","abstract":"

    Add a SDLSubMenu to the Command Menu"},"Classes.html#/c:objc(cs)SDLAddSubMenuResponse":{"name":"SDLAddSubMenuResponse","abstract":"

    Response to SDLAddSubMenu

    "},"Classes/SDLAirbagStatus.html":{"name":"SDLAirbagStatus","abstract":"

    A vehicle data status struct for airbags

    "},"Classes/SDLAlert.html":{"name":"SDLAlert","abstract":"

    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.

    "},"Classes/SDLAlertManeuver.html":{"name":"SDLAlertManeuver","abstract":"

    Shows a SDLShowConstantTBT message with an optional voice command. This message is shown as an overlay over the display’s base screen.

    "},"Classes.html#/c:objc(cs)SDLAlertManeuverResponse":{"name":"SDLAlertManeuverResponse","abstract":"

    Response to SDLAlertManeuver

    "},"Classes/SDLAlertResponse.html":{"name":"SDLAlertResponse","abstract":"

    Response to SDLAlert

    "},"Classes/SDLAppInfo.html":{"name":"SDLAppInfo","abstract":"

    A struct used in register app interface. Contains detailed information about the registered application.

    "},"Classes/SDLAppServiceCapability.html":{"name":"SDLAppServiceCapability","abstract":"

    Undocumented

    "},"Classes/SDLAppServiceData.html":{"name":"SDLAppServiceData","abstract":"

    Undocumented

    "},"Classes/SDLAppServiceManifest.html":{"name":"SDLAppServiceManifest","abstract":"

    This manifest contains all the information necessary for the service to be published, activated, and allow consumers to interact with it

    "},"Classes/SDLAppServiceRecord.html":{"name":"SDLAppServiceRecord","abstract":"

    Undocumented

    "},"Classes/SDLAppServicesCapabilities.html":{"name":"SDLAppServicesCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLArtwork.html":{"name":"SDLArtwork","abstract":"

    Undocumented

    "},"Classes/SDLAudioControlCapabilities.html":{"name":"SDLAudioControlCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLAudioControlData.html":{"name":"SDLAudioControlData","abstract":"

    Undocumented

    "},"Classes/SDLAudioFile.html":{"name":"SDLAudioFile","abstract":"

    Undocumented

    "},"Classes/SDLAudioPassThruCapabilities.html":{"name":"SDLAudioPassThruCapabilities","abstract":"

    Describes different audio type configurations for SDLPerformAudioPassThru, e.g. {8kHz,8-bit,PCM}

    "},"Classes/SDLAudioStreamManager.html":{"name":"SDLAudioStreamManager","abstract":"

    Undocumented

    "},"Classes/SDLBeltStatus.html":{"name":"SDLBeltStatus","abstract":"

    Vehicle data struct for the seat belt status

    "},"Classes/SDLBodyInformation.html":{"name":"SDLBodyInformation","abstract":"

    The body information including power modes.

    "},"Classes/SDLButtonCapabilities.html":{"name":"SDLButtonCapabilities","abstract":"

    Provides information about the capabilities of a SDL HMI button.

    "},"Classes/SDLButtonPress.html":{"name":"SDLButtonPress","abstract":"

    This RPC allows a remote control type mobile application to simulate a hardware button press event.

    "},"Classes.html#/c:objc(cs)SDLButtonPressResponse":{"name":"SDLButtonPressResponse","abstract":"

    Response to SDLButtonPress

    "},"Classes/SDLCarWindowViewController.html":{"name":"SDLCarWindowViewController","abstract":"

    Note that if this is embedded in a UINavigationController and UITabBarController, it will not lock orientation. You must lock your container controller to a specific orientation.

    "},"Classes/SDLChangeRegistration.html":{"name":"SDLChangeRegistration","abstract":"

    If the app recognizes during the app registration that the SDL HMI language (voice/TTS and/or display) does not match the app language, the app will be able (but does not need) to change this registration with changeRegistration prior to app being brought into focus.

    "},"Classes.html#/c:objc(cs)SDLChangeRegistrationResponse":{"name":"SDLChangeRegistrationResponse","abstract":"

    Response to SDLChangeRegistrations

    "},"Classes/SDLChoice.html":{"name":"SDLChoice","abstract":"

    A choice is an option which a user can select either via the menu or via voice recognition (VR) during an application initiated interaction.

    "},"Classes/SDLChoiceCell.html":{"name":"SDLChoiceCell","abstract":"

    Undocumented

    "},"Classes/SDLChoiceSet.html":{"name":"SDLChoiceSet","abstract":"

    Undocumented

    "},"Classes/SDLClimateControlCapabilities.html":{"name":"SDLClimateControlCapabilities","abstract":"

    Contains information about a climate control module’s capabilities.

    "},"Classes/SDLClimateControlData.html":{"name":"SDLClimateControlData","abstract":"

    The current information for the Climate Remote Control Module

    "},"Classes/SDLCloudAppProperties.html":{"name":"SDLCloudAppProperties","abstract":"

    Undocumented

    "},"Classes/SDLClusterModeStatus.html":{"name":"SDLClusterModeStatus","abstract":"

    A vehicle data struct for the cluster mode and power status

    "},"Classes/SDLConfiguration.html":{"name":"SDLConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLCreateInteractionChoiceSet.html":{"name":"SDLCreateInteractionChoiceSet","abstract":"

    Creates a Choice Set which can be used in subsequent SDLPerformInteraction Operations.

    "},"Classes.html#/c:objc(cs)SDLCreateInteractionChoiceSetResponse":{"name":"SDLCreateInteractionChoiceSetResponse","abstract":"

    Response to SDLCreateInteractionChoiceSet has been called

    "},"Classes/SDLDIDResult.html":{"name":"SDLDIDResult","abstract":"

    A vehicle data struct

    "},"Classes/SDLDateTime.html":{"name":"SDLDateTime","abstract":"

    A struct referenced in SendLocation for an absolute date

    "},"Classes/SDLDeleteCommand.html":{"name":"SDLDeleteCommand","abstract":"

    Removes a command from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteCommandResponse":{"name":"SDLDeleteCommandResponse","abstract":"

    Response to SDLDeleteCommand

    "},"Classes/SDLDeleteFile.html":{"name":"SDLDeleteFile","abstract":"

    Used to delete a file resident on the SDL module in the app’s local cache."},"Classes/SDLDeleteFileResponse.html":{"name":"SDLDeleteFileResponse","abstract":"

    Response to SDLDeleteFile

    "},"Classes/SDLDeleteInteractionChoiceSet.html":{"name":"SDLDeleteInteractionChoiceSet","abstract":"

    Deletes an existing Choice Set identified by the parameter"},"Classes.html#/c:objc(cs)SDLDeleteInteractionChoiceSetResponse":{"name":"SDLDeleteInteractionChoiceSetResponse","abstract":"

    SDLDeleteInteractionChoiceSetResponse is sent, when SDLDeleteInteractionChoiceSet has been called

    "},"Classes/SDLDeleteSubMenu.html":{"name":"SDLDeleteSubMenu","abstract":"

    Deletes a submenu from the Command Menu"},"Classes.html#/c:objc(cs)SDLDeleteSubMenuResponse":{"name":"SDLDeleteSubMenuResponse","abstract":"

    Response to SDLDeleteSubMenu

    "},"Classes/SDLDeviceInfo.html":{"name":"SDLDeviceInfo","abstract":"

    Various information about connecting device. Referenced in RegisterAppInterface

    "},"Classes/SDLDeviceStatus.html":{"name":"SDLDeviceStatus","abstract":"

    Describes the status related to a connected mobile device or SDL and if or how it is represented in the vehicle.

    "},"Classes/SDLDiagnosticMessage.html":{"name":"SDLDiagnosticMessage","abstract":"

    Non periodic vehicle diagnostic request

    "},"Classes/SDLDiagnosticMessageResponse.html":{"name":"SDLDiagnosticMessageResponse","abstract":"

    Response to SDLDiagnosticMessage

    "},"Classes/SDLDialNumber.html":{"name":"SDLDialNumber","abstract":"

    This RPC is used to tell the head unit to use bluetooth to dial a phone number using the phone.

    "},"Classes.html#/c:objc(cs)SDLDialNumberResponse":{"name":"SDLDialNumberResponse","abstract":"

    The response to SDLDialNumber

    "},"Classes/SDLDisplayCapabilities.html":{"name":"SDLDisplayCapabilities","abstract":"

    Contains information about the display for the SDL system to which the application is currently connected.

    "},"Classes/SDLECallInfo.html":{"name":"SDLECallInfo","abstract":"

    A vehicle data struct for emergency call information

    "},"Classes/SDLEmergencyEvent.html":{"name":"SDLEmergencyEvent","abstract":"

    A vehicle data struct for an emergency event

    "},"Classes/SDLEncodedSyncPData.html":{"name":"SDLEncodedSyncPData","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLEncodedSyncPDataResponse":{"name":"SDLEncodedSyncPDataResponse","abstract":"

    The response to SDLEncodedSyncPData

    "},"Classes.html#/c:objc(cs)SDLEndAudioPassThru":{"name":"SDLEndAudioPassThru","abstract":"

    When this request is invoked, the audio capture stops

    "},"Classes.html#/c:objc(cs)SDLEndAudioPassThruResponse":{"name":"SDLEndAudioPassThruResponse","abstract":"

    Response to SDLEndAudioPassThru

    "},"Classes/SDLEqualizerSettings.html":{"name":"SDLEqualizerSettings","abstract":"

    Defines the each Equalizer channel settings.

    "},"Classes/SDLFile.html":{"name":"SDLFile","abstract":"

    Undocumented

    "},"Classes/SDLFileManager.html":{"name":"SDLFileManager","abstract":"

    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.

    "},"Classes/SDLFileManagerConfiguration.html":{"name":"SDLFileManagerConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLFuelRange.html":{"name":"SDLFuelRange","abstract":"

    Describes the distance a vehicle can travel with the current level of fuel.

    "},"Classes/SDLFunctionID.html":{"name":"SDLFunctionID","abstract":"

    Undocumented

    "},"Classes/SDLGPSData.html":{"name":"SDLGPSData","abstract":"

    Describes the GPS data. Not all data will be available on all carlines.

    "},"Classes.html#/c:objc(cs)SDLGenericResponse":{"name":"SDLGenericResponse","abstract":"

    Generic Response is sent when the name of a received request is unknown. It is only used in case of an error. It will have an INVALID_DATA result code.

    "},"Classes/SDLGetAppServiceData.html":{"name":"SDLGetAppServiceData","abstract":"

    This request asks the module for current data related to the specific service. It also includes an option to subscribe to that service for future updates.

    "},"Classes/SDLGetAppServiceDataResponse.html":{"name":"SDLGetAppServiceDataResponse","abstract":"

    Undocumented

    "},"Classes/SDLGetCloudAppProperties.html":{"name":"SDLGetCloudAppProperties","abstract":"

    RPC used to get the current properties of a cloud application.

    "},"Classes/SDLGetCloudAppPropertiesResponse.html":{"name":"SDLGetCloudAppPropertiesResponse","abstract":"

    The response to GetCloudAppProperties

    "},"Classes/SDLGetDTCs.html":{"name":"SDLGetDTCs","abstract":"

    This RPC allows to request diagnostic module trouble codes from a certain"},"Classes/SDLGetDTCsResponse.html":{"name":"SDLGetDTCsResponse","abstract":"

    Response to SDLGetDTCs

    "},"Classes/SDLGetFile.html":{"name":"SDLGetFile","abstract":"

    This request is sent to the module to retrieve a file.

    "},"Classes/SDLGetFileResponse.html":{"name":"SDLGetFileResponse","abstract":"

    Undocumented

    "},"Classes/SDLGetInteriorVehicleData.html":{"name":"SDLGetInteriorVehicleData","abstract":"

    Reads the current status value of specified remote control module (type)."},"Classes/SDLGetInteriorVehicleDataResponse.html":{"name":"SDLGetInteriorVehicleDataResponse","abstract":"

    A response to SDLGetInteriorVehicleData

    "},"Classes/SDLGetSystemCapability.html":{"name":"SDLGetSystemCapability","abstract":"

    Undocumented

    "},"Classes/SDLGetSystemCapabilityResponse.html":{"name":"SDLGetSystemCapabilityResponse","abstract":"

    Response to SDLGetSystemCapability

    "},"Classes/SDLGetVehicleData.html":{"name":"SDLGetVehicleData","abstract":"

    Requests current values of specific published vehicle data items.

    "},"Classes/SDLGetVehicleDataResponse.html":{"name":"SDLGetVehicleDataResponse","abstract":"

    Response to SDLGetVehicleData

    "},"Classes/SDLGetWayPoints.html":{"name":"SDLGetWayPoints","abstract":"

    Undocumented

    "},"Classes/SDLGetWayPointsResponse.html":{"name":"SDLGetWayPointsResponse","abstract":"

    Response to SDLGetWayPoints

    "},"Classes/SDLHMICapabilities.html":{"name":"SDLHMICapabilities","abstract":"

    Undocumented

    "},"Classes/SDLHMIPermissions.html":{"name":"SDLHMIPermissions","abstract":"

    Defining sets of HMI levels, which are permitted or prohibited for a given RPC.

    "},"Classes/SDLHMISettingsControlCapabilities.html":{"name":"SDLHMISettingsControlCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLHMISettingsControlData.html":{"name":"SDLHMISettingsControlData","abstract":"

    Corresponds to HMI_SETTINGS ModuleType

    "},"Classes/SDLHapticRect.html":{"name":"SDLHapticRect","abstract":"

    Defines spatial for each user control object for video streaming application

    "},"Classes/SDLHeadLampStatus.html":{"name":"SDLHeadLampStatus","abstract":"

    Vehicle data struct for status of head lamps

    "},"Classes/SDLImage.html":{"name":"SDLImage","abstract":"

    Specifies which image shall be used e.g. in SDLAlerts or on SDLSoftbuttons provided the display supports it.

    "},"Classes/SDLImageField.html":{"name":"SDLImageField","abstract":"

    A struct used in DisplayCapabilities describing the capability of an image field

    "},"Classes/SDLImageResolution.html":{"name":"SDLImageResolution","abstract":"

    The resolution of an image

    "},"Classes/SDLKeyboardProperties.html":{"name":"SDLKeyboardProperties","abstract":"

    Configuration of on-screen keyboard (if available)

    "},"Classes/SDLLifecycleConfiguration.html":{"name":"SDLLifecycleConfiguration","abstract":"

    Configuration options for SDLManager

    "},"Classes/SDLLifecycleConfigurationUpdate.html":{"name":"SDLLifecycleConfigurationUpdate","abstract":"

    Configuration update options for SDLManager. This class can be used to update the lifecycle configuration in"},"Classes/SDLLightCapabilities.html":{"name":"SDLLightCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLLightControlCapabilities.html":{"name":"SDLLightControlCapabilities","abstract":"

    Undocumented

    "},"Classes/SDLLightControlData.html":{"name":"SDLLightControlData","abstract":"

    Undocumented

    "},"Classes/SDLLightState.html":{"name":"SDLLightState","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLListFiles":{"name":"SDLListFiles","abstract":"

    Requests the current list of resident filenames for the registered app. Not"},"Classes/SDLListFilesResponse.html":{"name":"SDLListFilesResponse","abstract":"

    Response to SDLListFiles

    "},"Classes/SDLLocationCoordinate.html":{"name":"SDLLocationCoordinate","abstract":"

    Describes a coordinate on earth

    "},"Classes/SDLLocationDetails.html":{"name":"SDLLocationDetails","abstract":"

    Describes a location, including its coordinate, name, etc. Used in WayPoints.

    "},"Classes/SDLLockScreenConfiguration.html":{"name":"SDLLockScreenConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLLockScreenViewController.html":{"name":"SDLLockScreenViewController","abstract":"

    Undocumented

    "},"Classes/SDLLogConfiguration.html":{"name":"SDLLogConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLLogFileModule.html":{"name":"SDLLogFileModule","abstract":"

    Undocumented

    "},"Classes/SDLLogFilter.html":{"name":"SDLLogFilter","abstract":"

    Undocumented

    "},"Classes/SDLLogManager.html":{"name":"SDLLogManager","abstract":"

    This is the central manager of logging. A developer should not have to interact with this class, it is exclusively used internally.

    "},"Classes.html#/c:objc(cs)SDLLogTargetAppleSystemLog":{"name":"SDLLogTargetAppleSystemLog","abstract":"

    The Apple System Log target is an iOS 2.0+ compatible log target that logs to both the Console and to the System Log.

    "},"Classes.html#/c:objc(cs)SDLLogTargetFile":{"name":"SDLLogTargetFile","abstract":"

    The File log will log to a text file on the iPhone in Documents/smartdevicelink/log/#appName##datetime##.log. It will log up to 3 logs which will rollover.

    "},"Classes.html#/c:objc(cs)SDLLogTargetOSLog":{"name":"SDLLogTargetOSLog","abstract":"

    OS_LOG is an iOS 10+ only logging system that logs to the Console and the Apple system console. This is an improved replacement for Apple SysLog (SDLLogTargetAppleSystemLog).

    "},"Classes/SDLManager.html":{"name":"SDLManager","abstract":"

    Undocumented

    "},"Classes/SDLMassageCushionFirmness.html":{"name":"SDLMassageCushionFirmness","abstract":"

    The intensity or firmness of a cushion.

    "},"Classes/SDLMassageModeData.html":{"name":"SDLMassageModeData","abstract":"

    Specify the mode of a massage zone.

    "},"Classes/SDLMediaServiceData.html":{"name":"SDLMediaServiceData","abstract":"

    This data is related to what a media service should provide.

    "},"Classes.html#/c:objc(cs)SDLMediaServiceManifest":{"name":"SDLMediaServiceManifest","abstract":"

    A media service manifest.

    "},"Classes/SDLMenuCell.html":{"name":"SDLMenuCell","abstract":"

    Undocumented

    "},"Classes/SDLMenuParams.html":{"name":"SDLMenuParams","abstract":"

    Used when adding a sub menu to an application menu or existing sub menu.

    "},"Classes/SDLMetadataTags.html":{"name":"SDLMetadataTags","abstract":"

    Undocumented

    "},"Classes/SDLModuleData.html":{"name":"SDLModuleData","abstract":"

    Describes a remote control module’s data

    "},"Classes/SDLMyKey.html":{"name":"SDLMyKey","abstract":"

    Vehicle Data struct

    "},"Classes/SDLNavigationCapability.html":{"name":"SDLNavigationCapability","abstract":"

    Extended capabilities for an onboard navigation system

    "},"Classes/SDLNavigationInstruction.html":{"name":"SDLNavigationInstruction","abstract":"

    Undocumented

    "},"Classes/SDLNavigationServiceData.html":{"name":"SDLNavigationServiceData","abstract":"

    Undocumented

    "},"Classes/SDLNavigationServiceManifest.html":{"name":"SDLNavigationServiceManifest","abstract":"

    Undocumented

    "},"Classes/SDLNotificationConstants.html":{"name":"SDLNotificationConstants","abstract":"

    Undocumented

    "},"Classes/SDLOasisAddress.html":{"name":"SDLOasisAddress","abstract":"

    Struct used in SendLocation describing an address

    "},"Classes/SDLOnAppInterfaceUnregistered.html":{"name":"SDLOnAppInterfaceUnregistered","abstract":"

    Notifies an application that its interface registration has been terminated. This means that all SDL resources associated with the application are discarded, including the Command Menu, Choice Sets, button subscriptions, etc.

    "},"Classes/SDLOnAppServiceData.html":{"name":"SDLOnAppServiceData","abstract":"

    This notification includes the data that is updated from the specific service.

    "},"Classes.html#/c:objc(cs)SDLOnAudioPassThru":{"name":"SDLOnAudioPassThru","abstract":"

    Binary data is in binary part of hybrid msg.

    "},"Classes/SDLOnButtonEvent.html":{"name":"SDLOnButtonEvent","abstract":"

    Notifies application that user has depressed or released a button to which"},"Classes/SDLOnButtonPress.html":{"name":"SDLOnButtonPress","abstract":"

    Notifies application of button press events for buttons to which the application is subscribed. SDL supports two button press events defined as follows:

    "},"Classes/SDLOnCommand.html":{"name":"SDLOnCommand","abstract":"

    This is called when a command was selected via VR after pressing the PTT button, or selected from the menu after pressing the MENU button.

    "},"Classes/SDLOnDriverDistraction.html":{"name":"SDLOnDriverDistraction","abstract":"

    Notifies the application of the current driver distraction state (whether driver distraction rules are in effect, or not).

    "},"Classes/SDLOnEncodedSyncPData.html":{"name":"SDLOnEncodedSyncPData","abstract":"

    Callback including encoded data of any SyncP packets that SYNC needs to send back to the mobile device. Legacy / v1 Protocol implementation; responds to EncodedSyncPData. *** DEPRECATED ***

    "},"Classes/SDLOnHMIStatus.html":{"name":"SDLOnHMIStatus"},"Classes/SDLOnHashChange.html":{"name":"SDLOnHashChange","abstract":"

    Notification containing an updated hashID which can be used over connection cycles (i.e. loss of connection, ignition cycles, etc.). Sent after initial registration and subsequently after any change in the calculated hash of all persisted app data.

    "},"Classes/SDLOnInteriorVehicleData.html":{"name":"SDLOnInteriorVehicleData","abstract":"

    Notifications when subscribed vehicle data changes.

    "},"Classes/SDLOnKeyboardInput.html":{"name":"SDLOnKeyboardInput","abstract":"

    Sent when a keyboard presented by a PerformInteraction has a keyboard input.

    "},"Classes/SDLOnLanguageChange.html":{"name":"SDLOnLanguageChange","abstract":"

    Provides information to what language the SDL HMI language was changed

    "},"Classes/SDLOnLockScreenStatus.html":{"name":"SDLOnLockScreenStatus","abstract":"

    To help prevent driver distraction, any SmartDeviceLink application is required to implement a lockscreen that must be enforced while the application is active on the system while the vehicle is in motion.

    "},"Classes/SDLOnPermissionsChange.html":{"name":"SDLOnPermissionsChange","abstract":"

    Provides update to app of which sets of functions are available

    "},"Classes/SDLOnRCStatus.html":{"name":"SDLOnRCStatus","abstract":"

    OnRCStatus notifications to all registered mobile applications and the HMI whenever"},"Classes/SDLOnSyncPData.html":{"name":"SDLOnSyncPData","abstract":"

    DEPRECATED

    "},"Classes/SDLOnSystemCapabilityUpdated.html":{"name":"SDLOnSystemCapabilityUpdated","abstract":"

    A notification to inform the connected device that a specific system capability has changed.

    "},"Classes/SDLOnSystemRequest.html":{"name":"SDLOnSystemRequest","abstract":"

    An asynchronous request from the system for specific data from the device or the cloud or response to a request from the device or cloud Binary data can be included in hybrid part of message for some requests (such as Authentication request responses)

    "},"Classes/SDLOnTBTClientState.html":{"name":"SDLOnTBTClientState","abstract":"

    Provides applications with notifications specific to the current TBT client status on the module

    "},"Classes/SDLOnTouchEvent.html":{"name":"SDLOnTouchEvent","abstract":"

    Notifies about touch events on the screen’s prescribed area during video streaming

    "},"Classes/SDLOnVehicleData.html":{"name":"SDLOnVehicleData","abstract":"

    Callback for the periodic and non periodic vehicle data read function.

    "},"Classes/SDLOnWayPointChange.html":{"name":"SDLOnWayPointChange","abstract":"

    Notification which provides the entire LocationDetails when there is a change to any waypoints or destination.

    "},"Classes/SDLParameterPermissions.html":{"name":"SDLParameterPermissions","abstract":"

    Defining sets of parameters, which are permitted or prohibited for a given RPC.

    "},"Classes/SDLPerformAppServiceInteraction.html":{"name":"SDLPerformAppServiceInteraction","abstract":"

    App service providers will likely have different actions exposed to the module and app service consumers. It will be difficult to standardize these actions by RPC versions and can easily become stale. Therefore, we introduce a best-effort attempt to take actions on a service.

    "},"Classes/SDLPerformAppServiceInteractionResponse.html":{"name":"SDLPerformAppServiceInteractionResponse","abstract":"

    Undocumented

    "},"Classes/SDLPerformAudioPassThru.html":{"name":"SDLPerformAudioPassThru","abstract":"

    This will open an audio pass thru session. By doing so the app can receive"},"Classes.html#/c:objc(cs)SDLPerformAudioPassThruResponse":{"name":"SDLPerformAudioPassThruResponse","abstract":"

    Response to SDLPerformAudioPassThru

    "},"Classes/SDLPerformInteraction.html":{"name":"SDLPerformInteraction","abstract":"

    Performs an application-initiated interaction in which the user can select a"},"Classes/SDLPerformInteractionResponse.html":{"name":"SDLPerformInteractionResponse","abstract":"

    PerformInteraction Response is sent, when SDLPerformInteraction has been called

    "},"Classes/SDLPermissionItem.html":{"name":"SDLPermissionItem","abstract":"

    Undocumented

    "},"Classes/SDLPermissionManager.html":{"name":"SDLPermissionManager","abstract":"

    Undocumented

    "},"Classes/SDLPhoneCapability.html":{"name":"SDLPhoneCapability","abstract":"

    Extended capabilities of the module’s phone feature

    "},"Classes/SDLPinchGesture.html":{"name":"SDLPinchGesture","abstract":"

    Undocumented

    "},"Classes/SDLPresetBankCapabilities.html":{"name":"SDLPresetBankCapabilities","abstract":"

    Contains information about on-screen preset capabilities.

    "},"Classes/SDLPublishAppService.html":{"name":"SDLPublishAppService","abstract":"

    Registers a service offered by this app on the module.

    "},"Classes/SDLPublishAppServiceResponse.html":{"name":"SDLPublishAppServiceResponse","abstract":"

    Undocumented

    "},"Classes/SDLPutFile.html":{"name":"SDLPutFile","abstract":"

    Used to push a binary data onto the SDL module from a mobile device, such as icons and album art.

    "},"Classes/SDLPutFileResponse.html":{"name":"SDLPutFileResponse","abstract":"

    Response to SDLPutFile

    "},"Classes/SDLRDSData.html":{"name":"SDLRDSData","abstract":"

    Include the data defined in Radio Data System, which is a communications protocol standard for embedding small amounts of digital information in conventional FM radio broadcasts.

    "},"Classes/SDLRGBColor.html":{"name":"SDLRGBColor","abstract":"

    Undocumented

    "},"Classes/SDLRPCMessage.html":{"name":"SDLRPCMessage","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLRPCNotification":{"name":"SDLRPCNotification","abstract":"

    An RPC sent from the head unit to the app about some data change, such as a button was pressed

    "},"Classes/SDLRPCNotificationNotification.html":{"name":"SDLRPCNotificationNotification","abstract":"

    An NSNotification object that makes retrieving internal SDLRPCNotification data easier

    "},"Classes/SDLRPCRequest.html":{"name":"SDLRPCRequest","abstract":"

    Undocumented

    "},"Classes/SDLRPCRequestNotification.html":{"name":"SDLRPCRequestNotification","abstract":"

    A NSNotification object that makes retrieving internal SDLRPCRequest data easier

    "},"Classes/SDLRPCResponse.html":{"name":"SDLRPCResponse","abstract":"

    Undocumented

    "},"Classes/SDLRPCResponseNotification.html":{"name":"SDLRPCResponseNotification","abstract":"

    A NSNotification object that makes retrieving internal SDLRPCResponse data easier

    "},"Classes/SDLRPCStruct.html":{"name":"SDLRPCStruct","abstract":"

    Undocumented

    "},"Classes/SDLRadioControlCapabilities.html":{"name":"SDLRadioControlCapabilities","abstract":"

    Contains information about a radio control module’s capabilities.

    "},"Classes/SDLRadioControlData.html":{"name":"SDLRadioControlData","abstract":"

    Include information (both read-only and changeable data) about a remote control radio module.

    "},"Classes/SDLReadDID.html":{"name":"SDLReadDID","abstract":"

    Non periodic vehicle data read request. This is an RPC to get diagnostics"},"Classes/SDLReadDIDResponse.html":{"name":"SDLReadDIDResponse","abstract":"

    A response to ReadDID

    "},"Classes/SDLRectangle.html":{"name":"SDLRectangle","abstract":"

    A struct describing a rectangle

    "},"Classes/SDLRegisterAppInterface.html":{"name":"SDLRegisterAppInterface","abstract":"

    Registers the application’s interface with SDL. The RegisterAppInterface RPC declares the properties of the app, including the messaging interface version, the app name, etc. The mobile application must establish its interface registration with SDL before any other interaction with SDL can take place. The registration lasts until it is terminated either by the application calling the SDLUnregisterAppInterface method, or by SDL sending an SDLOnAppInterfaceUnregistered notification, or by loss of the underlying transport connection, or closing of the underlying message transmission protocol RPC session.

    "},"Classes/SDLRegisterAppInterfaceResponse.html":{"name":"SDLRegisterAppInterfaceResponse","abstract":"

    Response to SDLRegisterAppInterface

    "},"Classes/SDLRemoteControlCapabilities.html":{"name":"SDLRemoteControlCapabilities","abstract":"

    Capabilities of the remote control feature

    "},"Classes/SDLResetGlobalProperties.html":{"name":"SDLResetGlobalProperties","abstract":"

    Resets the passed global properties to their default values as defined by"},"Classes.html#/c:objc(cs)SDLResetGlobalPropertiesResponse":{"name":"SDLResetGlobalPropertiesResponse","abstract":"

    Response to ResetGlobalProperties

    "},"Classes/SDLSISData.html":{"name":"SDLSISData","abstract":"

    HD radio Station Information Service (SIS) data.

    "},"Classes/SDLScreenManager.html":{"name":"SDLScreenManager","abstract":"

    Undocumented

    "},"Classes/SDLScreenParams.html":{"name":"SDLScreenParams","abstract":"

    A struct in DisplayCapabilities describing parameters related to a video / touch input area

    "},"Classes/SDLScrollableMessage.html":{"name":"SDLScrollableMessage","abstract":"

    Creates a full screen overlay containing a large block of formatted text that"},"Classes.html#/c:objc(cs)SDLScrollableMessageResponse":{"name":"SDLScrollableMessageResponse","abstract":"

    Response to SDLScrollableMessage

    "},"Classes/SDLSeatControlCapabilities.html":{"name":"SDLSeatControlCapabilities","abstract":"

    Include information about a seat control capabilities.

    "},"Classes/SDLSeatControlData.html":{"name":"SDLSeatControlData","abstract":"

    Seat control data corresponds to SEAT ModuleType.

    "},"Classes/SDLSeatMemoryAction.html":{"name":"SDLSeatMemoryAction","abstract":"

    Specify the action to be performed.

    "},"Classes/SDLSendHapticData.html":{"name":"SDLSendHapticData","abstract":"

    Sends the spatial data gathered from SDLCarWindow or VirtualDisplayEncoder to the HMI. This data will be utilized by the HMI to determine how and when haptic events should occur.

    "},"Classes.html#/c:objc(cs)SDLSendHapticDataResponse":{"name":"SDLSendHapticDataResponse","abstract":"

    Response to SDLSendHapticData

    "},"Classes/SDLSendLocation.html":{"name":"SDLSendLocation","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLSendLocationResponse":{"name":"SDLSendLocationResponse","abstract":"

    Response to SDLSendLocation

    "},"Classes/SDLSetAppIcon.html":{"name":"SDLSetAppIcon","abstract":"

    Used to set existing local file on SDL as the app’s icon. Not supported on"},"Classes.html#/c:objc(cs)SDLSetAppIconResponse":{"name":"SDLSetAppIconResponse","abstract":"

    Response to SDLSetAppIcon

    "},"Classes/SDLSetCloudAppProperties.html":{"name":"SDLSetCloudAppProperties","abstract":"

    RPC used to enable/disable a cloud application and set authentication data

    "},"Classes.html#/c:objc(cs)SDLSetCloudAppPropertiesResponse":{"name":"SDLSetCloudAppPropertiesResponse","abstract":"

    The response to SetCloudAppProperties

    "},"Classes/SDLSetDisplayLayout.html":{"name":"SDLSetDisplayLayout","abstract":"

    Used to set an alternate display layout. If not sent, default screen for"},"Classes/SDLSetDisplayLayoutResponse.html":{"name":"SDLSetDisplayLayoutResponse","abstract":"

    Response to SDLSetDisplayLayout

    "},"Classes/SDLSetGlobalProperties.html":{"name":"SDLSetGlobalProperties","abstract":"

    Sets global property values

    "},"Classes.html#/c:objc(cs)SDLSetGlobalPropertiesResponse":{"name":"SDLSetGlobalPropertiesResponse","abstract":"

    Response to SDLSetGlobalProperties

    "},"Classes/SDLSetInteriorVehicleData.html":{"name":"SDLSetInteriorVehicleData","abstract":"

    This RPC allows a remote control type mobile application to"},"Classes/SDLSetInteriorVehicleDataResponse.html":{"name":"SDLSetInteriorVehicleDataResponse","abstract":"

    Response to SDLSetInteriorVehicleData

    "},"Classes/SDLSetMediaClockTimer.html":{"name":"SDLSetMediaClockTimer","abstract":"

    Sets the media clock/timer value and the update method (e.g.count-up,"},"Classes.html#/c:objc(cs)SDLSetMediaClockTimerResponse":{"name":"SDLSetMediaClockTimerResponse","abstract":"

    Response to SDLSetMediaClockTimer

    "},"Classes/SDLShow.html":{"name":"SDLShow","abstract":"

    Updates the application’s display text area, regardless of whether or not"},"Classes/SDLShowConstantTBT.html":{"name":"SDLShowConstantTBT","abstract":"

    This RPC is used to update the user with navigation information for the constantly shown screen (base screen), but also for the alert maneuver screen.

    "},"Classes.html#/c:objc(cs)SDLShowConstantTBTResponse":{"name":"SDLShowConstantTBTResponse","abstract":"

    Response to SDLShowConstantTBT

    "},"Classes.html#/c:objc(cs)SDLShowResponse":{"name":"SDLShowResponse","abstract":"

    Response to SDLShow

    "},"Classes/SDLSingleTireStatus.html":{"name":"SDLSingleTireStatus","abstract":"

    Tire pressure status of a single tire.

    "},"Classes/SDLSlider.html":{"name":"SDLSlider","abstract":"

    Creates a full screen or pop-up overlay (depending on platform) with a single user controlled slider

    "},"Classes/SDLSliderResponse.html":{"name":"SDLSliderResponse","abstract":"

    Response to SDLSlider

    "},"Classes/SDLSoftButton.html":{"name":"SDLSoftButton","abstract":"

    Describes an on-screen button which may be presented in various contexts, e.g. templates or alerts

    "},"Classes/SDLSoftButtonCapabilities.html":{"name":"SDLSoftButtonCapabilities","abstract":"

    Contains information about a SoftButton’s capabilities.

    "},"Classes/SDLSoftButtonObject.html":{"name":"SDLSoftButtonObject","abstract":"

    A soft button wrapper object that is capable of storing and switching between states

    "},"Classes/SDLSoftButtonState.html":{"name":"SDLSoftButtonState","abstract":"

    Undocumented

    "},"Classes/SDLSpeak.html":{"name":"SDLSpeak","abstract":"

    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.

    "},"Classes.html#/c:objc(cs)SDLSpeakResponse":{"name":"SDLSpeakResponse","abstract":"

    Response to SDLSpeak

    "},"Classes/SDLStartTime.html":{"name":"SDLStartTime","abstract":"

    Describes the hour, minute and second values used to set the media clock.

    "},"Classes/SDLStationIDNumber.html":{"name":"SDLStationIDNumber","abstract":"

    Describes the hour, minute and second values used to set the media clock.

    "},"Classes/SDLStreamingMediaConfiguration.html":{"name":"SDLStreamingMediaConfiguration","abstract":"

    Undocumented

    "},"Classes/SDLStreamingMediaManager.html":{"name":"SDLStreamingMediaManager","abstract":"

    Undocumented

    "},"Classes/SDLSubscribeButton.html":{"name":"SDLSubscribeButton","abstract":"

    Establishes a subscription to button notifications for HMI buttons. Buttons"},"Classes.html#/c:objc(cs)SDLSubscribeButtonResponse":{"name":"SDLSubscribeButtonResponse","abstract":"

    Response to SDLSubscribeButton

    "},"Classes/SDLSubscribeVehicleData.html":{"name":"SDLSubscribeVehicleData","abstract":"

    Subscribes to specific published vehicle data items. The data will be only sent if it has changed. The application will be notified by the onVehicleData notification whenever new data is available. The update rate is dependent on sensors, vehicle architecture and vehicle type.

    "},"Classes/SDLSubscribeVehicleDataResponse.html":{"name":"SDLSubscribeVehicleDataResponse","abstract":"

    Response to SDLSubscribeVehicleData

    "},"Classes.html#/c:objc(cs)SDLSubscribeWayPoints":{"name":"SDLSubscribeWayPoints","abstract":"

    A SDLSubscribeWaypoints can be sent to subscribe"},"Classes.html#/c:objc(cs)SDLSubscribeWayPointsResponse":{"name":"SDLSubscribeWayPointsResponse","abstract":"

    Response to SubscribeWayPoints

    "},"Classes/SDLSyncMsgVersion.html":{"name":"SDLSyncMsgVersion","abstract":"

    Specifies the version number of the SDL V4 interface. This is used by both the application and SDL to declare what interface version each is using.

    "},"Classes.html#/c:objc(cs)SDLSyncPData":{"name":"SDLSyncPData","abstract":"

    Undocumented

    "},"Classes.html#/c:objc(cs)SDLSyncPDataResponse":{"name":"SDLSyncPDataResponse","abstract":"

    Response to SyncPData

    "},"Classes/SDLSystemCapability.html":{"name":"SDLSystemCapability","abstract":"

    The systemCapabilityType indicates which type of data should be changed and identifies which data object exists in this struct. For example, if the SystemCapability Type is NAVIGATION then a navigationCapability should exist.

    "},"Classes/SDLSystemCapabilityManager.html":{"name":"SDLSystemCapabilityManager","abstract":"

    A manager that handles updating and subscribing to SDL capabilities.

    "},"Classes/SDLSystemRequest.html":{"name":"SDLSystemRequest","abstract":"

    Undocumented

    "},"Classes/SDLTTSChunk.html":{"name":"SDLTTSChunk","abstract":"

    Specifies what is to be spoken. This can be simply a text phrase, which SDL will speak according to its own rules. It can also be phonemes from either the Microsoft SAPI phoneme set, or from the LHPLUS phoneme set. It can also be a pre-recorded sound in WAV format (either developer-defined, or provided by the SDL platform).

    "},"Classes/SDLTemperature.html":{"name":"SDLTemperature","abstract":"

    Struct representing a temperature.

    "},"Classes/SDLTemplateColorScheme.html":{"name":"SDLTemplateColorScheme","abstract":"

    Undocumented

    "},"Classes/SDLTextField.html":{"name":"SDLTextField","abstract":"

    Struct defining the characteristics of a displayed field on the HMI.

    "},"Classes/SDLTireStatus.html":{"name":"SDLTireStatus","abstract":"

    Struct used in Vehicle Data; the status and pressure of the tires.

    "},"Classes/SDLTouch.html":{"name":"SDLTouch","abstract":"

    Undocumented

    "},"Classes/SDLTouchCoord.html":{"name":"SDLTouchCoord","abstract":"

    The coordinate of a touch, used in a touch event

    "},"Classes/SDLTouchEvent.html":{"name":"SDLTouchEvent","abstract":"

    A touch which occurred on the IVI system during projection

    "},"Classes/SDLTouchEventCapabilities.html":{"name":"SDLTouchEventCapabilities","abstract":"

    The capabilities of touches during projection applications

    "},"Classes/SDLTouchManager.html":{"name":"SDLTouchManager","abstract":"

    Undocumented

    "},"Classes/SDLTurn.html":{"name":"SDLTurn","abstract":"

    A struct used in UpdateTurnList for Turn-by-Turn navigation applications

    "},"Classes.html#/c:objc(cs)SDLUnregisterAppInterface":{"name":"SDLUnregisterAppInterface","abstract":"

    Terminates an application’s interface registration. This causes SDL® to"},"Classes.html#/c:objc(cs)SDLUnregisterAppInterfaceResponse":{"name":"SDLUnregisterAppInterfaceResponse","abstract":"

    Response to UnregisterAppInterface

    "},"Classes/SDLUnsubscribeButton.html":{"name":"SDLUnsubscribeButton","abstract":"

    Deletes a subscription to button notifications for the specified button. For"},"Classes.html#/c:objc(cs)SDLUnsubscribeButtonResponse":{"name":"SDLUnsubscribeButtonResponse","abstract":"

    Response to UnsubscribeButton

    "},"Classes/SDLUnsubscribeVehicleData.html":{"name":"SDLUnsubscribeVehicleData","abstract":"

    This function is used to unsubscribe the notifications from the"},"Classes/SDLUnsubscribeVehicleDataResponse.html":{"name":"SDLUnsubscribeVehicleDataResponse","abstract":"

    Response to UnsubscribeVehicleData

    "},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPoints":{"name":"SDLUnsubscribeWayPoints","abstract":"

    Request to unsubscribe from navigation WayPoints and Destination

    "},"Classes.html#/c:objc(cs)SDLUnsubscribeWayPointsResponse":{"name":"SDLUnsubscribeWayPointsResponse","abstract":"

    Response to UnsubscribeWayPoints

    "},"Classes/SDLUpdateTurnList.html":{"name":"SDLUpdateTurnList","abstract":"

    Updates the list of next maneuvers, which can be requested by the user pressing the softbutton

    "},"Classes.html#/c:objc(cs)SDLUpdateTurnListResponse":{"name":"SDLUpdateTurnListResponse","abstract":"

    Response to UpdateTurnList

    "},"Classes/SDLVehicleDataResult.html":{"name":"SDLVehicleDataResult","abstract":"

    Individual published data request result

    "},"Classes/SDLVehicleType.html":{"name":"SDLVehicleType","abstract":"

    Describes the type of vehicle the mobile phone is connected with.

    "},"Classes/SDLVersion.html":{"name":"SDLVersion","abstract":"

    Undocumented

    "},"Classes/SDLVideoStreamingCapability.html":{"name":"SDLVideoStreamingCapability","abstract":"

    Contains information about this system’s video streaming capabilities

    "},"Classes/SDLVideoStreamingFormat.html":{"name":"SDLVideoStreamingFormat","abstract":"

    An available format for video streaming in projection applications

    "},"Classes/SDLVoiceCommand.html":{"name":"SDLVoiceCommand","abstract":"

    Undocumented

    "},"Classes/SDLVRHelpItem.html":{"name":"SDLVRHelpItem","abstract":"

    A help item for voice commands, used locally in interaction lists and globally

    "},"Classes/SDLWeatherAlert.html":{"name":"SDLWeatherAlert","abstract":"

    Undocumented

    "},"Classes/SDLWeatherData.html":{"name":"SDLWeatherData","abstract":"

    Undocumented

    "},"Classes/SDLWeatherServiceData.html":{"name":"SDLWeatherServiceData","abstract":"

    This data is related to what a weather service would provide.

    "},"Classes/SDLWeatherServiceManifest.html":{"name":"SDLWeatherServiceManifest","abstract":"

    A weather service manifest.

    "},"Categories/NSString(SDLEnum).html#/c:objc(cs)NSString(im)isEqualToEnum:":{"name":"-isEqualToEnum:","abstract":"

    Returns whether or not two enums are equal.

    ","parent_name":"NSString(SDLEnum)"},"Categories/NSString(SDLEnum).html":{"name":"NSString(SDLEnum)","abstract":"

    Undocumented

    "},"Categories.html":{"name":"Categories","abstract":"

    The following categories are available globally.

    "},"Classes.html":{"name":"Classes","abstract":"

    The following classes are available globally.

    "},"Constants.html":{"name":"Constants","abstract":"

    The following constants are available globally.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Protocols.html":{"name":"Protocols","abstract":"

    The following protocols are available globally.

    "},"Type Definitions.html":{"name":"Type Definitions","abstract":"

    The following type definitions are available globally.

    "}} \ No newline at end of file diff --git a/docs/undocumented.json b/docs/undocumented.json index a76a61f97..cc2b7d2e8 100644 --- a/docs/undocumented.json +++ b/docs/undocumented.json @@ -217,6 +217,13 @@ "symbol_kind": "sourcekitten.source.lang.objc.decl.class", "warning": "undocumented" }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAudioFile.h", + "line": 13, + "symbol": "SDLAudioFile", + "symbol_kind": "sourcekitten.source.lang.objc.decl.class", + "warning": "undocumented" + }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLAudioStreamManager.h", "line": 19, @@ -602,6 +609,13 @@ "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", "warning": "undocumented" }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLErrorConstants.h", + "line": 127, + "symbol": "SDLChoiceSetManagerError.SDLChoiceSetManagerErrorInvalidState", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLFile.h", "line": 16, @@ -1029,6 +1043,13 @@ "symbol_kind": "sourcekitten.source.lang.objc.decl.property", "warning": "undocumented" }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLManager.h", + "line": 184, + "symbol": "SDLRPCUpdatedBlock", + "symbol_kind": "sourcekitten.source.lang.objc.decl.typedef", + "warning": "undocumented" + }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLManagerDelegate.h", "line": 19, @@ -1050,6 +1071,62 @@ "symbol_kind": "sourcekitten.source.lang.objc.decl.class", "warning": "undocumented" }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 19, + "symbol": "SDLDynamicMenuUpdatesMode.SDLDynamicMenuUpdatesModeForceOn", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 20, + "symbol": "SDLDynamicMenuUpdatesMode.SDLDynamicMenuUpdatesModeForceOff", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 21, + "symbol": "SDLDynamicMenuUpdatesMode.SDLDynamicMenuUpdatesModeOnWithCompatibility", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 24, + "symbol": "MenuCellState", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 24, + "symbol": "MenuCellState", + "symbol_kind": "sourcekitten.source.lang.objc.decl.typedef", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 25, + "symbol": "MenuCellState.MenuCellStateDelete", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 26, + "symbol": "MenuCellState.MenuCellStateAdd", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, + { + "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuManagerConstants.h", + "line": 27, + "symbol": "MenuCellState.MenuCellStateKeep", + "symbol_kind": "sourcekitten.source.lang.objc.decl.enumcase", + "warning": "undocumented" + }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLMenuParams.h", "line": 17, @@ -2996,27 +3073,6 @@ "symbol_kind": "sourcekitten.source.lang.objc.decl.class", "warning": "undocumented" }, - { - "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h", - "line": 11, - "symbol": "SDLRPCMessage.function", - "symbol_kind": "sourcekitten.source.lang.objc.decl.ivar", - "warning": "undocumented" - }, - { - "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h", - "line": 12, - "symbol": "SDLRPCMessage.parameters", - "symbol_kind": "sourcekitten.source.lang.objc.decl.ivar", - "warning": "undocumented" - }, - { - "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessage.h", - "line": 13, - "symbol": "SDLRPCMessage.messageType", - "symbol_kind": "sourcekitten.source.lang.objc.decl.ivar", - "warning": "undocumented" - }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCMessageType.h", "line": 14, @@ -3061,9 +3117,9 @@ }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLRPCStruct.h", - "line": 12, + "line": 13, "symbol": "SDLRPCStruct.store", - "symbol_kind": "sourcekitten.source.lang.objc.decl.ivar", + "symbol_kind": "sourcekitten.source.lang.objc.decl.property", "warning": "undocumented" }, { @@ -3096,14 +3152,14 @@ }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenManager.h", - "line": 44, + "line": 45, "symbol": "SDLScreenManager", "symbol_kind": "sourcekitten.source.lang.objc.decl.class", "warning": "undocumented" }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLScreenManager.h", - "line": 214, + "line": 226, "symbol": "SDLScreenManager.-softButtonObjectNamed:", "symbol_kind": "sourcekitten.source.lang.objc.decl.method.instance", "warning": "undocumented" @@ -4830,13 +4886,6 @@ "symbol_kind": "sourcekitten.source.lang.objc.decl.class", "warning": "undocumented" }, - { - "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSystemCapabilityManager.h", - "line": 44, - "symbol": "SDLSystemCapabilityManager", - "symbol_kind": "sourcekitten.source.lang.objc.decl.class", - "warning": "undocumented" - }, { "file": "/Users/joel/Projects/SDL/sdl_ios/SmartDeviceLink/SDLSystemRequest.h", "line": 16,