summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicoleYarroch <nicole@livio.io>2019-10-04 15:41:39 -0400
committerNicoleYarroch <nicole@livio.io>2019-10-04 15:41:39 -0400
commit6e8434c883887bdd905d3722bf0fe68fbfa25cb8 (patch)
tree9c52bbf5ffbc1873ade78f3dd671fe3717633dd1
parent3e6423a4a08841b459a129b8b651368651131de2 (diff)
parent1f2c60ce1252587ab819d7e68a01206b0b722998 (diff)
downloadsdl_ios-6e8434c883887bdd905d3722bf0fe68fbfa25cb8.tar.gz
Merge branch 'develop' into feature/issue_1007_pixel_density_and_scale
-rw-r--r--Example Apps/Example ObjC/MenuManager.m2
-rw-r--r--Example Apps/Example ObjC/ProxyManager.m14
-rw-r--r--Example Apps/Example Swift/MenuManager.swift2
-rw-r--r--Example Apps/Example Swift/ProxyManager.swift20
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj16
-rw-r--r--SmartDeviceLink/SDLChoiceSetManager.h4
-rw-r--r--SmartDeviceLink/SDLChoiceSetManager.m42
-rw-r--r--SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.h20
-rw-r--r--SmartDeviceLink/SDLLifecycleManager.m6
-rw-r--r--SmartDeviceLink/SDLLogFileModuleMap.m2
-rw-r--r--SmartDeviceLink/SDLMenuManager.h3
-rw-r--r--SmartDeviceLink/SDLMenuManager.m47
-rw-r--r--SmartDeviceLink/SDLPreloadChoicesOperation.h4
-rw-r--r--SmartDeviceLink/SDLPreloadChoicesOperation.m27
-rw-r--r--SmartDeviceLink/SDLScreenManager.h5
-rw-r--r--SmartDeviceLink/SDLScreenManager.m15
-rw-r--r--SmartDeviceLink/SDLSoftButtonManager.h7
-rw-r--r--SmartDeviceLink/SDLSoftButtonManager.m57
-rw-r--r--SmartDeviceLink/SDLSoftButtonReplaceOperation.m1
-rwxr-xr-xSmartDeviceLink/SDLSystemCapability.h8
-rwxr-xr-xSmartDeviceLink/SDLSystemCapability.m12
-rw-r--r--SmartDeviceLink/SDLSystemCapabilityManager.h35
-rw-r--r--SmartDeviceLink/SDLSystemCapabilityManager.m311
-rw-r--r--SmartDeviceLink/SDLSystemCapabilityObserver.m8
-rw-r--r--SmartDeviceLink/SDLTextAndGraphicManager.h6
-rw-r--r--SmartDeviceLink/SDLTextAndGraphicManager.m63
-rw-r--r--SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.h26
-rw-r--r--SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.m (renamed from SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.m)14
-rw-r--r--SmartDeviceLink/SDLWindowCapability.m8
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m7
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m70
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m46
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m15
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m29
-rw-r--r--SmartDeviceLinkTests/SDLScreenManagerSpec.m5
-rw-r--r--SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m1
-rw-r--r--SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m195
38 files changed, 714 insertions, 441 deletions
diff --git a/Example Apps/Example ObjC/MenuManager.m b/Example Apps/Example ObjC/MenuManager.m
index fc97ceb24..308a66eee 100644
--- a/Example Apps/Example ObjC/MenuManager.m
+++ b/Example Apps/Example ObjC/MenuManager.m
@@ -145,7 +145,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (SDLMenuCell *)sdlex_scrollableMessageMenuCellWithManager:(SDLManager *)manager {
return [[SDLMenuCell alloc] initWithTitle:ACScrollableMessageMenuName icon:nil voiceCommands:@[ACScrollableMessageMenuName] handler:^(SDLTriggerSource _Nonnull triggerSource) {
- SDLScrollableMessage *messageRPC = [[SDLScrollableMessage alloc] initWithMessage:@"This is a scrollable message\nIt can contain many lines" timeout:10000 softButtons:nil cancelID:5];
+ SDLScrollableMessage *messageRPC = [[SDLScrollableMessage alloc] initWithMessage:@"This is a scrollable message\nIt can contain many lines"];
[manager sendRequest:messageRPC withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if(![response.resultCode isEqualToEnum:SDLResultSuccess]) {
[manager sendRequest:[AlertManager alertWithMessageAndCloseButton:@"Scrollable Message could not be displayed" textField2:nil iconName:nil]];
diff --git a/Example Apps/Example ObjC/ProxyManager.m b/Example Apps/Example ObjC/ProxyManager.m
index 980c5b137..35e28c9b0 100644
--- a/Example Apps/Example ObjC/ProxyManager.m
+++ b/Example Apps/Example ObjC/ProxyManager.m
@@ -193,14 +193,12 @@ NS_ASSUME_NONNULL_BEGIN
screenManager.textField2 = isTextEnabled ? [NSString stringWithFormat:@"Obj-C %@", ExampleAppText] : nil;
screenManager.textField3 = isTextEnabled ? self.vehicleDataManager.vehicleOdometerData : nil;
- if (self.sdlManager.systemCapabilityManager.displayCapabilities.graphicSupported) {
- if ([self sdlex_imageFieldSupported:SDLImageFieldNameGraphic]) {
- screenManager.primaryGraphic = areImagesVisible ? [SDLArtwork persistentArtworkWithImage:[[UIImage imageNamed:ExampleAppLogoName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] asImageFormat:SDLArtworkImageFormatPNG] : nil;
- }
+ if ([self sdlex_imageFieldSupported:SDLImageFieldNameGraphic]) {
+ screenManager.primaryGraphic = areImagesVisible ? [SDLArtwork persistentArtworkWithImage:[[UIImage imageNamed:ExampleAppLogoName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] asImageFormat:SDLArtworkImageFormatPNG] : nil;
+ }
- if ([self sdlex_imageFieldSupported:SDLImageFieldNameSecondaryGraphic]) {
- screenManager.secondaryGraphic = areImagesVisible ? [SDLArtwork persistentArtworkWithImage:[UIImage imageNamed:CarBWIconImageName] asImageFormat:SDLArtworkImageFormatPNG] : nil;
- }
+ if ([self sdlex_imageFieldSupported:SDLImageFieldNameSecondaryGraphic]) {
+ screenManager.secondaryGraphic = areImagesVisible ? [SDLArtwork persistentArtworkWithImage:[UIImage imageNamed:CarBWIconImageName] asImageFormat:SDLArtworkImageFormatPNG] : nil;
}
[screenManager endUpdatesWithCompletionHandler:^(NSError * _Nullable error) {
@@ -215,7 +213,7 @@ NS_ASSUME_NONNULL_BEGIN
* @return True if the image field is supported, false if not
*/
- (BOOL)sdlex_imageFieldSupported:(SDLImageFieldName)imageFieldName {
- for (SDLImageField *imageField in self.sdlManager.systemCapabilityManager.displayCapabilities.imageFields) {
+ for (SDLImageField *imageField in self.sdlManager.systemCapabilityManager.defaultMainWindowCapability.imageFields) {
if ([imageField.name isEqualToString:imageFieldName]) {
return YES;
}
diff --git a/Example Apps/Example Swift/MenuManager.swift b/Example Apps/Example Swift/MenuManager.swift
index bb7c5cb20..89ae1c741 100644
--- a/Example Apps/Example Swift/MenuManager.swift
+++ b/Example Apps/Example Swift/MenuManager.swift
@@ -191,7 +191,7 @@ private extension MenuManager {
private class func scrollableMessageMenuCell(with manager: SDLManager) -> SDLMenuCell {
return SDLMenuCell(title: ACScrollableMessageMenuName, icon: nil, voiceCommands: [ACScrollableMessageMenuName], handler: { _ in
- let scrollableMessage = SDLScrollableMessage(message: "This is a scrollable message\nIt can contain many lines", timeout: 10000, softButtons: nil)
+ let scrollableMessage = SDLScrollableMessage(message: "This is a scrollable message\nIt can contain many lines")
manager.send(request: scrollableMessage, responseHandler: { (request, response, error) in
guard let response = response, response.resultCode == .success else {
manager.send(AlertManager.alertWithMessageAndCloseButton("Scrollable could not be displayed"))
diff --git a/Example Apps/Example Swift/ProxyManager.swift b/Example Apps/Example Swift/ProxyManager.swift
index 77d4f7976..ac3913955 100644
--- a/Example Apps/Example Swift/ProxyManager.swift
+++ b/Example Apps/Example Swift/ProxyManager.swift
@@ -271,16 +271,14 @@ private extension ProxyManager {
screenManager.textField2 = isTextVisible ? "Swift \(ExampleAppText)" : nil
screenManager.textField3 = isTextVisible ? vehicleDataManager.vehicleOdometerData : nil
- if sdlManager.systemCapabilityManager.displayCapabilities?.graphicSupported.boolValue ?? false {
- // Primary graphic
- if imageFieldSupported(imageFieldName: .graphic) {
- screenManager.primaryGraphic = areImagesVisible ? SDLArtwork(image: UIImage(named: ExampleAppLogoName)!.withRenderingMode(.alwaysOriginal), persistent: false, as: .PNG) : nil
- }
-
- // Secondary graphic
- if imageFieldSupported(imageFieldName: .secondaryGraphic) {
- screenManager.secondaryGraphic = areImagesVisible ? SDLArtwork(image: UIImage(named: CarBWIconImageName)!, persistent: false, as: .PNG) : nil
- }
+ // Primary graphic
+ if imageFieldSupported(imageFieldName: .graphic) {
+ screenManager.primaryGraphic = areImagesVisible ? SDLArtwork(image: UIImage(named: ExampleAppLogoName)!.withRenderingMode(.alwaysOriginal), persistent: false, as: .PNG) : nil
+ }
+
+ // Secondary graphic
+ if imageFieldSupported(imageFieldName: .secondaryGraphic) {
+ screenManager.secondaryGraphic = areImagesVisible ? SDLArtwork(image: UIImage(named: CarBWIconImageName)!, persistent: false, as: .PNG) : nil
}
screenManager.endUpdates(completionHandler: { (error) in
@@ -305,6 +303,6 @@ private extension ProxyManager {
/// - Parameter imageFieldName: The name for the image field
/// - Returns: True if the image field is supported, false if not
func imageFieldSupported(imageFieldName: SDLImageFieldName) -> Bool {
- return sdlManager.systemCapabilityManager.displayCapabilities?.imageFields?.first { $0.name == imageFieldName } != nil ? true : false
+ return sdlManager.systemCapabilityManager.defaultMainWindowCapability?.imageFields?.first { $0.name == imageFieldName } != nil ? true : false
}
}
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index 9911b356b..d76b8541a 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -395,6 +395,8 @@
1FF7DABA1F75B2A800B46C30 /* SDLFocusableItemLocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FF7DAB91F75B2A800B46C30 /* SDLFocusableItemLocator.h */; };
1FF7DABC1F75B2BF00B46C30 /* SDLFocusableItemLocator.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF7DABB1F75B2BF00B46C30 /* SDLFocusableItemLocator.m */; };
1FF7DAC01F75CF6C00B46C30 /* SDLHapticManagerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FF7DABF1F75CF6C00B46C30 /* SDLHapticManagerSpec.m */; };
+ 2B233530232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B23352E232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.h */; };
+ 2B233531232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B23352F232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.m */; };
2BF2F84F20ED004000A26EF2 /* SDLAudioStreamingIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BF2F84D20ED004000A26EF2 /* SDLAudioStreamingIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
2BF2F85020ED004000A26EF2 /* SDLAudioStreamingIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BF2F84E20ED004000A26EF2 /* SDLAudioStreamingIndicator.m */; };
2BF2F85220ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BF2F85120ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m */; };
@@ -447,8 +449,6 @@
5D1665C91CF8CA3D00CC4CA1 /* SDLPermissionFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1665C71CF8CA3D00CC4CA1 /* SDLPermissionFilter.m */; };
5D1665CB1CF8CA6700CC4CA1 /* NSNumber+NumberType.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1665CA1CF8CA6700CC4CA1 /* NSNumber+NumberType.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D1665CD1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1665CC1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 5D1BF6AF204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1BF6AD204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.h */; };
- 5D1BF6B0204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1BF6AE204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.m */; };
5D1FF28D213044F9000EB9B4 /* AlertManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF28C213044F9000EB9B4 /* AlertManager.m */; };
5D1FF29C21304515000EB9B4 /* PerformInteractionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29121304513000EB9B4 /* PerformInteractionManager.m */; };
5D1FF29D21304515000EB9B4 /* RPCPermissionsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D1FF29221304513000EB9B4 /* RPCPermissionsManager.m */; };
@@ -2085,6 +2085,8 @@
1FF7DAB91F75B2A800B46C30 /* SDLFocusableItemLocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLFocusableItemLocator.h; sourceTree = "<group>"; };
1FF7DABB1F75B2BF00B46C30 /* SDLFocusableItemLocator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLFocusableItemLocator.m; sourceTree = "<group>"; };
1FF7DABF1F75CF6C00B46C30 /* SDLHapticManagerSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLHapticManagerSpec.m; path = ProxySpecs/SDLHapticManagerSpec.m; sourceTree = "<group>"; };
+ 2B23352E232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SDLWindowCapability+ShowManagerExtensions.h"; sourceTree = "<group>"; };
+ 2B23352F232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SDLWindowCapability+ShowManagerExtensions.m"; sourceTree = "<group>"; };
2BF2F84D20ED004000A26EF2 /* SDLAudioStreamingIndicator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDLAudioStreamingIndicator.h; sourceTree = "<group>"; };
2BF2F84E20ED004000A26EF2 /* SDLAudioStreamingIndicator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAudioStreamingIndicator.m; sourceTree = "<group>"; };
2BF2F85120ED068200A26EF2 /* SDLAudioStreamingIndicatorSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLAudioStreamingIndicatorSpec.m; sourceTree = "<group>"; };
@@ -2145,8 +2147,6 @@
5D1665C71CF8CA3D00CC4CA1 /* SDLPermissionFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLPermissionFilter.m; sourceTree = "<group>"; };
5D1665CA1CF8CA6700CC4CA1 /* NSNumber+NumberType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+NumberType.h"; sourceTree = "<group>"; };
5D1665CC1CF8CA8A00CC4CA1 /* SDLPermissionConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SDLPermissionConstants.h; sourceTree = "<group>"; };
- 5D1BF6AD204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SDLDisplayCapabilities+ShowManagerExtensions.h"; sourceTree = "<group>"; };
- 5D1BF6AE204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SDLDisplayCapabilities+ShowManagerExtensions.m"; sourceTree = "<group>"; };
5D1FF28B213044F9000EB9B4 /* AlertManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AlertManager.h; path = "Example Apps/Example ObjC/AlertManager.h"; sourceTree = SOURCE_ROOT; };
5D1FF28C213044F9000EB9B4 /* AlertManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AlertManager.m; path = "Example Apps/Example ObjC/AlertManager.m"; sourceTree = SOURCE_ROOT; };
5D1FF28E21304513000EB9B4 /* MenuManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuManager.h; path = "Example Apps/Example ObjC/MenuManager.h"; sourceTree = SOURCE_ROOT; };
@@ -3989,8 +3989,8 @@
5D1BF6AA2047429C00D36881 /* Utilities */ = {
isa = PBXGroup;
children = (
- 5D1BF6AD204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.h */,
- 5D1BF6AE204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.m */,
+ 2B23352E232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.h */,
+ 2B23352F232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.m */,
);
name = Utilities;
sourceTree = "<group>";
@@ -6791,7 +6791,6 @@
5D82041A1BCD80BA00D0A41B /* SDLLockScreenConfiguration.h in Headers */,
880E35B52088F75A00181259 /* SDLSystemCapabilityManager.h in Headers */,
5D61FC611A84238C00846EE7 /* SDLChoice.h in Headers */,
- 5D1BF6AF204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.h in Headers */,
5D92937420B5EEA200FCC775 /* SDLPreloadChoicesOperation.h in Headers */,
5D7F87F31CE3C29E002DD7C4 /* SDLFileWrapper.h in Headers */,
5D61FC7C1A84238C00846EE7 /* SDLDeleteInteractionChoiceSetResponse.h in Headers */,
@@ -6889,6 +6888,7 @@
5D61FD951A84238C00846EE7 /* SDLShowResponse.h in Headers */,
5D61FCA31A84238C00846EE7 /* SDLEndAudioPassThru.h in Headers */,
88A795D22106787400056542 /* SDLStaticIconName.h in Headers */,
+ 2B233530232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.h in Headers */,
5D61FCB11A84238C00846EE7 /* SDLGetDTCs.h in Headers */,
5D61FDFF1A84238C00846EE7 /* SDLVehicleDataEventStatus.h in Headers */,
5D61FC5B1A84238C00846EE7 /* SDLChangeRegistration.h in Headers */,
@@ -7457,6 +7457,7 @@
5DBF06241E64A83F00A5CF03 /* SDLLogManager.m in Sources */,
5D61FC401A84238C00846EE7 /* SDLAmbientLightStatus.m in Sources */,
9F425ADB22DD983500BE3245 /* SDLDisplayCapability.m in Sources */,
+ 2B233531232BD8A5002118E5 /* SDLWindowCapability+ShowManagerExtensions.m in Sources */,
88EEC5BC220A327B005AA2F9 /* SDLPublishAppServiceResponse.m in Sources */,
5D61FC951A84238C00846EE7 /* SDLDriverDistractionState.m in Sources */,
5DB996611F28C6ED002D8795 /* SDLControlFramePayloadVideoStartServiceAck.m in Sources */,
@@ -7614,7 +7615,6 @@
88B58DBB222040FF0011B063 /* SDLDirection.m in Sources */,
5D61FD5C1A84238C00846EE7 /* SDLReadDIDResponse.m in Sources */,
884AF950220B488900E22928 /* SDLOnSystemCapabilityUpdated.m in Sources */,
- 5D1BF6B0204742FB00D36881 /* SDLDisplayCapabilities+ShowManagerExtensions.m in Sources */,
1EB59CB4202D9B5F00343A61 /* SDLSeatMemoryActionType.m in Sources */,
5D61FD321A84238C00846EE7 /* SDLPolicyDataParser.m in Sources */,
5D61FC621A84238C00846EE7 /* SDLChoice.m in Sources */,
diff --git a/SmartDeviceLink/SDLChoiceSetManager.h b/SmartDeviceLink/SDLChoiceSetManager.h
index 6dd6122d6..e0c11ac71 100644
--- a/SmartDeviceLink/SDLChoiceSetManager.h
+++ b/SmartDeviceLink/SDLChoiceSetManager.h
@@ -15,6 +15,7 @@
@class SDLChoiceSet;
@class SDLFileManager;
@class SDLKeyboardProperties;
+@class SDLSystemCapabilityManager;
@protocol SDLConnectionManagerType;
@protocol SDLKeyboardDelegate;
@@ -51,9 +52,10 @@ extern SDLChoiceManagerState *const SDLChoiceManagerStateStartupError;
@param connectionManager The connection manager object for sending RPCs
@param fileManager The file manager object for uploading files
+ @param systemCapabilityManager The system capability manager object for reading window capabilities
@return The choice set manager
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager;
/**
Start the manager and prepare to manage choice sets
diff --git a/SmartDeviceLink/SDLChoiceSetManager.m b/SmartDeviceLink/SDLChoiceSetManager.m
index 17b8462a9..793876db7 100644
--- a/SmartDeviceLink/SDLChoiceSetManager.m
+++ b/SmartDeviceLink/SDLChoiceSetManager.m
@@ -17,8 +17,7 @@
#import "SDLCreateInteractionChoiceSet.h"
#import "SDLCreateInteractionChoiceSetResponse.h"
#import "SDLDeleteChoicesOperation.h"
-#import "SDLDisplayCapabilities.h"
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
+#import "SDLDisplayCapability.h"
#import "SDLError.h"
#import "SDLFileManager.h"
#import "SDLGlobals.h"
@@ -38,6 +37,7 @@
#import "SDLSetDisplayLayoutResponse.h"
#import "SDLStateMachine.h"
#import "SDLSystemContext.h"
+#import "SDLSystemCapabilityManager.h"
NS_ASSUME_NONNULL_BEGIN
@@ -58,13 +58,13 @@ typedef NSNumber * SDLChoiceId;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
@property (strong, nonatomic, readonly) SDLStateMachine *stateMachine;
@property (strong, nonatomic) NSOperationQueue *transactionQueue;
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *preloadedMutableChoices;
@property (strong, nonatomic, readonly) NSSet<SDLChoiceCell *> *pendingPreloadChoices;
@@ -85,12 +85,13 @@ UInt16 const ChoiceCellCancelIdMin = 1;
#pragma mark - Lifecycle
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager {
self = [super init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
_stateMachine = [[SDLStateMachine alloc] initWithTarget:self initialState:SDLChoiceManagerStateShutdown states:[self.class sdl_stateTransitionDictionary]];
_transactionQueue = [self sdl_newTransactionQueue];
@@ -102,8 +103,6 @@ UInt16 const ChoiceCellCancelIdMin = 1;
_vrOptional = YES;
_keyboardConfiguration = [self sdl_defaultKeyboardConfiguration];
- [[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_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
return self;
@@ -145,7 +144,6 @@ UInt16 const ChoiceCellCancelIdMin = 1;
- (void)didEnterStateShutdown {
_currentHMILevel = nil;
_currentSystemContext = nil;
- _displayCapabilities = nil;
[self.transactionQueue cancelAllOperations];
self.transactionQueue = [self sdl_newTransactionQueue];
@@ -215,7 +213,9 @@ UInt16 const ChoiceCellCancelIdMin = 1;
[self.pendingMutablePreloadChoices unionSet:choicesToUpload];
// Upload pending preloads
- SDLPreloadChoicesOperation *preloadOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager displayCapabilities:self.displayCapabilities isVROptional:self.isVROptional cellsToPreload:choicesToUpload];
+ // For backward compatibility with Gen38Inch display type head units
+ NSString *displayName = self.systemCapabilityManager.displays.firstObject.displayName;
+ SDLPreloadChoicesOperation *preloadOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager displayName:displayName defaultMainWindowCapability:self.systemCapabilityManager.defaultMainWindowCapability isVROptional:self.isVROptional cellsToPreload:choicesToUpload];
__weak typeof(self) weakSelf = self;
__weak typeof(preloadOp) weakPreloadOp = preloadOp;
@@ -433,32 +433,6 @@ UInt16 const ChoiceCellCancelIdMin = 1;
#pragma mark - RPC Responses / Notifications
-- (void)sdl_registerResponse:(SDLRPCResponseNotification *)notification {
- SDLRegisterAppInterfaceResponse *response = (SDLRegisterAppInterfaceResponse *)notification.response;
-
- if (!response.success.boolValue) { return; }
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
- if (response.displayCapabilities == nil) {
- SDLLogE(@"RegisterAppInterface succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.displayCapabilities = response.displayCapabilities;
-#pragma clang diagnostic pop
-}
-
-- (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification {
- SDLSetDisplayLayoutResponse *response = (SDLSetDisplayLayoutResponse *)notification.response;
- if (!response.success.boolValue) { return; }
- if (response.displayCapabilities == nil) {
- SDLLogE(@"SetDisplayLayout succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.displayCapabilities = response.displayCapabilities;
-}
-
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
// We can only present a choice set if we're in FULL
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification;
diff --git a/SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.h b/SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.h
deleted file mode 100644
index 375fc0e2a..000000000
--- a/SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.h
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// SDLDisplayCapabilities+ShowManagerExtensions.h
-// SmartDeviceLink
-//
-// Created by Joel Fischer on 2/28/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
-//
-
-#import "SDLDisplayCapabilities.h"
-#import "SDLImageFieldName.h"
-#import "SDLTextFieldName.h"
-
-@interface SDLDisplayCapabilities (ShowManagerExtensions)
-
-@property (assign, nonatomic, readonly) NSUInteger maxNumberOfMainFieldLines;
-
-- (BOOL)hasTextFieldOfName:(SDLTextFieldName)name;
-- (BOOL)hasImageFieldOfName:(SDLImageFieldName)name;
-
-@end
diff --git a/SmartDeviceLink/SDLLifecycleManager.m b/SmartDeviceLink/SDLLifecycleManager.m
index ff90d3171..bdeee35f1 100644
--- a/SmartDeviceLink/SDLLifecycleManager.m
+++ b/SmartDeviceLink/SDLLifecycleManager.m
@@ -17,7 +17,6 @@
#import "SDLConfiguration.h"
#import "SDLConnectionManagerType.h"
#import "SDLLogMacros.h"
-#import "SDLDisplayCapabilities.h"
#import "SDLError.h"
#import "SDLFile.h"
#import "SDLFileManager.h"
@@ -57,6 +56,7 @@
#import "SDLSystemCapabilityManager.h"
#import "SDLUnregisterAppInterface.h"
#import "SDLVersion.h"
+#import "SDLWindowCapability.h"
NS_ASSUME_NONNULL_BEGIN
@@ -139,8 +139,8 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
_fileManager = [[SDLFileManager alloc] initWithConnectionManager:self configuration:_configuration.fileManagerConfig];
_permissionManager = [[SDLPermissionManager alloc] init];
_lockScreenManager = [[SDLLockScreenManager alloc] initWithConfiguration:_configuration.lockScreenConfig notificationDispatcher:_notificationDispatcher presenter:[[SDLLockScreenPresenter alloc] init]];
- _screenManager = [[SDLScreenManager alloc] initWithConnectionManager:self fileManager:_fileManager];
_systemCapabilityManager = [[SDLSystemCapabilityManager alloc] initWithConnectionManager:self];
+ _screenManager = [[SDLScreenManager alloc] initWithConnectionManager:self fileManager:_fileManager systemCapabilityManager:_systemCapabilityManager];
if ([configuration.lifecycleConfig.appType isEqualToEnum:SDLAppHMITypeNavigation] ||
[configuration.lifecycleConfig.appType isEqualToEnum:SDLAppHMITypeProjection] ||
@@ -522,7 +522,7 @@ NSString *const BackgroundTaskTransportName = @"com.sdl.transport.backgroundTask
// If no app icon was set, just move on to ready
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- if (appIcon == nil || !self.registerResponse.displayCapabilities.graphicSupported.boolValue) {
+ if (appIcon == nil || ![self.systemCapabilityManager.defaultMainWindowCapability.imageTypeSupported containsObject:SDLImageTypeDynamic]) {
completion();
return;
}
diff --git a/SmartDeviceLink/SDLLogFileModuleMap.m b/SmartDeviceLink/SDLLogFileModuleMap.m
index e9e2a56ba..53efda21e 100644
--- a/SmartDeviceLink/SDLLogFileModuleMap.m
+++ b/SmartDeviceLink/SDLLogFileModuleMap.m
@@ -60,7 +60,7 @@
}
+ (SDLLogFileModule *)sdl_lifecycleManagerModule {
- return [SDLLogFileModule moduleWithName:@"Lifecycle" files:[NSSet setWithArray:@[@"SDLLifecycleManager", @"SDLManager", @"SDLAsynchronousOperation"]]];
+ return [SDLLogFileModule moduleWithName:@"Lifecycle" files:[NSSet setWithArray:@[@"SDLLifecycleManager", @"SDLManager", @"SDLAsynchronousOperation", @"SDLBackgroundTaskManager"]]];
}
+ (SDLLogFileModule *)sdl_systemCapabilityModule {
diff --git a/SmartDeviceLink/SDLMenuManager.h b/SmartDeviceLink/SDLMenuManager.h
index 475c4195d..84a75170e 100644
--- a/SmartDeviceLink/SDLMenuManager.h
+++ b/SmartDeviceLink/SDLMenuManager.h
@@ -11,6 +11,7 @@
@class SDLFileManager;
@class SDLMenuCell;
+@class SDLSystemCapabilityManager;
@class SDLVoiceCommand;
@protocol SDLConnectionManagerType;
@@ -26,7 +27,7 @@ typedef void(^SDLMenuUpdateCompletionHandler)(NSError *__nullable error);
@interface SDLMenuManager : NSObject
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager;
/**
* Stops the manager. This method is used internally.
diff --git a/SmartDeviceLink/SDLMenuManager.m b/SmartDeviceLink/SDLMenuManager.m
index bbe261d57..be83af2e3 100644
--- a/SmartDeviceLink/SDLMenuManager.m
+++ b/SmartDeviceLink/SDLMenuManager.m
@@ -14,8 +14,8 @@
#import "SDLConnectionManagerType.h"
#import "SDLDeleteCommand.h"
#import "SDLDeleteSubMenu.h"
-#import "SDLDisplayCapabilities.h"
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
+#import "SDLDisplayCapability.h"
+#import "SDLDisplayType.h"
#import "SDLError.h"
#import "SDLFileManager.h"
#import "SDLGlobals.h"
@@ -34,6 +34,9 @@
#import "SDLSetDisplayLayoutResponse.h"
#import "SDLScreenManager.h"
#import "SDLShowAppMenu.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ShowManagerExtensions.h"
#import "SDLVersion.h"
#import "SDLVoiceCommand.h"
@@ -50,10 +53,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
@property (assign, nonatomic) BOOL hasQueuedUpdate;
@@ -79,20 +82,19 @@ UInt32 const MenuCellIdMin = 1;
_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];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_commandNotification:) name:SDLDidReceiveCommandNotification object:nil];
return self;
}
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(nonnull SDLSystemCapabilityManager *)systemCapabilityManager {
self = [self init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
return self;
}
@@ -104,7 +106,6 @@ UInt32 const MenuCellIdMin = 1;
_currentHMILevel = nil;
_currentSystemContext = SDLSystemContextMain;
- _displayCapabilities = nil;
_inProgressUpdate = nil;
_hasQueuedUpdate = NO;
_waitingOnHMIUpdate = NO;
@@ -375,7 +376,7 @@ UInt32 const MenuCellIdMin = 1;
NSArray<SDLRPCRequest *> *mainMenuCommands = nil;
NSArray<SDLRPCRequest *> *subMenuCommands = nil;
- if ([self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells].count > 0 || ![self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
+ if ([self sdl_findAllArtworksToBeUploadedFromCells:self.menuCells].count > 0 || ![self.systemCapabilityManager.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
// Send artwork-less menu
mainMenuCommands = [self sdl_mainMenuCommandsForCells:updatedMenu withArtwork:NO usingIndexesFrom:menu];
subMenuCommands = [self sdl_subMenuCommandsForCells:updatedMenu withArtwork:NO];
@@ -428,7 +429,7 @@ UInt32 const MenuCellIdMin = 1;
case SDLDynamicMenuUpdatesModeOnWithCompatibility:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- return ![self.displayCapabilities.displayType isEqualToEnum:SDLDisplayTypeGen38Inch];
+ return ![self.systemCapabilityManager.displays.firstObject.displayName isEqualToString:SDLDisplayTypeGen38Inch];
#pragma clang diagnostic pop
}
@@ -437,7 +438,7 @@ UInt32 const MenuCellIdMin = 1;
#pragma mark Artworks
- (NSArray<SDLArtwork *> *)sdl_findAllArtworksToBeUploadedFromCells:(NSArray<SDLMenuCell *> *)cells {
- if (![self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
+ if (![self.systemCapabilityManager.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameCommandIcon]) {
return @[];
}
@@ -589,32 +590,6 @@ UInt32 const MenuCellIdMin = 1;
[self sdl_callHandlerForCells:self.menuCells command:onCommand];
}
-- (void)sdl_registerResponse:(SDLRPCResponseNotification *)notification {
- SDLRegisterAppInterfaceResponse *response = (SDLRegisterAppInterfaceResponse *)notification.response;
-
- if (!response.success.boolValue) { return; }
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
- if (response.displayCapabilities == nil) {
- SDLLogE(@"RegisterAppInterface succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.displayCapabilities = response.displayCapabilities;
-#pragma clang diagnostic pop
-}
-
-- (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification {
- SDLSetDisplayLayoutResponse *response = (SDLSetDisplayLayoutResponse *)notification.response;
- if (!response.success.boolValue) { return; }
- if (response.displayCapabilities == nil) {
- SDLLogE(@"SetDisplayLayout succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.displayCapabilities = response.displayCapabilities;
-}
-
- (void)sdl_hmiStatusNotification:(SDLRPCNotificationNotification *)notification {
SDLOnHMIStatus *hmiStatus = (SDLOnHMIStatus *)notification.notification;
diff --git a/SmartDeviceLink/SDLPreloadChoicesOperation.h b/SmartDeviceLink/SDLPreloadChoicesOperation.h
index cc6c7ae30..b62ff5296 100644
--- a/SmartDeviceLink/SDLPreloadChoicesOperation.h
+++ b/SmartDeviceLink/SDLPreloadChoicesOperation.h
@@ -11,8 +11,8 @@
#import "SDLAsynchronousOperation.h"
@class SDLChoiceCell;
-@class SDLDisplayCapabilities;
@class SDLFileManager;
+@class SDLWindowCapability;
@protocol SDLConnectionManagerType;
@@ -29,7 +29,7 @@ typedef NS_ENUM(NSUInteger, SDLPreloadChoicesOperationState) {
@property (assign, nonatomic) SDLPreloadChoicesOperationState currentState;
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayCapabilities:(SDLDisplayCapabilities *)displayCapabilities isVROptional:(BOOL)isVROptional cellsToPreload:(NSSet<SDLChoiceCell *> *)cells;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName defaultMainWindowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSSet<SDLChoiceCell *> *)cells;
- (BOOL)removeChoicesFromUpload:(NSSet<SDLChoiceCell *> *)choices;
diff --git a/SmartDeviceLink/SDLPreloadChoicesOperation.m b/SmartDeviceLink/SDLPreloadChoicesOperation.m
index d1eeeccf5..ddb0e36c8 100644
--- a/SmartDeviceLink/SDLPreloadChoicesOperation.m
+++ b/SmartDeviceLink/SDLPreloadChoicesOperation.m
@@ -13,12 +13,13 @@
#import "SDLConnectionManagerType.h"
#import "SDLCreateInteractionChoiceSet.h"
#import "SDLCreateInteractionChoiceSetResponse.h"
-#import "SDLDisplayCapabilities.h"
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
+#import "SDLDisplayType.h"
#import "SDLError.h"
#import "SDLFileManager.h"
#import "SDLImage.h"
#import "SDLLogMacros.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ShowManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -32,7 +33,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic) NSUUID *operationId;
@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *cellsToUpload;
-@property (strong, nonatomic) SDLDisplayCapabilities *displayCapabilities;
+@property (strong, nonatomic) SDLWindowCapability *defaultMainWindowCapability;
+@property (strong, nonatomic) NSString *displayName;
@property (assign, nonatomic, getter=isVROptional) BOOL vrOptional;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@@ -43,13 +45,14 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLPreloadChoicesOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayCapabilities:(SDLDisplayCapabilities *)displayCapabilities isVROptional:(BOOL)isVROptional cellsToPreload:(NSSet<SDLChoiceCell *> *)cells {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager displayName:(NSString *)displayName defaultMainWindowCapability:(SDLWindowCapability *)defaultMainWindowCapability isVROptional:(BOOL)isVROptional cellsToPreload:(NSSet<SDLChoiceCell *> *)cells {
self = [super init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
- _displayCapabilities = displayCapabilities;
+ _displayName = displayName;
+ _defaultMainWindowCapability = defaultMainWindowCapability;
_vrOptional = isVROptional;
_cellsToUpload = [cells mutableCopy];
_operationId = [NSUUID UUID];
@@ -84,11 +87,11 @@ NS_ASSUME_NONNULL_BEGIN
NSMutableArray<SDLArtwork *> *artworksToUpload = [NSMutableArray arrayWithCapacity:self.cellsToUpload.count];
for (SDLChoiceCell *cell in self.cellsToUpload) {
- if ([self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameChoiceImage]
+ if ([self.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage]
&& [self sdl_artworkNeedsUpload:cell.artwork]) {
[artworksToUpload addObject:cell.artwork];
}
- if ([self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage]
+ if ([self.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage]
&& [self sdl_artworkNeedsUpload:cell.secondaryArtwork]) {
[artworksToUpload addObject:cell.secondaryArtwork];
}
@@ -164,7 +167,7 @@ NS_ASSUME_NONNULL_BEGIN
NSString *menuName = nil;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- if ([self.displayCapabilities.displayType isEqualToEnum:SDLDisplayTypeGen38Inch] || [self.displayCapabilities hasTextFieldOfName:SDLTextFieldNameMenuName]) {
+ if ([self.displayName isEqualToString:SDLDisplayTypeGen38Inch] || [self.defaultMainWindowCapability hasTextFieldOfName:SDLTextFieldNameMenuName]) {
menuName = cell.text;
}
#pragma clang diagnostic pop
@@ -174,11 +177,11 @@ NS_ASSUME_NONNULL_BEGIN
return nil;
}
- NSString *secondaryText = [self.displayCapabilities hasTextFieldOfName:SDLTextFieldNameSecondaryText] ? cell.secondaryText : nil;
- NSString *tertiaryText = [self.displayCapabilities hasTextFieldOfName:SDLTextFieldNameTertiaryText] ? cell.tertiaryText : nil;
+ NSString *secondaryText = [self.defaultMainWindowCapability hasTextFieldOfName:SDLTextFieldNameSecondaryText] ? cell.secondaryText : nil;
+ NSString *tertiaryText = [self.defaultMainWindowCapability hasTextFieldOfName:SDLTextFieldNameTertiaryText] ? cell.tertiaryText : nil;
- SDLImage *image = ([self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameChoiceImage] && cell.artwork != nil) ? cell.artwork.imageRPC : nil;
- SDLImage *secondaryImage = ([self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage] && cell.secondaryArtwork != nil) ? cell.secondaryArtwork.imageRPC : nil;
+ SDLImage *image = ([self.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameChoiceImage] && cell.artwork != nil) ? cell.artwork.imageRPC : nil;
+ SDLImage *secondaryImage = ([self.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameChoiceSecondaryImage] && cell.secondaryArtwork != nil) ? cell.secondaryArtwork.imageRPC : nil;
SDLChoice *choice = [[SDLChoice alloc] initWithId:cell.choiceId menuName:(NSString *_Nonnull)menuName vrCommands:(NSArray<NSString *> * _Nonnull)vrCommands image:image secondaryText:secondaryText secondaryImage:secondaryImage tertiaryText:tertiaryText];
diff --git a/SmartDeviceLink/SDLScreenManager.h b/SmartDeviceLink/SDLScreenManager.h
index 78724ddb3..15d159de4 100644
--- a/SmartDeviceLink/SDLScreenManager.h
+++ b/SmartDeviceLink/SDLScreenManager.h
@@ -21,6 +21,7 @@
@class SDLKeyboardProperties;
@class SDLMenuCell;
@class SDLSoftButtonObject;
+@class SDLSystemCapabilityManager;
@class SDLVoiceCommand;
@protocol SDLConnectionManagerType;
@@ -166,10 +167,10 @@ If set to `SDLDynamicMenuUpdatesModeForceOff`, menu updates will work the legacy
@param connectionManager The connection manager used to send RPCs
@param fileManager The file manager used to upload files
+ @param systemCapabilityManager The system capability manager object for reading window capabilities
@return The screen manager
*/
-
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager;
/**
Starts the manager and all sub-managers
diff --git a/SmartDeviceLink/SDLScreenManager.m b/SmartDeviceLink/SDLScreenManager.m
index 5e0d418a9..ea9ea5676 100644
--- a/SmartDeviceLink/SDLScreenManager.m
+++ b/SmartDeviceLink/SDLScreenManager.m
@@ -13,6 +13,7 @@
#import "SDLSoftButtonManager.h"
#import "SDLTextAndGraphicManager.h"
#import "SDLVoiceCommandManager.h"
+
NS_ASSUME_NONNULL_BEGIN
@interface SDLScreenManager()
@@ -25,28 +26,32 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
@end
@implementation SDLScreenManager
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager {
self = [super init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
- _textAndGraphicManager = [[SDLTextAndGraphicManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager];
- _softButtonManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager];
- _menuManager = [[SDLMenuManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager];
+ _textAndGraphicManager = [[SDLTextAndGraphicManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
+ _softButtonManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
+ _menuManager = [[SDLMenuManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
_voiceCommandMenuManager = [[SDLVoiceCommandManager alloc] initWithConnectionManager:connectionManager];
- _choiceSetManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager];
+ _choiceSetManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:connectionManager fileManager:fileManager systemCapabilityManager:systemCapabilityManager];
return self;
}
- (void)startWithCompletionHandler:(void (^)(NSError * _Nullable))handler {
+ [self.textAndGraphicManager start];
+ [self.softButtonManager start];
[self.choiceSetManager start];
handler(nil);
diff --git a/SmartDeviceLink/SDLSoftButtonManager.h b/SmartDeviceLink/SDLSoftButtonManager.h
index dfd3d7104..d7a6b4506 100644
--- a/SmartDeviceLink/SDLSoftButtonManager.h
+++ b/SmartDeviceLink/SDLSoftButtonManager.h
@@ -13,6 +13,7 @@
@class SDLFileManager;
@class SDLSoftButtonObject;
@class SDLSoftButtonState;
+@class SDLSystemCapabilityManager;
NS_ASSUME_NONNULL_BEGIN
@@ -47,9 +48,13 @@ typedef void(^SDLSoftButtonUpdateCompletionHandler)(NSError *__nullable error);
@param connectionManager The manager that forwards RPCs
@param fileManager The manager that updates images
+ @param systemCapabilityManager The system capability manager object for reading window capabilities
@return A new instance of a soft button manager
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager;
+
+/// Starts the manager. This method is used internally.
+- (void)start;
/**
* Stops the manager. This method is used internally.
diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m
index 6a79c811d..a8dd84629 100644
--- a/SmartDeviceLink/SDLSoftButtonManager.m
+++ b/SmartDeviceLink/SDLSoftButtonManager.m
@@ -9,7 +9,6 @@
#import "SDLSoftButtonManager.h"
#import "SDLConnectionManagerType.h"
-#import "SDLDisplayCapabilities.h"
#import "SDLError.h"
#import "SDLFileManager.h"
#import "SDLLogMacros.h"
@@ -26,6 +25,10 @@
#import "SDLSoftButtonReplaceOperation.h"
#import "SDLSoftButtonState.h"
#import "SDLSoftButtonTransitionOperation.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLWindowCapability.h"
+#import "SDLSystemCapability.h"
+#import "SDLDisplayCapability.h"
NS_ASSUME_NONNULL_BEGIN
@@ -40,12 +43,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
@property (copy, nonatomic, nullable) SDLHMILevel currentLevel;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
-@property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities;
@property (strong, nonatomic) NSMutableArray<SDLAsynchronousOperation *> *batchQueue;
@@ -53,34 +56,38 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLSoftButtonManager
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager{
self = [super init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
_softButtonObjects = @[];
_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];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
return self;
}
+- (void)start {
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate:)];
+}
+
- (void)stop {
_softButtonObjects = @[];
_currentMainField1 = nil;
_currentLevel = nil;
- _displayCapabilities = nil;
- _softButtonCapabilities = nil;
+ _windowCapability = nil;
[_transactionQueue cancelAllOperations];
self.transactionQueue = [self sdl_newTransactionQueue];
+
+ [self.systemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self];
}
- (NSOperationQueue *)sdl_newTransactionQueue {
@@ -121,7 +128,7 @@ NS_ASSUME_NONNULL_BEGIN
_softButtonObjects = softButtonObjects;
- SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:_softButtonObjects mainField1:self.currentMainField1];
+ SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.windowCapability.softButtonCapabilities.firstObject softButtonObjects:_softButtonObjects mainField1:self.currentMainField1];
if (self.isBatchingUpdates) {
[self.batchQueue removeAllObjects];
@@ -133,7 +140,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (void)sdl_transitionSoftButton:(SDLSoftButtonObject *)softButton {
- SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.softButtonCapabilities softButtons:self.softButtonObjects mainField1:self.currentMainField1];
+ SDLSoftButtonTransitionOperation *op = [[SDLSoftButtonTransitionOperation alloc] initWithConnectionManager:self.connectionManager capabilities:self.windowCapability.softButtonCapabilities.firstObject softButtons:self.softButtonObjects mainField1:self.currentMainField1];
if (self.isBatchingUpdates) {
for (SDLAsynchronousOperation *sbOperation in self.batchQueue) {
@@ -190,36 +197,12 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - RPC Responses
-- (void)sdl_registerResponse:(SDLRPCResponseNotification *)notification {
- SDLRegisterAppInterfaceResponse *response = (SDLRegisterAppInterfaceResponse *)notification.response;
-
- if (!response.success.boolValue) { return; }
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
- if (response.displayCapabilities == nil) {
- SDLLogE(@"RegisterAppInterface succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.softButtonCapabilities = response.softButtonCapabilities ? response.softButtonCapabilities.firstObject : nil;
- self.displayCapabilities = response.displayCapabilities;
-#pragma clang diagnostic pop
-}
-
-- (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification {
- SDLSetDisplayLayoutResponse *response = (SDLSetDisplayLayoutResponse *)notification.response;
- if (!response.success.boolValue) { return; }
- if (response.displayCapabilities == nil) {
- SDLLogE(@"SetDisplayLayout succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.softButtonCapabilities = response.softButtonCapabilities ? response.softButtonCapabilities.firstObject : nil;
- self.displayCapabilities = response.displayCapabilities;
+- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
+ self.windowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
// Auto-send an updated Show to account for changes to the capabilities
if (self.softButtonObjects.count > 0) {
- SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.softButtonCapabilities softButtonObjects:self.softButtonObjects mainField1:self.currentMainField1];
+ SDLSoftButtonReplaceOperation *op = [[SDLSoftButtonReplaceOperation alloc] initWithConnectionManager:self.connectionManager fileManager:self.fileManager capabilities:self.windowCapability.softButtonCapabilities.firstObject softButtonObjects:self.softButtonObjects mainField1:self.currentMainField1];
[self.transactionQueue addOperation:op];
}
}
diff --git a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m
index 06ee8b5be..7f377a620 100644
--- a/SmartDeviceLink/SDLSoftButtonReplaceOperation.m
+++ b/SmartDeviceLink/SDLSoftButtonReplaceOperation.m
@@ -10,7 +10,6 @@
#import "SDLArtwork.h"
#import "SDLConnectionManagerType.h"
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
#import "SDLFileManager.h"
#import "SDLLogMacros.h"
#import "SDLShow.h"
diff --git a/SmartDeviceLink/SDLSystemCapability.h b/SmartDeviceLink/SDLSystemCapability.h
index eda4e535b..f0ac7b2d8 100755
--- a/SmartDeviceLink/SDLSystemCapability.h
+++ b/SmartDeviceLink/SDLSystemCapability.h
@@ -67,6 +67,14 @@ NS_ASSUME_NONNULL_BEGIN
- (instancetype)initWithRemoteControlCapability:(SDLRemoteControlCapabilities *)capability;
/**
+ Convenience init for DisplayCapability list
+
+ @param capabilities Contains capabilities related to a physical screen and any associated windows
+ @return A SDLSystemCapability object
+ */
+- (instancetype)initWithDisplayCapabilities:(NSArray<SDLDisplayCapability *> *)capabilities;
+
+/**
* Convenience init for a Remote Control Capability
*
* @param capability Describes information about the locations of each seat
diff --git a/SmartDeviceLink/SDLSystemCapability.m b/SmartDeviceLink/SDLSystemCapability.m
index af5807078..3936e463b 100755
--- a/SmartDeviceLink/SDLSystemCapability.m
+++ b/SmartDeviceLink/SDLSystemCapability.m
@@ -83,6 +83,18 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (instancetype)initWithDisplayCapabilities:(NSArray<SDLDisplayCapability *> *)capabilities {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+
+ self.systemCapabilityType = SDLSystemCapabilityTypeDisplays;
+ self.displayCapabilities = [capabilities copy];
+
+ return self;
+}
+
- (instancetype)initWithSeatLocationCapability:(SDLSeatLocationCapability *)capability {
self = [self init];
if (!self) {
diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.h b/SmartDeviceLink/SDLSystemCapabilityManager.h
index e2cea4feb..f5695b3bf 100644
--- a/SmartDeviceLink/SDLSystemCapabilityManager.h
+++ b/SmartDeviceLink/SDLSystemCapabilityManager.h
@@ -17,6 +17,7 @@
@class SDLAppServicesCapabilities;
@class SDLAudioPassThruCapabilities;
@class SDLButtonCapabilities;
+@class SDLDisplayCapability;
@class SDLDisplayCapabilities;
@class SDLHMICapabilities;
@class SDLNavigationCapability;
@@ -28,6 +29,7 @@
@class SDLSystemCapability;
@class SDLSystemCapabilityManager;
@class SDLVideoStreamingCapability;
+@class SDLWindowCapability;
@protocol SDLConnectionManagerType;
@@ -59,11 +61,20 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability);
@property (assign, nonatomic, readonly) BOOL supportsSubscriptions;
/**
+ * Provides window capabilities of all displays connected with SDL. By default, one display is connected and supported which includes window capability information of the default main window of the display. May be nil if the system has not provided display and window capability information yet.
+ *
+ * @see SDLDisplayCapability
+ *
+ * Optional, @since SDL 6.0
+ */
+@property (nullable, strong, nonatomic, readonly) NSArray<SDLDisplayCapability *> *displays;
+
+/**
* @see SDLDisplayCapabilities
*
* Optional
*/
-@property (nullable, strong, nonatomic, readonly) SDLDisplayCapabilities *displayCapabilities;
+@property (nullable, strong, nonatomic, readonly) SDLDisplayCapabilities *displayCapabilities __deprecated_msg("Use displays, windowCapabilityWithID: or defaultMainWindowCapability instead to access capabilities of a display/window.");
/**
* @see SDLHMICapabilities
@@ -79,14 +90,14 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability);
*
* Optional, Array of length 1 - 100, of SDLSoftButtonCapabilities
*/
-@property (nullable, copy, nonatomic, readonly) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
+@property (nullable, copy, nonatomic, readonly) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities __deprecated_msg("Use displays, windowCapabilityWithID: or defaultMainWindowCapability instead to access soft button capabilities of a window.");
/**
* @see SDLButtonCapabilities
*
* Optional, Array of length 1 - 100, of SDLButtonCapabilities
*/
-@property (nullable, copy, nonatomic, readonly) NSArray<SDLButtonCapabilities *> *buttonCapabilities;
+@property (nullable, copy, nonatomic, readonly) NSArray<SDLButtonCapabilities *> *buttonCapabilities __deprecated_msg("Use displays, windowCapabilityWithID: or defaultMainWindowCapability instead to access button capabilities of a window.");
/**
* If returned, the platform supports custom on-screen Presets
@@ -95,7 +106,7 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability);
*
* Optional
*/
-@property (nullable, strong, nonatomic, readonly) SDLPresetBankCapabilities *presetBankCapabilities;
+@property (nullable, strong, nonatomic, readonly) SDLPresetBankCapabilities *presetBankCapabilities __deprecated_msg("Use displays, windowCapabilityWithID: or defaultMainWindowCapability instead to access preset bank capabilities of a window.");
/**
* @see SDLHMIZoneCapabilities
@@ -193,6 +204,14 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability);
*/
@property (nullable, strong, nonatomic, readonly) SDLSeatLocationCapability *seatLocationCapability;
+
+/**
+ * Returns the window capability object of the default main window which is always pre-created by the connected system. This is a convenience method for easily accessing the capabilities of the default main window.
+ *
+ * @returns The window capability object representing the default main window capabilities or nil if no window capabilities exist.
+ */
+@property (nullable, strong, nonatomic, readonly) SDLWindowCapability *defaultMainWindowCapability;
+
/**
Init is unavailable. Dependencies must be injected using initWithConnectionManager:
@@ -259,6 +278,14 @@ typedef void (^SDLCapabilityUpdateHandler)(SDLSystemCapability *capability);
*/
- (void)unsubscribeFromCapabilityType:(SDLSystemCapabilityType)type withObserver:(id)observer;
+/**
+ * Returns the window capability object of the primary display with the specified window ID. This is a convenient method to easily access capabilities of windows for instance widget windows of the main display.
+ *
+ * @param windowID The ID of the window to get capabilities
+ * @returns The window capability object representing the window capabilities of the window with the specified window ID or nil if the window is not known or no window capabilities exist.
+ */
+- (nullable SDLWindowCapability *)windowCapabilityWithWindowID:(NSUInteger)windowID;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSystemCapabilityManager.m b/SmartDeviceLink/SDLSystemCapabilityManager.m
index 04a298f22..cf1a9e19a 100644
--- a/SmartDeviceLink/SDLSystemCapabilityManager.m
+++ b/SmartDeviceLink/SDLSystemCapabilityManager.m
@@ -12,6 +12,8 @@
#import "SDLAppServiceRecord.h"
#import "SDLAppServicesCapabilities.h"
#import "SDLConnectionManagerType.h"
+#import "SDLDisplayCapabilities.h"
+#import "SDLDisplayCapability.h"
#import "SDLError.h"
#import "SDLGenericResponse.h"
#import "SDLGetSystemCapability.h"
@@ -34,7 +36,8 @@
#import "SDLSystemCapabilityObserver.h"
#import "SDLVersion.h"
#import "SDLVideoStreamingCapability.h"
-
+#import "SDLWindowCapability.h"
+#import "SDLWindowTypeCapabilities.h"
NS_ASSUME_NONNULL_BEGIN
@@ -44,6 +47,7 @@ typedef NSString * SDLServiceID;
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
+@property (nullable, strong, nonatomic, readwrite) NSArray<SDLDisplayCapability *> *displays;
@property (nullable, strong, nonatomic, readwrite) SDLDisplayCapabilities *displayCapabilities;
@property (nullable, strong, nonatomic, readwrite) SDLHMICapabilities *hmiCapabilities;
@property (nullable, copy, nonatomic, readwrite) NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities;
@@ -70,6 +74,8 @@ typedef NSString * SDLServiceID;
@property (assign, nonatomic) BOOL isFirstHMILevelFull;
+@property (assign, nonatomic) BOOL shouldConvertDeprecatedDisplayCapabilities;
+
@end
@implementation SDLSystemCapabilityManager
@@ -84,6 +90,7 @@ typedef NSString * SDLServiceID;
_connectionManager = manager;
_isFirstHMILevelFull = NO;
+ _shouldConvertDeprecatedDisplayCapabilities = YES;
_appServicesCapabilitiesDictionary = [NSMutableDictionary dictionary];
_capabilityObservers = [NSMutableDictionary dictionary];
@@ -133,6 +140,7 @@ typedef NSString * SDLServiceID;
}
_isFirstHMILevelFull = NO;
+ _shouldConvertDeprecatedDisplayCapabilities = YES;
}
#pragma mark - Getters
@@ -148,7 +156,7 @@ typedef NSString * SDLServiceID;
/**
* Registers for notifications and responses from Core
*/
--(void)sdl_registerForNotifications {
+- (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];
@@ -161,45 +169,59 @@ typedef NSString * SDLServiceID;
*
* @param notification The `RegisterAppInterfaceResponse` response received from Core
*/
-
- (void)sdl_registerResponse:(SDLRPCResponseNotification *)notification {
SDLRegisterAppInterfaceResponse *response = (SDLRegisterAppInterfaceResponse *)notification.response;
if (!response.success.boolValue) { return; }
+
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
self.displayCapabilities = response.displayCapabilities;
-#pragma clang diagnostic pop
- self.hmiCapabilities = response.hmiCapabilities;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
self.softButtonCapabilities = response.softButtonCapabilities;
self.buttonCapabilities = response.buttonCapabilities;
self.presetBankCapabilities = response.presetBankCapabilities;
#pragma clang diagnostic pop
+
+ self.hmiCapabilities = response.hmiCapabilities;
self.hmiZoneCapabilities = response.hmiZoneCapabilities;
self.speechCapabilities = response.speechCapabilities;
self.prerecordedSpeechCapabilities = response.prerecordedSpeech;
self.vrCapability = (response.vrCapabilities.count > 0 && [response.vrCapabilities.firstObject isEqualToEnum:SDLVRCapabilitiesText]) ? YES : NO;
self.audioPassThruCapabilities = response.audioPassThruCapabilities;
self.pcmStreamCapability = response.pcmStreamCapabilities;
+
+ self.shouldConvertDeprecatedDisplayCapabilities = YES;
+ self.displays = [self sdl_createDisplayCapabilityListFromRegisterResponse:response];
+
+ // call the observers in case the new display capability list is created from deprecated types
+ SDLSystemCapability *systemCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:self.displays];
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:nil];
}
-
-
-
/**
* Called when a `SetDisplayLayoutResponse` response is received from Core. If the template was set successfully, the the new capabilities for the template are saved.
*
* @param notification The `SetDisplayLayoutResponse` response received from Core
*/
- (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
SDLSetDisplayLayoutResponse *response = (SDLSetDisplayLayoutResponse *)notification.response;
+#pragma clang diagnostic pop
if (!response.success.boolValue) { return; }
+ // If we've received a display capability update then we should not convert our deprecated display capabilities and we should just return
+ if (!self.shouldConvertDeprecatedDisplayCapabilities) { return; }
+
self.displayCapabilities = response.displayCapabilities;
self.buttonCapabilities = response.buttonCapabilities;
self.softButtonCapabilities = response.softButtonCapabilities;
self.presetBankCapabilities = response.presetBankCapabilities;
+
+ self.displays = [self sdl_createDisplayCapabilityListFromSetDisplayLayoutResponse:response];
+
+ // Call the observers in case the new display capability list is created from deprecated types
+ SDLSystemCapability *systemCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:self.displays];
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:nil];
}
@@ -243,7 +265,126 @@ typedef NSString * SDLServiceID;
[self sdl_subscribeToSystemCapabilityUpdates];
}
-#pragma mark - System Capabilities
+#pragma mark - Window And Display Capabilities
+
+- (nullable SDLWindowCapability *)windowCapabilityWithWindowID:(NSUInteger)windowID {
+ NSArray<SDLDisplayCapability *> *capabilities = self.displays;
+ if (capabilities == nil || capabilities.count == 0) {
+ return nil;
+ }
+
+ SDLDisplayCapability *mainDisplay = capabilities.firstObject;
+ for (SDLWindowCapability *windowCapability in mainDisplay.windowCapabilities) {
+ NSUInteger currentWindowID = windowCapability.windowID != nil ? windowCapability.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
+ if (currentWindowID == windowID) {
+ return windowCapability;
+ }
+ }
+ return nil;
+}
+
+- (nullable SDLWindowCapability *)defaultMainWindowCapability {
+ return [self windowCapabilityWithWindowID:SDLPredefinedWindowsDefaultWindow];
+}
+
+#pragma mark Convert Deprecated to New
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+/// Convert the capabilities from a `RegisterAppInterfaceResponse` into a new-style `DisplayCapability` for the main display.
+/// @param rpc The `RegisterAppInterfaceResponse` RPC
+- (NSArray<SDLDisplayCapability *> *)sdl_createDisplayCapabilityListFromRegisterResponse:(SDLRegisterAppInterfaceResponse *)rpc {
+ return [self sdl_createDisplayCapabilityListFromDeprecatedDisplayCapabilities:rpc.displayCapabilities buttons:rpc.buttonCapabilities softButtons:rpc.softButtonCapabilities];
+}
+
+- (NSArray<SDLDisplayCapability *> *)sdl_createDisplayCapabilityListFromSetDisplayLayoutResponse:(SDLSetDisplayLayoutResponse *)rpc {
+ return [self sdl_createDisplayCapabilityListFromDeprecatedDisplayCapabilities:rpc.displayCapabilities buttons:rpc.buttonCapabilities softButtons:rpc.softButtonCapabilities];
+}
+#pragma clang diagnostic pop
+
+/// Creates a "new-style" display capability from the "old-style" `SDLDisplayCapabilities` object and other "old-style" objects that were returned in `RegisterAppInterfaceResponse` and `SetDisplayLayoutResponse`
+/// @param display The old-style `SDLDisplayCapabilities` object to convert
+/// @param buttons The old-style `SDLButtonCapabilities` object to convert
+/// @param softButtons The old-style `SDLSoftButtonCapabilities` to convert
+- (NSArray<SDLDisplayCapability *> *)sdl_createDisplayCapabilityListFromDeprecatedDisplayCapabilities:(SDLDisplayCapabilities *)display buttons:(NSArray<SDLButtonCapabilities *> *)buttons softButtons:(NSArray<SDLSoftButtonCapabilities *> *)softButtons {
+ // Based on deprecated Display capabilities we don't know if widgets are supported. The default MAIN window is the only window we know is supported, so it's the only one we will expose.
+ SDLWindowTypeCapabilities *windowTypeCapabilities = [[SDLWindowTypeCapabilities alloc] initWithType:SDLWindowTypeMain maximumNumberOfWindows:1];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ NSString *displayName = display.displayName ?: display.displayType;
+#pragma clang diagnostic pop
+ SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:displayName];
+ displayCapability.windowTypeSupported = @[windowTypeCapabilities];
+
+ // Create a window capability object for the default MAIN window
+ SDLWindowCapability *defaultWindowCapability = [[SDLWindowCapability alloc] init];
+ defaultWindowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
+ defaultWindowCapability.buttonCapabilities = [buttons copy];
+ defaultWindowCapability.softButtonCapabilities = [softButtons copy];
+
+ // return if display capabilities don't exist.
+ if (display == nil) {
+ displayCapability.windowCapabilities = @[defaultWindowCapability];
+ return @[displayCapability];
+ }
+
+ // Copy all available display capability properties
+ defaultWindowCapability.templatesAvailable = [display.templatesAvailable copy];
+ defaultWindowCapability.numCustomPresetsAvailable = [display.numCustomPresetsAvailable copy];
+ defaultWindowCapability.textFields = [display.textFields copy];
+ defaultWindowCapability.imageFields = [display.imageFields copy];
+
+ /*
+ The description from the mobile API to "graphicSupported:
+ > The display's persistent screen supports referencing a static or dynamic image.
+ For backward compatibility (AppLink 2.0) static image type is always presented
+ */
+ if (display.graphicSupported.boolValue) {
+ defaultWindowCapability.imageTypeSupported = @[SDLImageTypeStatic, SDLImageTypeDynamic];
+ } else {
+ defaultWindowCapability.imageTypeSupported = @[SDLImageTypeStatic];
+ }
+
+ displayCapability.windowCapabilities = @[defaultWindowCapability];
+ return @[displayCapability];
+}
+
+#pragma mark Convert New to Deprecated
+
+/// Convert from a WindowCapability (should be the main display's main window capability) to the deprecated old-style DisplayCapabilities
+/// @param displayName The display name of the display to be converted
+/// @param windowCapability The window capability to be converted
+- (SDLDisplayCapabilities *)sdl_createDeprecatedDisplayCapabilitiesWithDisplayName:(NSString *)displayName windowCapability:(SDLWindowCapability *)windowCapability {
+ SDLDisplayCapabilities *convertedCapabilities = [[SDLDisplayCapabilities alloc] init];
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ convertedCapabilities.displayType = SDLDisplayTypeGeneric; // deprecated but it is mandatory
+#pragma clang diagnostic pop
+ convertedCapabilities.displayName = displayName;
+ convertedCapabilities.textFields = [windowCapability.textFields copy];
+ convertedCapabilities.imageFields = [windowCapability.imageFields copy];
+ convertedCapabilities.templatesAvailable = [windowCapability.templatesAvailable copy];
+ convertedCapabilities.numCustomPresetsAvailable = [windowCapability.numCustomPresetsAvailable copy];
+ convertedCapabilities.mediaClockFormats = @[]; // mandatory field but allows empty array
+ convertedCapabilities.graphicSupported = @([windowCapability.imageTypeSupported containsObject:SDLImageTypeDynamic]);
+
+ return convertedCapabilities;
+}
+
+/// Update the internal deprecated display capability methods with new values based on the current value of the default main window capability and the primary display
+- (void)sdl_updateDeprecatedDisplayCapabilities {
+ SDLWindowCapability *defaultMainWindowCapabilities = self.defaultMainWindowCapability;
+ if (self.displays.count == 0) {
+ return;
+ }
+
+ // Create the deprecated capabilities for backward compatibility if developers try to access them
+ self.displayCapabilities = [self sdl_createDeprecatedDisplayCapabilitiesWithDisplayName:self.displays.firstObject.displayName windowCapability:defaultMainWindowCapabilities];
+ self.buttonCapabilities = defaultMainWindowCapabilities.buttonCapabilities;
+ self.softButtonCapabilities = defaultMainWindowCapabilities.softButtonCapabilities;
+}
+
+#pragma mark - System Capability Updates
- (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SDLUpdateCapabilityHandler)handler {
if (self.supportsSubscriptions) {
@@ -262,9 +403,11 @@ typedef NSString * SDLServiceID;
* @return An array of all possible system capability types
*/
+ (NSArray<SDLSystemCapabilityType> *)sdl_systemCapabilityTypes {
- return @[SDLSystemCapabilityTypeAppServices, SDLSystemCapabilityTypeNavigation, SDLSystemCapabilityTypePhoneCall, SDLSystemCapabilityTypeVideoStreaming, SDLSystemCapabilityTypeRemoteControl, SDLSystemCapabilityTypeSeatLocation];
+ return @[SDLSystemCapabilityTypeAppServices, SDLSystemCapabilityTypeNavigation, SDLSystemCapabilityTypePhoneCall, SDLSystemCapabilityTypeVideoStreaming, SDLSystemCapabilityTypeRemoteControl, SDLSystemCapabilityTypeDisplays, SDLSystemCapabilityTypeSeatLocation];
}
+# pragma mark Subscribing
+
/**
* Sends a subscribe request for all possible system capabilites. If connecting to Core versions 4.5+, the requested capability will be returned in the response. If connecting to Core versions 5.1+, the manager will received `OnSystemCapabilityUpdated` notifications when the capability updates if the subscription was successful.
*/
@@ -299,6 +442,8 @@ typedef NSString * SDLServiceID;
}];
}
+#pragma mark Saving Capability Responses
+
/**
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.
@@ -308,30 +453,49 @@ typedef NSString * SDLServiceID;
*/
- (BOOL)sdl_saveSystemCapability:(SDLSystemCapability *)systemCapability completionHandler:(nullable SDLUpdateCapabilityHandler)handler {
if ([self.lastReceivedCapability isEqual:systemCapability]) {
- return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler];
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return NO;
}
self.lastReceivedCapability = systemCapability;
SDLSystemCapabilityType systemCapabilityType = systemCapability.systemCapabilityType;
if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypePhoneCall]) {
- if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; }
+ if ([self.phoneCapability isEqual:systemCapability.phoneCapability]) {
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return NO;
+ }
self.phoneCapability = systemCapability.phoneCapability;
} else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeNavigation]) {
- if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; }
+ if ([self.navigationCapability isEqual:systemCapability.navigationCapability]) {
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return NO;
+ }
self.navigationCapability = systemCapability.navigationCapability;
} else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeRemoteControl]) {
- if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; }
+ if ([self.remoteControlCapability isEqual:systemCapability.remoteControlCapability]) {
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return NO;
+ }
self.remoteControlCapability = systemCapability.remoteControlCapability;
} else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeSeatLocation]) {
- if ([self.seatLocationCapability isEqual:systemCapability.seatLocationCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; }
+ if ([self.seatLocationCapability isEqual:systemCapability.seatLocationCapability]) {
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return NO;
+ }
self.seatLocationCapability = systemCapability.seatLocationCapability;
} else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeVideoStreaming]) {
- if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) { return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:NO handler:handler]; }
+ if ([self.videoStreamingCapability isEqual:systemCapability.videoStreamingCapability]) {
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return NO;
+ }
self.videoStreamingCapability = systemCapability.videoStreamingCapability;
} else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeAppServices]) {
[self sdl_saveAppServicesCapabilitiesUpdate:systemCapability.appServicesCapabilities];
systemCapability = [[SDLSystemCapability alloc] initWithAppServicesCapabilities:self.appServicesCapabilities];
+ } else if ([systemCapabilityType isEqualToEnum:SDLSystemCapabilityTypeDisplays]) {
+ self.shouldConvertDeprecatedDisplayCapabilities = NO;
+ [self sdl_saveDisplayCapabilityListUpdate:systemCapability.displayCapabilities];
} else {
SDLLogW(@"Received response for unknown System Capability Type: %@", systemCapabilityType);
return NO;
@@ -339,37 +503,11 @@ typedef NSString * SDLServiceID;
SDLLogD(@"Updated system capability manager with new data: %@", systemCapability);
- return [self sdl_callSaveHandlerForCapability:systemCapability andReturnWithValue:YES handler:handler];
+ [self sdl_callObserversForCapabilityUpdate:systemCapability handler:handler];
+ return YES;
}
-- (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(capability);
- } else {
- 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:capability];
- }
- } else {
- @throw [NSException sdl_invalidSelectorExceptionWithSelector:observer.selector];
- }
-#pragma clang diagnostic pop
- }
- }
-
- if (handler == nil) { return value; }
- handler(nil, self);
-
- return value;
-}
+#pragma mark Merge Capability Deltas
- (void)sdl_saveAppServicesCapabilitiesUpdate:(SDLAppServicesCapabilities *)newCapabilities {
for (SDLAppServiceCapability *capability in newCapabilities.appServices) {
@@ -385,10 +523,52 @@ typedef NSString * SDLServiceID;
}
}
-#pragma mark - Subscriptions
+/// Save a new new-style `DisplayCapability` update (only contains the delta) that was received by merging it with the existing version.
+/// @param newCapabilities The new `DisplayCapability` update delta.
+- (void)sdl_saveDisplayCapabilityListUpdate:(NSArray<SDLDisplayCapability *> *)newCapabilities {
+ NSArray<SDLDisplayCapability *> *oldCapabilities = self.displays;
+
+ if (oldCapabilities == nil) {
+ self.displays = newCapabilities;
+ [self sdl_updateDeprecatedDisplayCapabilities];
+ return;
+ }
+
+ SDLDisplayCapability *oldDefaultDisplayCapabilities = oldCapabilities.firstObject;
+ NSMutableArray<SDLWindowCapability *> *copyWindowCapabilities = [oldDefaultDisplayCapabilities.windowCapabilities mutableCopy];
+
+ SDLDisplayCapability *newDefaultDisplayCapabilities = newCapabilities.firstObject;
+ NSArray<SDLWindowCapability *> *newWindowCapabilities = newDefaultDisplayCapabilities.windowCapabilities;
+
+ for (SDLWindowCapability *newWindow in newWindowCapabilities) {
+ BOOL oldFound = NO;
+ for (NSUInteger i = 0; i < copyWindowCapabilities.count; i++) {
+ SDLWindowCapability *oldWindow = copyWindowCapabilities[i];
+ NSUInteger newWindowID = newWindow.windowID ? newWindow.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
+ NSUInteger oldWindowID = oldWindow.windowID ? oldWindow.windowID.unsignedIntegerValue : SDLPredefinedWindowsDefaultWindow;
+ if (newWindowID == oldWindowID) {
+ copyWindowCapabilities[i] = newWindow; // replace the old window caps with new ones
+ oldFound = true;
+ break;
+ }
+ }
+
+ if (!oldFound) {
+ [copyWindowCapabilities addObject:newWindow]; // this is a new unknown window
+ }
+ }
+
+ // replace the window capabilities array with the merged one.
+ newDefaultDisplayCapabilities.windowCapabilities = [copyWindowCapabilities copy];
+ self.displays = @[newDefaultDisplayCapabilities];
+ [self sdl_updateDeprecatedDisplayCapabilities];
+}
+
+#pragma mark - Manager Subscriptions
- (nullable id<NSObject>)subscribeToCapabilityType:(SDLSystemCapabilityType)type withBlock:(SDLCapabilityUpdateHandler)block {
- if (!self.supportsSubscriptions) { return nil; }
+ // DISPLAYS always works due to old-style SetDisplayLayoutRepsonse updates, but otherwise, subscriptions won't work
+ if (!self.supportsSubscriptions && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) { return nil; }
SDLSystemCapabilityObserver *observerObject = [[SDLSystemCapabilityObserver alloc] initWithObserver:[[NSObject alloc] init] block:block];
[self.capabilityObservers[type] addObject:observerObject];
@@ -397,7 +577,8 @@ typedef NSString * SDLServiceID;
}
- (BOOL)subscribeToCapabilityType:(SDLSystemCapabilityType)type withObserver:(id<NSObject>)observer selector:(SEL)selector {
- if (!self.supportsSubscriptions) { return NO; }
+ // DISPLAYS always works due to old-style SetDisplayLayoutRepsonse updates, but otherwise, subscriptions won't work
+ if (!self.supportsSubscriptions && ![type isEqualToEnum:SDLSystemCapabilityTypeDisplays]) { return nil; }
NSUInteger numberOfParametersInSelector = [NSStringFromSelector(selector) componentsSeparatedByString:@":"].count - 1;
if (numberOfParametersInSelector > 1) { return NO; }
@@ -417,6 +598,36 @@ typedef NSString * SDLServiceID;
}
}
+/// Calls all observers of a capability type with an updated capability
+/// @param capability The new capability update
+/// @param handler The update handler to call, if one exists after the observers are called
+- (void)sdl_callObserversForCapabilityUpdate:(SDLSystemCapability *)capability handler:(nullable SDLUpdateCapabilityHandler)handler {
+ for (SDLSystemCapabilityObserver *observer in self.capabilityObservers[capability.systemCapabilityType]) {
+ if (observer.block != nil) {
+ observer.block(capability);
+ } else {
+ 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:capability];
+ }
+ } else {
+ @throw [NSException sdl_invalidSelectorExceptionWithSelector:observer.selector];
+ }
+#pragma clang diagnostic pop
+ }
+ }
+
+ if (handler == nil) { return; }
+ handler(nil, self);
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLSystemCapabilityObserver.m b/SmartDeviceLink/SDLSystemCapabilityObserver.m
index 64832f1a7..7ccbd38af 100644
--- a/SmartDeviceLink/SDLSystemCapabilityObserver.m
+++ b/SmartDeviceLink/SDLSystemCapabilityObserver.m
@@ -32,6 +32,14 @@ NS_ASSUME_NONNULL_BEGIN
return self;
}
+- (NSString *)description {
+ if (self.selector) {
+ return [NSString stringWithFormat:@"Observer: %@[%@] - %@", [_observer class], _observer, NSStringFromSelector(_selector)];
+ } else {
+ return [NSString stringWithFormat:@"Block Observer: %@", _observer];
+ }
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLTextAndGraphicManager.h b/SmartDeviceLink/SDLTextAndGraphicManager.h
index 48c9c7332..c916e0426 100644
--- a/SmartDeviceLink/SDLTextAndGraphicManager.h
+++ b/SmartDeviceLink/SDLTextAndGraphicManager.h
@@ -14,6 +14,7 @@
@class SDLArtwork;
@class SDLFileManager;
@class SDLTextAndGraphicConfiguration;
+@class SDLSystemCapabilityManager;
@protocol SDLConnectionManagerType;
@@ -62,7 +63,10 @@ typedef void(^SDLTextAndGraphicUpdateCompletionHandler)(NSError *__nullable erro
@return A new SDLTextAndImageManager
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager;
+
+/// Starts the manager. This method is used internally.
+- (void)start;
/**
* Stops the manager. This method is used internally.
diff --git a/SmartDeviceLink/SDLTextAndGraphicManager.m b/SmartDeviceLink/SDLTextAndGraphicManager.m
index 4e0551459..fcd83432d 100644
--- a/SmartDeviceLink/SDLTextAndGraphicManager.m
+++ b/SmartDeviceLink/SDLTextAndGraphicManager.m
@@ -10,8 +10,6 @@
#import "SDLArtwork.h"
#import "SDLConnectionManagerType.h"
-#import "SDLDisplayCapabilities.h"
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
#import "SDLError.h"
#import "SDLFileManager.h"
#import "SDLImage.h"
@@ -25,8 +23,11 @@
#import "SDLRPCResponseNotification.h"
#import "SDLSetDisplayLayoutResponse.h"
#import "SDLShow.h"
+#import "SDLSystemCapability.h"
+#import "SDLSystemCapabilityManager.h"
#import "SDLTextField.h"
-
+#import "SDLWindowCapability.h"
+#import "SDLWindowCapability+ShowManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -35,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN
// Dependencies
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
/**
A show describing the current text and images on the screen (not soft buttons, etc.)
@@ -51,7 +53,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (assign, nonatomic) BOOL hasQueuedUpdate;
@property (copy, nonatomic, nullable) SDLTextAndGraphicUpdateCompletionHandler queuedUpdateHandler;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
+@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
@property (strong, nonatomic, nullable) SDLHMILevel currentLevel;
@property (strong, nonatomic, nullable) SDLArtwork *blankArtwork;
@@ -63,12 +65,13 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLTextAndGraphicManager
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(nonnull SDLFileManager *)fileManager {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager fileManager:(SDLFileManager *)fileManager systemCapabilityManager:(SDLSystemCapabilityManager *)systemCapabilityManager {
self = [super init];
if (!self) { return nil; }
_connectionManager = connectionManager;
_fileManager = fileManager;
+ _systemCapabilityManager = systemCapabilityManager;
_alignment = SDLTextAlignmentCenter;
@@ -78,13 +81,15 @@ NS_ASSUME_NONNULL_BEGIN
_waitingOnHMILevelUpdateToUpdate = NO;
_isDirty = NO;
- [[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_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
return self;
}
+- (void)start {
+ [self.systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityDidUpdate:)];
+}
+
- (void)stop {
_textField1 = nil;
_textField2 = nil;
@@ -105,11 +110,13 @@ NS_ASSUME_NONNULL_BEGIN
_queuedImageUpdate = nil;
_hasQueuedUpdate = NO;
_queuedUpdateHandler = nil;
- _displayCapabilities = nil;
+ _windowCapability = nil;
_currentLevel = SDLHMILevelNone;
_blankArtwork = nil;
_waitingOnHMILevelUpdateToUpdate = NO;
_isDirty = NO;
+
+ [self.systemCapabilityManager unsubscribeFromCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self];
}
#pragma mark - Upload / Send
@@ -294,7 +301,7 @@ NS_ASSUME_NONNULL_BEGIN
NSArray *nonNilFields = [self sdl_findNonNilTextFields];
if (nonNilFields.count == 0) { return show; }
- NSUInteger numberOfLines = self.displayCapabilities ? self.displayCapabilities.maxNumberOfMainFieldLines : 4;
+ NSUInteger numberOfLines = self.windowCapability ? self.windowCapability.maxNumberOfMainFieldLines : 4;
if (numberOfLines == 1) {
show = [self sdl_assembleOneLineShowText:show withShowFields:nonNilFields];
} else if (numberOfLines == 2) {
@@ -505,7 +512,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (BOOL)sdl_shouldUpdatePrimaryImage {
- BOOL templateSupportsPrimaryArtwork = self.displayCapabilities ? [self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] : YES;
+ BOOL templateSupportsPrimaryArtwork = self.windowCapability ? [self.windowCapability hasImageFieldOfName:SDLImageFieldNameGraphic] : YES;
return (templateSupportsPrimaryArtwork
&& ![self.currentScreenData.graphic.value isEqualToString:self.primaryGraphic.name]
@@ -513,7 +520,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (BOOL)sdl_shouldUpdateSecondaryImage {
- BOOL templateSupportsSecondaryArtwork = self.displayCapabilities ? ([self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] || [self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameSecondaryGraphic]) : YES;
+ BOOL templateSupportsSecondaryArtwork = self.windowCapability ? ([self.windowCapability hasImageFieldOfName:SDLImageFieldNameGraphic] || [self.windowCapability hasImageFieldOfName:SDLImageFieldNameSecondaryGraphic]) : YES;
// Cannot detect if there is a secondary image, so we'll just try to detect if there's a primary image and allow it if there is.
return (templateSupportsSecondaryArtwork
@@ -689,37 +696,13 @@ NS_ASSUME_NONNULL_BEGIN
return _blankArtwork;
}
-#pragma mark - RPC Responses
-
-- (void)sdl_registerResponse:(SDLRPCResponseNotification *)notification {
- SDLRegisterAppInterfaceResponse *response = (SDLRegisterAppInterfaceResponse *)notification.response;
+#pragma mark - Subscribed notifications
- if (!response.success.boolValue) { return; }
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
- if (response.displayCapabilities == nil) {
-#pragma clang diagnostic pop
- SDLLogE(@"RegisterAppInterface succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
+- (void)sdl_displayCapabilityDidUpdate:(SDLSystemCapability *)systemCapability {
+ // we won't use the object in the parameter but the convenience method of the system capability manager
+ NSLog(@"PING");
+ self.windowCapability = self.systemCapabilityManager.defaultMainWindowCapability;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
- self.displayCapabilities = response.displayCapabilities;
-#pragma clang diagnostic pop
-}
-
-- (void)sdl_displayLayoutResponse:(SDLRPCResponseNotification *)notification {
- SDLSetDisplayLayoutResponse *response = (SDLSetDisplayLayoutResponse *)notification.response;
- if (!response.success.boolValue) { return; }
- if (!response.success.boolValue) { return; }
- if (response.displayCapabilities == nil) {
- SDLLogE(@"SetDisplayLayout succeeded but didn't send a display capabilities. A lot of things will probably break.");
- return;
- }
-
- self.displayCapabilities = response.displayCapabilities;
-
// Auto-send an updated show
if ([self sdl_hasData]) {
[self sdl_updateWithCompletionHandler:nil];
diff --git a/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.h b/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.h
new file mode 100644
index 000000000..14bfc9ffa
--- /dev/null
+++ b/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.h
@@ -0,0 +1,26 @@
+//
+// SDLWindowCapability+ShowManagerExtensions.h
+// SmartDeviceLink
+//
+// Created by Joel Fischer on 2/28/18.
+// Updated by Kujtim Shala (Ford) on 13.09.19.
+// - Renamed and adapted for WindowCapability
+// Copyright © 2019 smartdevicelink. All rights reserved.
+//
+
+#import "SDLImageFieldName.h"
+#import "SDLTextFieldName.h"
+#import "SDLWindowCapability.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SDLWindowCapability (ShowManagerExtensions)
+
+@property (assign, nonatomic, readonly) NSUInteger maxNumberOfMainFieldLines;
+
+- (BOOL)hasTextFieldOfName:(SDLTextFieldName)name;
+- (BOOL)hasImageFieldOfName:(SDLImageFieldName)name;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.m b/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.m
index 026fb16dc..c6b808e22 100644
--- a/SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.m
+++ b/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.m
@@ -1,16 +1,18 @@
//
-// SDLDisplayCapabilities+ShowManagerExtensions.m
+// SDLWindowCapability+ShowManagerExtensions.m
// SmartDeviceLink
//
// Created by Joel Fischer on 2/28/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
+// Updated by Kujtim Shala (Ford) on 13.09.19.
+// - Renamed and adapted for WindowCapability
+// Copyright © 2019 smartdevicelink. All rights reserved.
//
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
+#import "SDLWindowCapability+ShowManagerExtensions.h"
#import "SDLImageField.h"
#import "SDLTextField.h"
-@implementation SDLDisplayCapabilities (ShowManagerExtensions)
+@implementation SDLWindowCapability (ShowManagerExtension)
- (BOOL)hasTextFieldOfName:(SDLTextFieldName)name {
for (SDLTextField *textField in self.textFields) {
@@ -41,10 +43,6 @@
}
- (BOOL)hasImageFieldOfName:(SDLImageFieldName)name {
- if (!self.graphicSupported.boolValue) {
- return NO;
- }
-
for (SDLImageField *imageField in self.imageFields) {
if ([imageField.name isEqualToString:name]) {
return YES;
diff --git a/SmartDeviceLink/SDLWindowCapability.m b/SmartDeviceLink/SDLWindowCapability.m
index 3e30a2b4c..6ace664b6 100644
--- a/SmartDeviceLink/SDLWindowCapability.m
+++ b/SmartDeviceLink/SDLWindowCapability.m
@@ -45,6 +45,14 @@
return [self.store sdl_enumsForName:SDLRPCParameterNameImageTypeSupported error:nil];
}
+- (void)setTemplatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable {
+ [self.store sdl_setObject:templatesAvailable forName:SDLRPCParameterNameTemplatesAvailable];
+}
+
+- (nullable NSArray<NSString *> *)templatesAvailable {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameTemplatesAvailable ofClass:NSString.class error:nil];
+}
+
- (void)setNumCustomPresetsAvailable:(nullable NSNumber<SDLInt> *)numCustomPresetsAvailable {
[self.store sdl_setObject:numCustomPresetsAvailable forName:SDLRPCParameterNameNumberCustomPresetsAvailable];
}
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
index c33e07c3d..71d74c5bc 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
@@ -9,7 +9,6 @@
#import "SDLChoiceSet.h"
#import "SDLChoiceSetDelegate.h"
#import "SDLDeleteChoicesOperation.h"
-#import "SDLDisplayCapabilities.h"
#import "SDLFileManager.h"
#import "SDLHMILevel.h"
#import "SDLKeyboardDelegate.h"
@@ -20,6 +19,7 @@
#import "SDLGlobals.h"
#import "SDLStateMachine.h"
#import "SDLSystemContext.h"
+#import "SDLSystemCapabilityManager.h"
#import "TestConnectionManager.h"
#import "SDLVersion.h"
@@ -43,7 +43,6 @@
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
@property (strong, nonatomic) NSMutableSet<SDLChoiceCell *> *preloadedMutableChoices;
@property (strong, nonatomic, readonly) NSSet<SDLChoiceCell *> *pendingPreloadChoices;
@@ -62,6 +61,7 @@ describe(@"choice set manager tests", ^{
__block TestConnectionManager *testConnectionManager = nil;
__block SDLFileManager *testFileManager = nil;
+ __block SDLSystemCapabilityManager *testSystemCapabilityManager = nil;
__block SDLChoiceCell *testCell1 = nil;
__block SDLChoiceCell *testCell2 = nil;
@@ -70,8 +70,9 @@ describe(@"choice set manager tests", ^{
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
testFileManager = OCMClassMock([SDLFileManager class]);
+ testSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
- testManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager];
+ testManager = [[SDLChoiceSetManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager systemCapabilityManager:testSystemCapabilityManager];
testCell1 = [[SDLChoiceCell alloc] initWithText:@"test1"];
testCell2 = [[SDLChoiceCell alloc] initWithText:@"test2"];
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
index ea80c0db6..1d1599cad 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLFileManagerSpec.m
@@ -875,7 +875,7 @@ describe(@"uploading/deleting multiple files in the file manager", ^{
[testFileManager uploadArtworks:testArtworks progressHandler:^BOOL(NSString * _Nonnull artworkName, float uploadPercentage, NSError * _Nullable error) {
artworksDone++;
expect(artworkName).to(equal(expectedArtworkNames[artworksDone - 1]));
- expect(uploadPercentage).to(beCloseTo((float)artworksDone / 200.0).within(0.1));
+ expect(uploadPercentage).to(beCloseTo((float)artworksDone / 200.0).within(0.01));
expect(error).to(beNil());
return YES;
} completionHandler:^(NSArray<NSString *> * _Nonnull artworkNames, NSError * _Nullable error) {
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
index 13940def3..29ed043c3 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m
@@ -20,10 +20,11 @@
@property (weak, nonatomic) id<SDLConnectionManagerType> connectionManager;
@property (weak, nonatomic) SDLFileManager *fileManager;
+@property (weak, nonatomic) SDLSystemCapabilityManager *systemCapabilityManager;
@property (copy, nonatomic, nullable) SDLHMILevel currentHMILevel;
@property (copy, nonatomic, nullable) SDLSystemContext currentSystemContext;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
+
@property (strong, nonatomic, nullable) NSArray<SDLRPCRequest *> *inProgressUpdate;
@property (assign, nonatomic) BOOL hasQueuedUpdate;
@@ -41,9 +42,7 @@ describe(@"menu manager", ^{
__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 SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
__block SDLArtwork *testArtwork = nil;
__block SDLArtwork *testArtwork2 = nil;
@@ -66,15 +65,29 @@ describe(@"menu manager", ^{
mockConnectionManager = [[TestConnectionManager alloc] init];
mockFileManager = OCMClassMock([SDLFileManager class]);
- testManager = [[SDLMenuManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager];
+ mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
+ testManager = [[SDLMenuManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager];
+
+ SDLImageField *commandIconField = [[SDLImageField alloc] init];
+ commandIconField.name = SDLImageFieldNameCommandIcon;
+ SDLWindowCapability *windowCapability = [[SDLWindowCapability alloc] init];
+ windowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
+ windowCapability.imageFields = @[commandIconField];
+ windowCapability.imageTypeSupported = @[SDLImageTypeDynamic, SDLImageTypeStatic];
+
+ SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:SDLDisplayTypeGeneric];
+ displayCapability.windowCapabilities = @[windowCapability];
+
+ OCMStub(mockSystemCapabilityManager.defaultMainWindowCapability).andReturn(windowCapability);
+ OCMStub(mockSystemCapabilityManager.displays).andReturn(@[displayCapability]);
});
it(@"should instantiate correctly", ^{
expect(testManager.menuCells).to(beEmpty());
expect(testManager.connectionManager).to(equal(mockConnectionManager));
expect(testManager.fileManager).to(equal(mockFileManager));
+ expect(testManager.systemCapabilityManager).to(equal(mockSystemCapabilityManager));
expect(testManager.currentHMILevel).to(beNil());
- expect(testManager.displayCapabilities).to(beNil());
expect(testManager.inProgressUpdate).to(beNil());
expect(testManager.hasQueuedUpdate).to(beFalse());
expect(testManager.waitingOnHMIUpdate).to(beFalse());
@@ -149,47 +162,10 @@ describe(@"menu manager", ^{
});
});
- describe(@"Notification 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:SDLDidReceiveSetDisplayLayoutResponse object:nil rpcResponse:testSetDisplayLayoutResponse];
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- expect(testManager.displayCapabilities).withTimeout(3).toEventually(equal(testDisplayCapabilities));
- });
-
- it(@"should set display capabilities when SDLDidReceiveRegisterAppInterfaceResponse is received", ^{
- testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
-
- testRegisterAppInterfaceResponse = [[SDLRegisterAppInterfaceResponse alloc] init];
- testRegisterAppInterfaceResponse.success = @YES;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated"
- testRegisterAppInterfaceResponse.displayCapabilities = testDisplayCapabilities;
-#pragma clang diagnostic pop
-
- SDLRPCResponseNotification *notification = [[SDLRPCResponseNotification alloc] initWithName:SDLDidReceiveSetDisplayLayoutResponse object:nil rpcResponse:testRegisterAppInterfaceResponse];
- [[NSNotificationCenter defaultCenter] postNotification:notification];
-
- expect(testManager.displayCapabilities).to(equal(testDisplayCapabilities));
- });
- });
-
describe(@"updating menu cells", ^{
beforeEach(^{
testManager.currentHMILevel = SDLHMILevelFull;
testManager.currentSystemContext = SDLSystemContextMain;
-
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
- SDLImageField *commandIconField = [[SDLImageField alloc] init];
- commandIconField.name = SDLImageFieldNameCommandIcon;
- testManager.displayCapabilities.imageFields = @[commandIconField];
- testManager.displayCapabilities.graphicSupported = @YES;
});
context(@"duplicate titles", ^{
@@ -534,12 +510,6 @@ describe(@"menu manager", ^{
testManager.currentHMILevel = SDLHMILevelFull;
testManager.currentSystemContext = SDLSystemContextMain;
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
- SDLImageField *commandIconField = [[SDLImageField alloc] init];
- commandIconField.name = SDLImageFieldNameCommandIcon;
- testManager.displayCapabilities.imageFields = @[commandIconField];
- testManager.displayCapabilities.graphicSupported = @YES;
-
cellCalled = NO;
testTriggerSource = nil;
});
@@ -604,7 +574,6 @@ describe(@"menu manager", ^{
expect(testManager.menuCells).to(beEmpty());
expect(testManager.currentHMILevel).to(beNil());
- expect(testManager.displayCapabilities).to(beNil());
expect(testManager.inProgressUpdate).to(beNil());
expect(testManager.hasQueuedUpdate).to(beFalse());
expect(testManager.waitingOnHMIUpdate).to(beFalse());
@@ -618,7 +587,6 @@ describe(@"menu manager", ^{
beforeEach(^{
testManager.currentHMILevel = SDLHMILevelFull;
testManager.currentSystemContext = SDLSystemContextMain;
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
});
context(@"when open menu RPC can be sent", ^{
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
index 5bcf2d5de..f4056cccb 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPreloadChoicesOperationSpec.m
@@ -7,12 +7,13 @@
#import "SDLChoice.h"
#import "SDLChoiceCell.h"
#import "SDLCreateInteractionChoiceSet.h"
-#import "SDLDisplayCapabilities.h"
+#import "SDLDisplayType.h"
#import "SDLFileManager.h"
#import "SDLImageField.h"
#import "SDLImageFieldName.h"
#import "SDLTextField.h"
#import "SDLTextFieldName.h"
+#import "SDLWindowCapability.h"
#import "TestConnectionManager.h"
QuickSpecBegin(SDLPreloadChoicesOperationSpec)
@@ -42,13 +43,13 @@ describe(@"a preload choices operation", ^{
});
describe(@"running the operation", ^{
- __block SDLDisplayCapabilities *displayCapabilities = nil;
+ __block SDLWindowCapability *windowCapability = nil;
beforeEach(^{
- displayCapabilities = [[SDLDisplayCapabilities alloc] init];
- displayCapabilities.graphicSupported = @YES;
+ windowCapability = [[SDLWindowCapability alloc] init];
+ windowCapability.imageTypeSupported = @[SDLImageTypeStatic, SDLImageTypeDynamic];
SDLTextField *primaryTextField = [[SDLTextField alloc] init];
primaryTextField.name = SDLTextFieldNameMenuName;
- displayCapabilities.textFields = @[primaryTextField];
+ windowCapability.textFields = @[primaryTextField];
OCMStub([testFileManager uploadArtworks:[OCMArg any] completionHandler:[OCMArg invokeBlock]]);
});
@@ -77,9 +78,9 @@ describe(@"a preload choices operation", ^{
it(@"should not send any requests", ^{
SDLTextField *primaryTextField = [[SDLTextField alloc] init];
primaryTextField.name = SDLTextFieldNameMenuName;
- displayCapabilities.textFields = @[];
+ windowCapability.textFields = @[];
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork];
[testOp start];
NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
@@ -90,7 +91,7 @@ describe(@"a preload choices operation", ^{
context(@"disallowed display capabilities", ^{
it(@"should skip to preloading cells", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork];
[testOp start];
expect(@(testOp.currentState)).to(equal(SDLPreloadChoicesOperationStatePreloadingChoices));
@@ -101,12 +102,11 @@ describe(@"a preload choices operation", ^{
beforeEach(^{
SDLImageField *choiceField = [[SDLImageField alloc] init];
choiceField.name = SDLImageFieldNameChoiceImage;
-
- displayCapabilities.imageFields = @[choiceField];
+ windowCapability.imageFields = @[choiceField];
OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork];
[testOp start];
});
@@ -126,14 +126,14 @@ describe(@"a preload choices operation", ^{
SDLImageField *choiceSecondaryField = [[SDLImageField alloc] init];
choiceSecondaryField.name = SDLImageFieldNameChoiceSecondaryImage;
- displayCapabilities.imageFields = @[choiceField, choiceSecondaryField];
+ windowCapability.imageFields = @[choiceField, choiceSecondaryField];
});
context(@"when artworks are already on the system", ^{
beforeEach(^{
OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(YES);
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork];
[testOp start];
});
@@ -148,7 +148,7 @@ describe(@"a preload choices operation", ^{
context(@"when artworks are static icons", ^{
beforeEach(^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithStaticIcon];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithStaticIcon];
[testOp start];
});
@@ -161,7 +161,7 @@ describe(@"a preload choices operation", ^{
beforeEach(^{
OCMStub([testFileManager hasUploadedFile:[OCMArg isNotNil]]).andReturn(NO);
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithArtwork];
[testOp start];
});
@@ -191,7 +191,7 @@ describe(@"a preload choices operation", ^{
describe(@"assembling choices", ^{
it(@"should be correct with no text and VR required", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithoutArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork];
[testOp start];
NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
@@ -205,9 +205,9 @@ describe(@"a preload choices operation", ^{
it(@"should be correct with only primary text", ^{
SDLTextField *primaryTextField = [[SDLTextField alloc] init];
primaryTextField.name = SDLTextFieldNameMenuName;
- displayCapabilities.textFields = @[primaryTextField];
+ windowCapability.textFields = @[primaryTextField];
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithoutArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork];
[testOp start];
NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
@@ -224,9 +224,9 @@ describe(@"a preload choices operation", ^{
primaryTextField.name = SDLTextFieldNameMenuName;
SDLTextField *secondaryTextField = [[SDLTextField alloc] init];
secondaryTextField.name = SDLTextFieldNameSecondaryText;
- displayCapabilities.textFields = @[primaryTextField, secondaryTextField];
+ windowCapability.textFields = @[primaryTextField, secondaryTextField];
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithoutArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork];
[testOp start];
NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
@@ -245,9 +245,9 @@ describe(@"a preload choices operation", ^{
secondaryTextField.name = SDLTextFieldNameSecondaryText;
SDLTextField *tertiaryTextField = [[SDLTextField alloc] init];
tertiaryTextField.name = SDLTextFieldNameTertiaryText;
- displayCapabilities.textFields = @[primaryTextField, secondaryTextField, tertiaryTextField];
+ windowCapability.textFields = @[primaryTextField, secondaryTextField, tertiaryTextField];
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:NO cellsToPreload:cellsWithoutArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:NO cellsToPreload:cellsWithoutArtwork];
[testOp start];
NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
@@ -261,7 +261,7 @@ describe(@"a preload choices operation", ^{
it(@"should be correct with VR optional", ^{
- testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayCapabilities:displayCapabilities isVROptional:YES cellsToPreload:cellsWithoutArtwork];
+ testOp = [[SDLPreloadChoicesOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager displayName:SDLDisplayTypeGeneric defaultMainWindowCapability:windowCapability isVROptional:YES cellsToPreload:cellsWithoutArtwork];
[testOp start];
NSArray<SDLCreateInteractionChoiceSet *> *receivedRequests = (NSArray<SDLCreateInteractionChoiceSet *> *)testConnectionManager.receivedRequests;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
index 3a7ac4a65..6534b49df 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLSoftButtonManagerSpec.m
@@ -15,6 +15,7 @@
#import "SDLSoftButtonReplaceOperation.h"
#import "SDLSoftButtonState.h"
#import "SDLSoftButtonTransitionOperation.h"
+#import "SDLSystemCapabilityManager.h"
#import "TestConnectionManager.h"
@interface SDLSoftButtonObject()
@@ -33,9 +34,8 @@
@property (strong, nonatomic) NSOperationQueue *transactionQueue;
+@property (strong, nonatomic, nullable, readonly) SDLWindowCapability *windowCapability;
@property (copy, nonatomic, nullable) SDLHMILevel currentLevel;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
-@property (strong, nonatomic, nullable) SDLSoftButtonCapabilities *softButtonCapabilities;
@property (strong, nonatomic) NSMutableArray<SDLAsynchronousOperation *> *batchQueue;
@@ -47,6 +47,7 @@ describe(@"a soft button manager", ^{
__block SDLSoftButtonManager *testManager = nil;
__block SDLFileManager *testFileManager = nil;
+ __block SDLSystemCapabilityManager *testSystemCapabilityManager = nil;
__block TestConnectionManager *testConnectionManager = nil;
__block SDLSoftButtonObject *testObject1 = nil;
@@ -68,9 +69,11 @@ describe(@"a soft button manager", ^{
beforeEach(^{
testFileManager = OCMClassMock([SDLFileManager class]);
+ testSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
testConnectionManager = [[TestConnectionManager alloc] init];
- testManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager];
+ testManager = [[SDLSoftButtonManager alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager systemCapabilityManager:testSystemCapabilityManager];
+ [testManager start];
expect(testManager.currentLevel).to(beNil());
testManager.currentLevel = SDLHMILevelFull;
@@ -82,8 +85,7 @@ describe(@"a soft button manager", ^{
expect(testManager.softButtonObjects).to(beEmpty());
expect(testManager.currentMainField1).to(beNil());
- expect(testManager.displayCapabilities).to(beNil());
- expect(testManager.softButtonCapabilities).to(beNil());
+ expect(testManager.windowCapability).to(beNil());
expect(testManager.transactionQueue).toNot(beNil());
});
@@ -244,8 +246,7 @@ describe(@"a soft button manager", ^{
expect(testManager.currentMainField1).to(beNil());
expect(testManager.transactionQueue.operationCount).to(equal(0));
expect(testManager.currentLevel).to(beNil());
- expect(testManager.displayCapabilities).to(beNil());
- expect(testManager.softButtonCapabilities).to(beNil());
+ expect(testManager.windowCapability).to(beNil());
});
});
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
index 71a434df7..35c3f0a08 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
@@ -11,6 +11,8 @@
#import "SDLShow.h"
#import "SDLTextAndGraphicManager.h"
#import "SDLTextField.h"
+#import "SDLSystemCapabilityManager.h"
+#import "SDLWindowCapability.h"
#import "TestConnectionManager.h"
@interface SDLTextAndGraphicManager()
@@ -28,7 +30,7 @@
@property (assign, nonatomic) BOOL hasQueuedUpdate;
@property (copy, nonatomic, nullable) SDLTextAndGraphicUpdateCompletionHandler queuedUpdateHandler;
-@property (strong, nonatomic, nullable) SDLDisplayCapabilities *displayCapabilities;
+@property (strong, nonatomic, nullable) SDLWindowCapability *windowCapability;
@property (strong, nonatomic, nullable) SDLHMILevel currentLevel;
@property (strong, nonatomic) SDLArtwork *blankArtwork;
@@ -43,6 +45,7 @@ describe(@"text and graphic manager", ^{
__block SDLTextAndGraphicManager *testManager = nil;
__block TestConnectionManager *mockConnectionManager = [[TestConnectionManager alloc] init];
__block SDLFileManager *mockFileManager = nil;
+ __block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
__block NSString *testString = @"some string";
__block NSString *testArtworkName = @"some artwork name";
@@ -51,7 +54,9 @@ describe(@"text and graphic manager", ^{
beforeEach(^{
mockFileManager = OCMClassMock([SDLFileManager class]);
- testManager = [[SDLTextAndGraphicManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager];
+ mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
+ testManager = [[SDLTextAndGraphicManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager];
+ [testManager start];
});
it(@"should instantiate correctly", ^{
@@ -76,7 +81,7 @@ describe(@"text and graphic manager", ^{
expect(testManager.inProgressUpdate).to(beNil());
expect(testManager.queuedImageUpdate).to(beNil());
expect(testManager.hasQueuedUpdate).to(beFalse());
- expect(testManager.displayCapabilities).to(beNil());
+ expect(testManager.windowCapability).to(beNil());
expect(testManager.currentLevel).to(equal(SDLHMILevelNone));
expect(testManager.blankArtwork).toNot(beNil());
expect(testManager.isDirty).to(beFalse());
@@ -367,10 +372,10 @@ describe(@"text and graphic manager", ^{
context(@"with one line available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.windowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineOneField = [[SDLTextField alloc] init];
lineOneField.name = SDLTextFieldNameMainField1;
- testManager.displayCapabilities.textFields = @[lineOneField];
+ testManager.windowCapability.textFields = @[lineOneField];
});
it(@"should set mediatrack properly", ^{
@@ -468,10 +473,10 @@ describe(@"text and graphic manager", ^{
context(@"with two lines available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.windowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineTwoField = [[SDLTextField alloc] init];
lineTwoField.name = SDLTextFieldNameMainField2;
- testManager.displayCapabilities.textFields = @[lineTwoField];
+ testManager.windowCapability.textFields = @[lineTwoField];
});
it(@"should set mediatrack properly", ^{
@@ -578,10 +583,10 @@ describe(@"text and graphic manager", ^{
context(@"with three lines available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.windowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineThreeField = [[SDLTextField alloc] init];
lineThreeField.name = SDLTextFieldNameMainField3;
- testManager.displayCapabilities.textFields = @[lineThreeField];
+ testManager.windowCapability.textFields = @[lineThreeField];
});
it(@"should set mediatrack properly", ^{
@@ -692,10 +697,10 @@ describe(@"text and graphic manager", ^{
context(@"with four lines available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.windowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineFourField = [[SDLTextField alloc] init];
lineFourField.name = SDLTextFieldNameMainField4;
- testManager.displayCapabilities.textFields = @[lineFourField];
+ testManager.windowCapability.textFields = @[lineFourField];
});
it(@"should set mediatrack properly", ^{
@@ -964,7 +969,7 @@ describe(@"text and graphic manager", ^{
expect(testManager.inProgressUpdate).to(beNil());
expect(testManager.queuedImageUpdate).to(beNil());
expect(testManager.hasQueuedUpdate).to(beFalse());
- expect(testManager.displayCapabilities).to(beNil());
+ expect(testManager.windowCapability).to(beNil());
expect(testManager.currentLevel).to(equal(SDLHMILevelNone));
expect(testManager.blankArtwork).toNot(beNil());
expect(testManager.isDirty).to(beFalse());
diff --git a/SmartDeviceLinkTests/SDLScreenManagerSpec.m b/SmartDeviceLinkTests/SDLScreenManagerSpec.m
index 02882be78..b3f613256 100644
--- a/SmartDeviceLinkTests/SDLScreenManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLScreenManagerSpec.m
@@ -15,6 +15,7 @@
#import "SDLGlobals.h"
#import "SDLMenuCell.h"
#import "SDLMenuManager.h"
+#import "SDLSystemCapabilityManager.h"
@interface SDLSoftButtonManager()
@@ -48,6 +49,7 @@ QuickSpecBegin(SDLScreenManagerSpec)
describe(@"screen manager", ^{
__block TestConnectionManager *mockConnectionManager = nil;
__block SDLFileManager *mockFileManager = nil;
+ __block SDLSystemCapabilityManager *mockSystemCapabilityManager = nil;
__block SDLScreenManager *testScreenManager = nil;
__block NSString *testString1 = @"test1";
@@ -71,8 +73,9 @@ describe(@"screen manager", ^{
beforeEach(^{
mockConnectionManager = [[TestConnectionManager alloc] init];
mockFileManager = OCMClassMock([SDLFileManager class]);
+ mockSystemCapabilityManager = OCMClassMock([SDLSystemCapabilityManager class]);
- testScreenManager = [[SDLScreenManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager];
+ testScreenManager = [[SDLScreenManager alloc] initWithConnectionManager:mockConnectionManager fileManager:mockFileManager systemCapabilityManager:mockSystemCapabilityManager];
});
it(@"should set up the sub-managers correctly", ^{
diff --git a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
index 8b162d283..6a68c25be 100644
--- a/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
+++ b/SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m
@@ -6,7 +6,6 @@
#import "SDLArtwork.h"
#import "SDLConnectionManagerType.h"
-#import "SDLDisplayCapabilities+ShowManagerExtensions.h"
#import "SDLFileManager.h"
#import "SDLLogMacros.h"
#import "SDLShow.h"
diff --git a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
index 33c9a7471..774eae9bd 100644
--- a/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
+++ b/SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m
@@ -8,15 +8,19 @@
#import "SDLAudioPassThruCapabilities.h"
#import "SDLButtonCapabilities.h"
#import "SDLDisplayCapabilities.h"
+#import "SDLDisplayCapability.h"
#import "SDLGetSystemCapability.h"
#import "SDLGetSystemCapabilityResponse.h"
#import "SDLHMICapabilities.h"
+#import "SDLImageField.h"
+#import "SDLImageResolution.h"
#import "SDLMediaServiceManifest.h"
#import "SDLNavigationCapability.h"
#import "SDLNotificationConstants.h"
#import "SDLOnHMIStatus.h"
#import "SDLOnSystemCapabilityUpdated.h"
#import "SDLPhoneCapability.h"
+#import "SDLPredefinedWindows.h"
#import "SDLPresetBankCapabilities.h"
#import "SDLRegisterAppInterfaceResponse.h"
#import "SDLRemoteControlCapabilities.h"
@@ -27,7 +31,10 @@
#import "SDLSoftButtonCapabilities.h"
#import "SDLSystemCapability.h"
#import "SDLSystemCapabilityManager.h"
+#import "SDLTextField.h"
#import "SDLVideoStreamingCapability.h"
+#import "SDLWindowCapability.h"
+#import "SDLWindowTypeCapabilities.h"
#import "TestConnectionManager.h"
#import "TestSystemCapabilityObserver.h"
@@ -45,17 +52,81 @@ describe(@"System capability manager", ^{
__block SDLSystemCapabilityManager *testSystemCapabilityManager = nil;
__block TestConnectionManager *testConnectionManager = nil;
+ __block NSArray<SDLDisplayCapability *> *testDisplayCapabilityList = nil;
+ __block SDLDisplayCapabilities *testDisplayCapabilities = nil;
+ __block NSArray<SDLSoftButtonCapabilities *> *testSoftButtonCapabilities = nil;
+ __block NSArray<SDLButtonCapabilities *> *testButtonCapabilities = nil;
+ __block SDLPresetBankCapabilities *testPresetBankCapabilities = nil;
+
beforeEach(^{
testConnectionManager = [[TestConnectionManager alloc] init];
testSystemCapabilityManager = [[SDLSystemCapabilityManager alloc] initWithConnectionManager:testConnectionManager];
+
+ testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testDisplayCapabilities.graphicSupported = @NO;
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ testDisplayCapabilities.displayType = SDLDisplayTypeGeneric;
+ testDisplayCapabilities.displayName = SDLDisplayTypeGeneric;
+#pragma clang diagnostic pop
+ SDLTextField *textField = [[SDLTextField alloc] init];
+ textField.name = SDLTextFieldNameMainField1;
+ textField.characterSet = SDLCharacterSetCID1;
+ textField.width = @(123);
+ textField.rows = @(1);
+ testDisplayCapabilities.textFields = @[textField];
+ SDLImageField *imageField = [[SDLImageField alloc] init];
+ imageField.name = SDLImageFieldNameAppIcon;
+ imageField.imageTypeSupported = @[SDLFileTypePNG];
+ imageField.imageResolution = [[SDLImageResolution alloc] initWithWidth:42 height:4711];
+ testDisplayCapabilities.imageFields = @[imageField];
+ testDisplayCapabilities.mediaClockFormats = @[];
+ testDisplayCapabilities.templatesAvailable = @[@"DEFAULT", @"MEDIA"];
+ testDisplayCapabilities.numCustomPresetsAvailable = @(8);
+
+ SDLSoftButtonCapabilities *softButtonCapability = [[SDLSoftButtonCapabilities alloc] init];
+ softButtonCapability.shortPressAvailable = @YES;
+ softButtonCapability.longPressAvailable = @NO;
+ softButtonCapability.upDownAvailable = @NO;
+ softButtonCapability.imageSupported = @YES;
+ testSoftButtonCapabilities = @[softButtonCapability];
+
+ SDLButtonCapabilities *buttonCapabilities = [[SDLButtonCapabilities alloc] init];
+ buttonCapabilities.name = SDLButtonNameOk;
+ buttonCapabilities.shortPressAvailable = @YES;
+ buttonCapabilities.longPressAvailable = @YES;
+ buttonCapabilities.upDownAvailable = @YES;
+ testButtonCapabilities = @[buttonCapabilities];
+
+ testPresetBankCapabilities = [[SDLPresetBankCapabilities alloc] init];
+ testPresetBankCapabilities.onScreenPresetsAvailable = @NO;
+
+ SDLWindowTypeCapabilities *windowTypeCapabilities = [[SDLWindowTypeCapabilities alloc] initWithType:SDLWindowTypeMain maximumNumberOfWindows:1];
+ SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:testDisplayCapabilities.displayName];
+ displayCapability.windowTypeSupported = @[windowTypeCapabilities];
+ SDLWindowCapability *defaultWindowCapability = [[SDLWindowCapability alloc] init];
+ defaultWindowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
+ defaultWindowCapability.buttonCapabilities = testButtonCapabilities.copy;
+ defaultWindowCapability.softButtonCapabilities = testSoftButtonCapabilities.copy;
+ defaultWindowCapability.templatesAvailable = testDisplayCapabilities.templatesAvailable.copy;
+ defaultWindowCapability.numCustomPresetsAvailable = testDisplayCapabilities.numCustomPresetsAvailable.copy;
+ defaultWindowCapability.textFields = testDisplayCapabilities.textFields.copy;
+ defaultWindowCapability.imageFields = testDisplayCapabilities.imageFields.copy;
+ defaultWindowCapability.imageTypeSupported = @[SDLImageTypeStatic];
+ displayCapability.windowCapabilities = @[defaultWindowCapability];
+ testDisplayCapabilityList = @[displayCapability];
});
it(@"should initialize the system capability manager properties correctly", ^{
- expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
+ expect(testSystemCapabilityManager.displays).to(beNil());
expect(testSystemCapabilityManager.hmiCapabilities).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
expect(testSystemCapabilityManager.softButtonCapabilities).to(beNil());
expect(testSystemCapabilityManager.buttonCapabilities).to(beNil());
expect(testSystemCapabilityManager.presetBankCapabilities).to(beNil());
+#pragma clang diagnostic pop
expect(testSystemCapabilityManager.hmiZoneCapabilities).to(beNil());
expect(testSystemCapabilityManager.speechCapabilities).to(beNil());
expect(testSystemCapabilityManager.prerecordedSpeechCapabilities).to(beNil());
@@ -73,11 +144,7 @@ describe(@"System capability manager", ^{
context(@"When notified of a register app interface response", ^{
__block SDLRegisterAppInterfaceResponse *testRegisterAppInterfaceResponse = nil;
- __block SDLDisplayCapabilities *testDisplayCapabilities = nil;
__block SDLHMICapabilities *testHMICapabilities = nil;
- __block NSArray<SDLSoftButtonCapabilities *> *testSoftButtonCapabilities = nil;
- __block NSArray<SDLButtonCapabilities *> *testButtonCapabilities = nil;
- __block SDLPresetBankCapabilities *testPresetBankCapabilities = nil;
__block NSArray<SDLHMIZoneCapabilities> *testHMIZoneCapabilities = nil;
__block NSArray<SDLSpeechCapabilities> *testSpeechCapabilities = nil;
__block NSArray<SDLPrerecordedSpeech> *testPrerecordedSpeechCapabilities = nil;
@@ -86,31 +153,11 @@ describe(@"System capability manager", ^{
__block SDLAudioPassThruCapabilities *testPCMStreamCapability = nil;
beforeEach(^{
- testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
- testDisplayCapabilities.graphicSupported = @NO;
-
testHMICapabilities = [[SDLHMICapabilities alloc] init];
testHMICapabilities.navigation = @NO;
testHMICapabilities.phoneCall = @YES;
testHMICapabilities.videoStreaming = @YES;
- SDLSoftButtonCapabilities *softButtonCapability = [[SDLSoftButtonCapabilities alloc] init];
- softButtonCapability.shortPressAvailable = @YES;
- softButtonCapability.longPressAvailable = @NO;
- softButtonCapability.upDownAvailable = @NO;
- softButtonCapability.imageSupported = @YES;
- testSoftButtonCapabilities = @[softButtonCapability];
-
- SDLButtonCapabilities *buttonCapabilities = [[SDLButtonCapabilities alloc] init];
- buttonCapabilities.name = SDLButtonNameOk;
- buttonCapabilities.shortPressAvailable = @YES;
- buttonCapabilities.longPressAvailable = @YES;
- buttonCapabilities.upDownAvailable = @YES;
- testButtonCapabilities = @[buttonCapabilities];
-
- testPresetBankCapabilities = [[SDLPresetBankCapabilities alloc] init];
- testPresetBankCapabilities.onScreenPresetsAvailable = @NO;
-
testHMIZoneCapabilities = @[SDLHMIZoneCapabilitiesFront, SDLHMIZoneCapabilitiesBack];
testSpeechCapabilities = @[SDLSpeechCapabilitiesText, SDLSpeechCapabilitiesSilence];
testPrerecordedSpeechCapabilities = @[SDLPrerecordedSpeechHelp, SDLPrerecordedSpeechInitial];
@@ -148,11 +195,15 @@ describe(@"System capability manager", ^{
});
it(@"should not save any of the RAIR capabilities", ^{
- expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
+ expect(testSystemCapabilityManager.displays).to(beNil());
expect(testSystemCapabilityManager.hmiCapabilities).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
expect(testSystemCapabilityManager.softButtonCapabilities).to(beNil());
expect(testSystemCapabilityManager.buttonCapabilities).to(beNil());
expect(testSystemCapabilityManager.presetBankCapabilities).to(beNil());
+#pragma clang diagnostic pop
expect(testSystemCapabilityManager.hmiZoneCapabilities).to(beNil());
expect(testSystemCapabilityManager.speechCapabilities).to(beNil());
expect(testSystemCapabilityManager.prerecordedSpeechCapabilities).to(beNil());
@@ -170,11 +221,15 @@ describe(@"System capability manager", ^{
});
it(@"should should save the RAIR capabilities", ^{
- expect(testSystemCapabilityManager.displayCapabilities).to(equal(testDisplayCapabilities));
+ expect(testSystemCapabilityManager.displays).to(equal(testDisplayCapabilityList));
expect(testSystemCapabilityManager.hmiCapabilities).to(equal(testHMICapabilities));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ expect(testSystemCapabilityManager.displayCapabilities).to(equal(testDisplayCapabilities));
expect(testSystemCapabilityManager.softButtonCapabilities).to(equal(testSoftButtonCapabilities));
expect(testSystemCapabilityManager.buttonCapabilities).to(equal(testButtonCapabilities));
expect(testSystemCapabilityManager.presetBankCapabilities).to(equal(testPresetBankCapabilities));
+#pragma clang diagnostic pop
expect(testSystemCapabilityManager.hmiZoneCapabilities).to(equal(testHMIZoneCapabilities));
expect(testSystemCapabilityManager.speechCapabilities).to(equal(testSpeechCapabilities));
expect(testSystemCapabilityManager.prerecordedSpeechCapabilities).to(equal(testPrerecordedSpeechCapabilities));
@@ -196,32 +251,8 @@ describe(@"System capability manager", ^{
context(@"When notified of a SetDisplayLayout Response", ^ {
__block SDLSetDisplayLayoutResponse *testSetDisplayLayoutResponse = nil;
- __block SDLDisplayCapabilities *testDisplayCapabilities = nil;
- __block NSArray<SDLSoftButtonCapabilities *> *testSoftButtonCapabilities = nil;
- __block NSArray<SDLButtonCapabilities *> *testButtonCapabilities = nil;
- __block SDLPresetBankCapabilities *testPresetBankCapabilities = nil;
beforeEach(^{
- testDisplayCapabilities = [[SDLDisplayCapabilities alloc] init];
- testDisplayCapabilities.graphicSupported = @NO;
-
- SDLSoftButtonCapabilities *softButtonCapability = [[SDLSoftButtonCapabilities alloc] init];
- softButtonCapability.shortPressAvailable = @NO;
- softButtonCapability.longPressAvailable = @NO;
- softButtonCapability.upDownAvailable = @NO;
- softButtonCapability.imageSupported = @NO;
- testSoftButtonCapabilities = @[softButtonCapability];
-
- SDLButtonCapabilities *buttonCapabilities = [[SDLButtonCapabilities alloc] init];
- buttonCapabilities.name = SDLButtonNameOk;
- buttonCapabilities.shortPressAvailable = @NO;
- buttonCapabilities.longPressAvailable = @NO;
- buttonCapabilities.upDownAvailable = @NO;
- testButtonCapabilities = @[buttonCapabilities];
-
- testPresetBankCapabilities = [[SDLPresetBankCapabilities alloc] init];
- testPresetBankCapabilities.onScreenPresetsAvailable = @NO;
-
testSetDisplayLayoutResponse = [[SDLSetDisplayLayoutResponse alloc] init];
testSetDisplayLayoutResponse.displayCapabilities = testDisplayCapabilities;
testSetDisplayLayoutResponse.buttonCapabilities = testButtonCapabilities;
@@ -237,10 +268,14 @@ describe(@"System capability manager", ^{
});
it(@"should not save any capabilities", ^{
+ expect(testSystemCapabilityManager.displays).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
expect(testSystemCapabilityManager.softButtonCapabilities).to(beNil());
expect(testSystemCapabilityManager.buttonCapabilities).to(beNil());
expect(testSystemCapabilityManager.presetBankCapabilities).to(beNil());
+#pragma clang diagnostic pop
});
});
@@ -252,10 +287,14 @@ describe(@"System capability manager", ^{
});
it(@"should should save the capabilities", ^{
+ expect(testSystemCapabilityManager.displays).to(equal(testDisplayCapabilityList));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
expect(testSystemCapabilityManager.displayCapabilities).to(equal(testDisplayCapabilities));
expect(testSystemCapabilityManager.softButtonCapabilities).to(equal(testSoftButtonCapabilities));
expect(testSystemCapabilityManager.buttonCapabilities).to(equal(testButtonCapabilities));
expect(testSystemCapabilityManager.presetBankCapabilities).to(equal(testPresetBankCapabilities));
+#pragma clang diagnostic pop
});
});
@@ -275,6 +314,46 @@ describe(@"System capability manager", ^{
expect(testSystemCapabilityManager.appServicesCapabilities).to(beNil());
});
});
+
+ context(@"when updating display capabilities with OnSystemCapabilityUpdated", ^{
+ it(@"should properly update display capability including conversion two times", ^{
+ // two times because capabilities are just saved in first run but merged/updated in subsequent runs
+ for (int i = 0; i < 2; i++) {
+ testDisplayCapabilities.displayName = [NSString stringWithFormat:@"Display %i", i];
+ testDisplayCapabilities.graphicSupported = i == 0 ? @(NO) : @(YES);
+ testDisplayCapabilities.templatesAvailable = @[[NSString stringWithFormat:@"Template %i", i]];
+
+ SDLWindowTypeCapabilities *windowTypeCapabilities = [[SDLWindowTypeCapabilities alloc] initWithType:SDLWindowTypeMain maximumNumberOfWindows:1];
+ SDLDisplayCapability *displayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:testDisplayCapabilities.displayName];
+ displayCapability.windowTypeSupported = @[windowTypeCapabilities];
+ SDLWindowCapability *defaultWindowCapability = [[SDLWindowCapability alloc] init];
+ defaultWindowCapability.windowID = @(SDLPredefinedWindowsDefaultWindow);
+ defaultWindowCapability.buttonCapabilities = testButtonCapabilities.copy;
+ defaultWindowCapability.softButtonCapabilities = testSoftButtonCapabilities.copy;
+ defaultWindowCapability.templatesAvailable = testDisplayCapabilities.templatesAvailable.copy;
+ defaultWindowCapability.numCustomPresetsAvailable = testDisplayCapabilities.numCustomPresetsAvailable.copy;
+ defaultWindowCapability.textFields = testDisplayCapabilities.textFields.copy;
+ defaultWindowCapability.imageFields = testDisplayCapabilities.imageFields.copy;
+ defaultWindowCapability.imageTypeSupported = testDisplayCapabilities.graphicSupported.boolValue ? @[SDLImageTypeStatic, SDLImageTypeDynamic] : @[SDLImageTypeStatic];
+ displayCapability.windowCapabilities = @[defaultWindowCapability];
+ NSArray<SDLDisplayCapability *> *newDisplayCapabilityList = testDisplayCapabilityList = @[displayCapability];
+
+ SDLSystemCapability *newCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:newDisplayCapabilityList];
+ SDLOnSystemCapabilityUpdated *testUpdateNotification = [[SDLOnSystemCapabilityUpdated alloc] initWithSystemCapability:newCapability];
+ SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveSystemCapabilityUpdatedNotification object:nil rpcNotification:testUpdateNotification];
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ expect(testSystemCapabilityManager.displays).to(equal(testDisplayCapabilityList));
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ expect(testSystemCapabilityManager.displayCapabilities).to(equal(testDisplayCapabilities));
+ expect(testSystemCapabilityManager.buttonCapabilities).to(equal(testButtonCapabilities));
+ expect(testSystemCapabilityManager.softButtonCapabilities).to(equal(testSoftButtonCapabilities));
+ expect(testSystemCapabilityManager.presetBankCapabilities).to(beNil());
+#pragma clang diagnostic pop
+ }
+ });
+ });
context(@"When sending a GetSystemCapability request", ^{
__block SDLGetSystemCapabilityResponse *testGetSystemCapabilityResponse = nil;
@@ -334,11 +413,15 @@ describe(@"System capability manager", ^{
afterEach(^{
// Make sure the RAIR properties and other system capabilities were not inadverdently set
- expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
+ expect(testSystemCapabilityManager.displays).to(beNil());
expect(testSystemCapabilityManager.hmiCapabilities).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
expect(testSystemCapabilityManager.softButtonCapabilities).to(beNil());
expect(testSystemCapabilityManager.buttonCapabilities).to(beNil());
expect(testSystemCapabilityManager.presetBankCapabilities).to(beNil());
+#pragma clang diagnostic pop
expect(testSystemCapabilityManager.hmiZoneCapabilities).to(beNil());
expect(testSystemCapabilityManager.speechCapabilities).to(beNil());
expect(testSystemCapabilityManager.prerecordedSpeechCapabilities).to(beNil());
@@ -551,7 +634,7 @@ describe(@"System capability manager", ^{
});
it(@"should send GetSystemCapability subscriptions for all known capabilities", ^{
- expect(testConnectionManager.receivedRequests).to(haveCount(6));
+ expect(testConnectionManager.receivedRequests).to(haveCount(7));
expect(testConnectionManager.receivedRequests.lastObject).to(beAnInstanceOf([SDLGetSystemCapability class]));
});
});
@@ -562,11 +645,15 @@ describe(@"System capability manager", ^{
});
it(@"It should reset the system capability manager properties correctly", ^{
- expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
expect(testSystemCapabilityManager.hmiCapabilities).to(beNil());
+ expect(testSystemCapabilityManager.displays).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+ expect(testSystemCapabilityManager.displayCapabilities).to(beNil());
expect(testSystemCapabilityManager.softButtonCapabilities).to(beNil());
expect(testSystemCapabilityManager.buttonCapabilities).to(beNil());
expect(testSystemCapabilityManager.presetBankCapabilities).to(beNil());
+#pragma clang diagnostic pop
expect(testSystemCapabilityManager.hmiZoneCapabilities).to(beNil());
expect(testSystemCapabilityManager.speechCapabilities).to(beNil());
expect(testSystemCapabilityManager.prerecordedSpeechCapabilities).to(beNil());