summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Fischer <joeljfischer@gmail.com>2019-10-01 10:13:34 -0400
committerJoel Fischer <joeljfischer@gmail.com>2019-10-01 10:13:34 -0400
commitf907a2d8c67805b79196320b91d6b3dddd4ae302 (patch)
tree5b29921adf104db00f321321e2160bf0d79d368a
parent8b86dccb51c8714e8dfcc50691eaccfe50acf81a (diff)
parent4f79b980a5907f56bcab42b0d6698d906dc7a9e7 (diff)
downloadsdl_ios-f907a2d8c67805b79196320b91d6b3dddd4ae302.tar.gz
Merge branch 'feature/issue_1386_manager_update_display_capability' of https://github.com/yLeonid/sdl_ios into yLeonid-feature/issue_1386_manager_update_display_capability
-rw-r--r--Example Apps/Example ObjC/ProxyManager.m14
-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.m7
-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.m13
-rw-r--r--SmartDeviceLink/SDLSoftButtonManager.h4
-rw-r--r--SmartDeviceLink/SDLSoftButtonManager.m52
-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.m193
-rw-r--r--SmartDeviceLink/SDLTextAndGraphicManager.h3
-rw-r--r--SmartDeviceLink/SDLTextAndGraphicManager.m57
-rw-r--r--SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.h24
-rw-r--r--SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.m (renamed from SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.m)14
-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.m14
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m28
-rw-r--r--SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m2
-rw-r--r--SmartDeviceLinkTests/SDLScreenManagerSpec.m5
-rw-r--r--SmartDeviceLinkTests/SDLSoftButtonReplaceOperationSpec.m1
-rw-r--r--SmartDeviceLinkTests/SDLSystemCapabilityManagerSpec.m194
34 files changed, 591 insertions, 403 deletions
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/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 3af8216fe..a85517dac 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 */; };
@@ -2082,6 +2082,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>"; };
@@ -2142,8 +2144,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; };
@@ -3983,8 +3983,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>";
@@ -6774,7 +6774,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 */,
@@ -6871,6 +6870,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 */,
@@ -7438,6 +7438,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 */,
@@ -7595,7 +7596,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..0de7f1a37 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,9 @@ 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 +523,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/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..5ea131e30 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,23 +26,25 @@ 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;
}
diff --git a/SmartDeviceLink/SDLSoftButtonManager.h b/SmartDeviceLink/SDLSoftButtonManager.h
index dfd3d7104..04678200c 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,10 @@ 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;
/**
* Stops the manager. This method is used internally.
diff --git a/SmartDeviceLink/SDLSoftButtonManager.m b/SmartDeviceLink/SDLSoftButtonManager.m
index 6a79c811d..53de9792a 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, 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;
@@ -53,7 +56,7 @@ 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; }
@@ -65,8 +68,7 @@ NS_ASSUME_NONNULL_BEGIN
_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];
+ [_systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityUpdate:)];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
return self;
@@ -76,8 +78,7 @@ NS_ASSUME_NONNULL_BEGIN
_softButtonObjects = @[];
_currentMainField1 = nil;
_currentLevel = nil;
- _displayCapabilities = nil;
- _softButtonCapabilities = nil;
+ _windowCapability = nil;
[_transactionQueue cancelAllOperations];
self.transactionQueue = [self sdl_newTransactionQueue];
@@ -121,7 +122,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 +134,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 +191,11 @@ 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_displayCapabilityUpdate:(SDLSystemCapability *)systemCapability {
+ _windowCapability = systemCapability.displayCapabilities[0].windowCapabilities[0];
// 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..d0be4ffc4 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,56 @@ 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_callSaveHandlerForCapability:systemCapability andReturnWithValue:YES 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; }
-
+
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_callSaveHandlerForCapability:systemCapability andReturnWithValue:YES handler:nil];
}
@@ -243,6 +262,153 @@ typedef NSString * SDLServiceID;
[self sdl_subscribeToSystemCapabilityUpdates];
}
+#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];
+}
+
+- (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 clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+- (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
+
+- (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;
+}
+
+- (void)sdl_updateDeprecatedDisplayCapabilities {
+ SDLWindowCapability *defaultMainWindowCapabilities = self.defaultMainWindowCapability;
+ NSArray<SDLDisplayCapability *> *displayCapabilityList = self.displays;
+
+ if (displayCapabilityList == nil || displayCapabilityList.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;
+}
+
+- (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 - System Capabilities
- (void)updateCapabilityType:(SDLSystemCapabilityType)type completionHandler:(SDLUpdateCapabilityHandler)handler {
@@ -262,7 +428,7 @@ 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];
}
/**
@@ -332,6 +498,9 @@ typedef NSString * SDLServiceID;
} 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;
diff --git a/SmartDeviceLink/SDLTextAndGraphicManager.h b/SmartDeviceLink/SDLTextAndGraphicManager.h
index 48c9c7332..61523c4c9 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,7 @@ 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;
/**
* Stops the manager. This method is used internally.
diff --git a/SmartDeviceLink/SDLTextAndGraphicManager.m b/SmartDeviceLink/SDLTextAndGraphicManager.m
index 4e0551459..171b4619d 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 *defaultMainWindowCapability;
@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,8 +81,7 @@ 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];
+ [_systemCapabilityManager subscribeToCapabilityType:SDLSystemCapabilityTypeDisplays withObserver:self selector:@selector(sdl_displayCapabilityUpdate:)];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sdl_hmiStatusNotification:) name:SDLDidChangeHMIStatusNotification object:nil];
return self;
@@ -105,7 +107,7 @@ NS_ASSUME_NONNULL_BEGIN
_queuedImageUpdate = nil;
_hasQueuedUpdate = NO;
_queuedUpdateHandler = nil;
- _displayCapabilities = nil;
+ _defaultMainWindowCapability = nil;
_currentLevel = SDLHMILevelNone;
_blankArtwork = nil;
_waitingOnHMILevelUpdateToUpdate = NO;
@@ -294,7 +296,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.defaultMainWindowCapability ? self.defaultMainWindowCapability.maxNumberOfMainFieldLines : 4;
if (numberOfLines == 1) {
show = [self sdl_assembleOneLineShowText:show withShowFields:nonNilFields];
} else if (numberOfLines == 2) {
@@ -505,7 +507,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (BOOL)sdl_shouldUpdatePrimaryImage {
- BOOL templateSupportsPrimaryArtwork = self.displayCapabilities ? [self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] : YES;
+ BOOL templateSupportsPrimaryArtwork = self.defaultMainWindowCapability ? [self.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameGraphic] : YES;
return (templateSupportsPrimaryArtwork
&& ![self.currentScreenData.graphic.value isEqualToString:self.primaryGraphic.name]
@@ -513,7 +515,7 @@ NS_ASSUME_NONNULL_BEGIN
}
- (BOOL)sdl_shouldUpdateSecondaryImage {
- BOOL templateSupportsSecondaryArtwork = self.displayCapabilities ? ([self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameGraphic] || [self.displayCapabilities hasImageFieldOfName:SDLImageFieldNameSecondaryGraphic]) : YES;
+ BOOL templateSupportsSecondaryArtwork = self.defaultMainWindowCapability ? ([self.defaultMainWindowCapability hasImageFieldOfName:SDLImageFieldNameGraphic] || [self.defaultMainWindowCapability 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 +691,12 @@ 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_displayCapabilityUpdate:(SDLSystemCapability *)systemCapability {
+ // we won't use the object in the parameter but the convenience method of the system capability manager
+ self.defaultMainWindowCapability = _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..0786eb89f
--- /dev/null
+++ b/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.h
@@ -0,0 +1,24 @@
+//
+// SDLWindowCapability+ShowManagerExtensions.h
+// SmartDeviceLink
+//
+// Created by Kujtim Shala (Ford) on 13.09.19.
+// 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..5d8961cb5 100644
--- a/SmartDeviceLink/SDLDisplayCapabilities+ShowManagerExtensions.m
+++ b/SmartDeviceLink/SDLWindowCapability+ShowManagerExtensions.m
@@ -1,16 +1,16 @@
//
-// SDLDisplayCapabilities+ShowManagerExtensions.m
+// SDLWindowCapability+ShowManagerExtensions.m
// SmartDeviceLink
//
-// Created by Joel Fischer on 2/28/18.
-// Copyright © 2018 smartdevicelink. All rights reserved.
+// Created by Kujtim Shala (Ford) on 13.09.19.
+// 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 +41,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/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..2fa7dc204 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.0015));
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 6b677a0b5..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:SDLDidReceiveSetDisplayLayoutRequest object:self 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:self 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..f5a80725f 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,10 @@ 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];
expect(testManager.currentLevel).to(beNil());
testManager.currentLevel = SDLHMILevelFull;
@@ -82,8 +84,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 +245,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..a7bcb1624 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 *defaultMainWindowCapability;
@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,8 @@ 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];
});
it(@"should instantiate correctly", ^{
@@ -76,7 +80,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.defaultMainWindowCapability).to(beNil());
expect(testManager.currentLevel).to(equal(SDLHMILevelNone));
expect(testManager.blankArtwork).toNot(beNil());
expect(testManager.isDirty).to(beFalse());
@@ -367,10 +371,10 @@ describe(@"text and graphic manager", ^{
context(@"with one line available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.defaultMainWindowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineOneField = [[SDLTextField alloc] init];
lineOneField.name = SDLTextFieldNameMainField1;
- testManager.displayCapabilities.textFields = @[lineOneField];
+ testManager.defaultMainWindowCapability.textFields = @[lineOneField];
});
it(@"should set mediatrack properly", ^{
@@ -468,10 +472,10 @@ describe(@"text and graphic manager", ^{
context(@"with two lines available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.defaultMainWindowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineTwoField = [[SDLTextField alloc] init];
lineTwoField.name = SDLTextFieldNameMainField2;
- testManager.displayCapabilities.textFields = @[lineTwoField];
+ testManager.defaultMainWindowCapability.textFields = @[lineTwoField];
});
it(@"should set mediatrack properly", ^{
@@ -578,10 +582,10 @@ describe(@"text and graphic manager", ^{
context(@"with three lines available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.defaultMainWindowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineThreeField = [[SDLTextField alloc] init];
lineThreeField.name = SDLTextFieldNameMainField3;
- testManager.displayCapabilities.textFields = @[lineThreeField];
+ testManager.defaultMainWindowCapability.textFields = @[lineThreeField];
});
it(@"should set mediatrack properly", ^{
@@ -692,10 +696,10 @@ describe(@"text and graphic manager", ^{
context(@"with four lines available", ^{
beforeEach(^{
- testManager.displayCapabilities = [[SDLDisplayCapabilities alloc] init];
+ testManager.defaultMainWindowCapability = [[SDLWindowCapability alloc] init];
SDLTextField *lineFourField = [[SDLTextField alloc] init];
lineFourField.name = SDLTextFieldNameMainField4;
- testManager.displayCapabilities.textFields = @[lineFourField];
+ testManager.defaultMainWindowCapability.textFields = @[lineFourField];
});
it(@"should set mediatrack properly", ^{
@@ -964,7 +968,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.defaultMainWindowCapability).to(beNil());
expect(testManager.currentLevel).to(equal(SDLHMILevelNone));
expect(testManager.blankArtwork).toNot(beNil());
expect(testManager.isDirty).to(beFalse());
diff --git a/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m b/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m
index ad847378e..819657285 100644
--- a/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m
+++ b/SmartDeviceLinkTests/SDLAsynchronousRPCOperationSpec.m
@@ -83,7 +83,7 @@ describe(@"sending responses and notifications", ^{
[testOperationQueue addOperation:testOperation];
[testOperationQueue cancelAllOperations];
- [NSThread sleepForTimeInterval:0.5];
+ [NSThread sleepForTimeInterval:1.0];
expect(testConnectionManager.receivedRequests).toEventually(beEmpty());
});
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..f8a0b44f6 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,14 @@ describe(@"System capability manager", ^{
});
it(@"It should reset the system capability manager properties correctly", ^{
- expect(testSystemCapabilityManager.displayCapabilities).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());