summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Fischer <joeljfischer@gmail.com>2021-02-24 11:52:34 -0800
committerGitHub <noreply@github.com>2021-02-24 11:52:34 -0800
commitc9db35d11bc18c8f7a341f0f4231a381f9e3be2e (patch)
treeca415282012f9b1fe57c11749a6a5f243baa2b06
parentac0f68aa448e5b0dbe798e305c0eb3190c5e1906 (diff)
parent015b6b554c901cc0c6aa4d3b24ca505c58ee1802 (diff)
downloadsdl_ios-c9db35d11bc18c8f7a341f0f4231a381f9e3be2e.tar.gz
Merge pull request #1883 from LuxoftSDL/feature/SDL0238_keyboard_enhancements
SDL-0238 Keyboard Enhancements
-rw-r--r--SmartDeviceLink-iOS.xcodeproj/project.pbxproj302
-rw-r--r--SmartDeviceLink/private/SDLChoiceSetManager.m8
-rw-r--r--SmartDeviceLink/private/SDLPresentChoiceSetOperation.h3
-rw-r--r--SmartDeviceLink/private/SDLPresentChoiceSetOperation.m18
-rw-r--r--SmartDeviceLink/private/SDLPresentKeyboardOperation.h4
-rw-r--r--SmartDeviceLink/private/SDLPresentKeyboardOperation.m21
-rw-r--r--SmartDeviceLink/private/SDLRPCParameterNames.h6
-rw-r--r--SmartDeviceLink/private/SDLRPCParameterNames.m6
-rw-r--r--SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h9
-rw-r--r--SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m44
-rw-r--r--SmartDeviceLink/public/SDLKeyboardCapabilities.h64
-rw-r--r--SmartDeviceLink/public/SDLKeyboardCapabilities.m70
-rw-r--r--SmartDeviceLink/public/SDLKeyboardDelegate.h8
-rw-r--r--SmartDeviceLink/public/SDLKeyboardEvent.h10
-rw-r--r--SmartDeviceLink/public/SDLKeyboardEvent.m2
-rw-r--r--SmartDeviceLink/public/SDLKeyboardInputMask.h46
-rw-r--r--SmartDeviceLink/public/SDLKeyboardInputMask.m37
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayout.h5
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayout.m1
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayoutCapability.h62
-rw-r--r--SmartDeviceLink/public/SDLKeyboardLayoutCapability.m72
-rw-r--r--SmartDeviceLink/public/SDLKeyboardProperties.h35
-rw-r--r--SmartDeviceLink/public/SDLKeyboardProperties.m26
-rw-r--r--SmartDeviceLink/public/SDLWindowCapability.h27
-rw-r--r--SmartDeviceLink/public/SDLWindowCapability.m14
-rw-r--r--SmartDeviceLink/public/SmartDeviceLink.h3
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m2
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m29
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m36
-rw-r--r--SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m4
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m6
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m23
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m5
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m75
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m75
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m207
-rw-r--r--SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m284
37 files changed, 1362 insertions, 287 deletions
diff --git a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
index 04d451b0e..49658d0d3 100644
--- a/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
+++ b/SmartDeviceLink-iOS.xcodeproj/project.pbxproj
@@ -294,7 +294,7 @@
4A402561250134CB0080E159 /* SDLStabilityControlsStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A40255F250134CA0080E159 /* SDLStabilityControlsStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
4A404C66250BBE11003AB65D /* SDLTextAndGraphicUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A404C65250BBE11003AB65D /* SDLTextAndGraphicUpdateOperationSpec.m */; };
4A404C68250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A404C67250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m */; };
- 4A41430D255F0A090039C267 /* TestConnectionRequestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */; };
+ 4A41430D255F0A090039C267 /* TestConnectionRequestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */; };
4A457DC324A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DC224A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m */; };
4A457DD324A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DD224A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m */; };
4A457DD524A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */; };
@@ -1384,9 +1384,9 @@
4ABB2BA724F850AE0061BF55 /* SDLImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB2B9924F850AD0061BF55 /* SDLImage.h */; settings = {ATTRIBUTES = (Public, ); }; };
4ABB2BA824F850AE0061BF55 /* SDLLightState.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */; };
4ABB2BA924F850AE0061BF55 /* SDLImageResolution.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */; };
- 4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */; };
- 4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */; };
+ 4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */; };
+ 4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */; };
+ 4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */; };
4AE8A7022537796E000666C0 /* SmartDeviceLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AE8A7012537796E000666C0 /* SmartDeviceLink.h */; settings = {ATTRIBUTES = (Public, ); }; };
5D0A9F911F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */; };
5D0A9F931F15560B00CC80DD /* SDLNavigationCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D0A9F921F15560B00CC80DD /* SDLNavigationCapabilitySpec.m */; };
@@ -1672,21 +1672,30 @@
B360F9E5255F52BA0027CA17 /* SDLSeatOccupancy.h in Headers */ = {isa = PBXBuildFile; fileRef = B360F9E3255F52B90027CA17 /* SDLSeatOccupancy.h */; settings = {ATTRIBUTES = (Public, ); }; };
B38389D6257C187500420C11 /* SDLSeatOccupancySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38389D4257C187400420C11 /* SDLSeatOccupancySpec.m */; };
B38389D7257C187500420C11 /* SDLSeatStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38389D5257C187500420C11 /* SDLSeatStatusSpec.m */; };
- B3838A01257C47FD00420C11 /* SDLDoorStatusTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */; };
- B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */; };
- B3838A0F257C4EE100420C11 /* SDLGateStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */; };
- B3838A15257C4EFD00420C11 /* SDLRoofStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */; };
- B3838A20257C5BB000420C11 /* SDLRoofStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B3838A21257C5BB000420C11 /* SDLRoofStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */; };
- B3838A28257C5CE600420C11 /* SDLDoorStatusType.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B3838A29257C5CE600420C11 /* SDLDoorStatusType.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */; };
- B3838A30257C5D1B00420C11 /* SDLGateStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */; };
- B3838A31257C5D1B00420C11 /* SDLGateStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
- B3838A3A257C6AB700420C11 /* SDLDoorStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A38257C6AB600420C11 /* SDLDoorStatus.m */; };
- B3838A3B257C6AB700420C11 /* SDLDoorStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A39257C6AB600420C11 /* SDLDoorStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A01257C47FD00420C11 /* SDLDoorStatusTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */; };
+ B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */; };
+ B3838A0F257C4EE100420C11 /* SDLGateStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */; };
+ B3838A15257C4EFD00420C11 /* SDLRoofStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */; };
+ B3838A20257C5BB000420C11 /* SDLRoofStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A21257C5BB000420C11 /* SDLRoofStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */; };
+ B3838A28257C5CE600420C11 /* SDLDoorStatusType.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A29257C5CE600420C11 /* SDLDoorStatusType.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */; };
+ B3838A30257C5D1B00420C11 /* SDLGateStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */; };
+ B3838A31257C5D1B00420C11 /* SDLGateStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3838A3A257C6AB700420C11 /* SDLDoorStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = B3838A38257C6AB600420C11 /* SDLDoorStatus.m */; };
+ B3838A3B257C6AB700420C11 /* SDLDoorStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = B3838A39257C6AB600420C11 /* SDLDoorStatus.h */; settings = {ATTRIBUTES = (Public, ); }; };
B38D8E7E24A118BD00B977D0 /* SDLGearStatusSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E7D24A118BD00B977D0 /* SDLGearStatusSpec.m */; };
B38D8E8024A1E3D000B977D0 /* SDLTransmissionTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E7F24A1E3D000B977D0 /* SDLTransmissionTypeSpec.m */; };
B38D8E8224A1F53500B977D0 /* SDLCapacityUnitSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */; };
+ B3A9D9E125D2571000CDFD21 /* SDLKeyboardCapabilities.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D9DF25D2571000CDFD21 /* SDLKeyboardCapabilities.m */; };
+ B3A9D9E225D2571000CDFD21 /* SDLKeyboardCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9D9E025D2571000CDFD21 /* SDLKeyboardCapabilities.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9D9E725D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D9E525D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m */; };
+ B3A9D9E825D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9D9E625D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9D9ED25D2586C00CDFD21 /* SDLKeyboardInputMask.h in Headers */ = {isa = PBXBuildFile; fileRef = B3A9D9EB25D2586C00CDFD21 /* SDLKeyboardInputMask.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B3A9D9EE25D2586C00CDFD21 /* SDLKeyboardInputMask.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D9EC25D2586C00CDFD21 /* SDLKeyboardInputMask.m */; };
+ B3A9DA0425D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DA0325D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m */; };
+ B3A9DA0A25D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DA0925D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m */; };
+ B3A9DA1225D270EA00CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9DA1125D270E900CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m */; };
B3EC9E6E2579AA010039F3AA /* SDLClimateDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */; };
B3F7918324E062C200DB5CAF /* SDLGetVehicleDataSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 162E824C1A9BDE8A00906325 /* SDLGetVehicleDataSpec.m */; };
C975877F257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */; };
@@ -2098,8 +2107,8 @@
4A40255F250134CA0080E159 /* SDLStabilityControlsStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLStabilityControlsStatus.h; path = public/SDLStabilityControlsStatus.h; sourceTree = "<group>"; };
4A404C65250BBE11003AB65D /* SDLTextAndGraphicUpdateOperationSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLTextAndGraphicUpdateOperationSpec.m; path = DevAPISpecs/SDLTextAndGraphicUpdateOperationSpec.m; sourceTree = "<group>"; };
4A404C67250BBE2B003AB65D /* SDLTextAndGraphicStateSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLTextAndGraphicStateSpec.m; path = DevAPISpecs/SDLTextAndGraphicStateSpec.m; sourceTree = "<group>"; };
- 4A41430B255F0A090039C267 /* TestConnectionRequestObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestConnectionRequestObject.h; sourceTree = "<group>"; };
- 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestConnectionRequestObject.m; sourceTree = "<group>"; };
+ 4A41430B255F0A090039C267 /* TestConnectionRequestObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestConnectionRequestObject.h; sourceTree = "<group>"; };
+ 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestConnectionRequestObject.m; sourceTree = "<group>"; };
4A457DC224A2933E00386CBA /* SDLLifecycleRPCAdapterSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleRPCAdapterSpec.m; path = DevAPISpecs/SDLLifecycleRPCAdapterSpec.m; sourceTree = "<group>"; };
4A457DD224A3886700386CBA /* SDLLifecycleSyncPDataHandlerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleSyncPDataHandlerSpec.m; path = DevAPISpecs/SDLLifecycleSyncPDataHandlerSpec.m; sourceTree = "<group>"; };
4A457DD424A3C16E00386CBA /* SDLLifecycleMobileHMIStateHandlerSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLLifecycleMobileHMIStateHandlerSpec.m; path = DevAPISpecs/SDLLifecycleMobileHMIStateHandlerSpec.m; sourceTree = "<group>"; };
@@ -3195,9 +3204,9 @@
4ABB2B9924F850AD0061BF55 /* SDLImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLImage.h; path = public/SDLImage.h; sourceTree = "<group>"; };
4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLLightState.m; path = public/SDLLightState.m; sourceTree = "<group>"; };
4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLImageResolution.h; path = public/SDLImageResolution.h; sourceTree = "<group>"; };
- 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperation.m; path = private/SDLVoiceCommandUpdateOperation.m; sourceTree = "<group>"; };
- 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLVoiceCommandUpdateOperation.h; path = private/SDLVoiceCommandUpdateOperation.h; sourceTree = "<group>"; };
- 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperationSpec.m; path = DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m; sourceTree = "<group>"; };
+ 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperation.m; path = private/SDLVoiceCommandUpdateOperation.m; sourceTree = "<group>"; };
+ 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLVoiceCommandUpdateOperation.h; path = private/SDLVoiceCommandUpdateOperation.h; sourceTree = "<group>"; };
+ 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SDLVoiceCommandUpdateOperationSpec.m; path = DevAPISpecs/SDLVoiceCommandUpdateOperationSpec.m; sourceTree = "<group>"; };
4AE8A7012537796E000666C0 /* SmartDeviceLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SmartDeviceLink.h; path = public/SmartDeviceLink.h; sourceTree = "<group>"; };
4AE8A707253779F9000666C0 /* EAAccessory+OCMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "EAAccessory+OCMock.h"; sourceTree = "<group>"; };
5D0A9F901F15550400CC80DD /* SDLSystemCapabilityTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLSystemCapabilityTypeSpec.m; sourceTree = "<group>"; };
@@ -3524,21 +3533,30 @@
B360F9E3255F52B90027CA17 /* SDLSeatOccupancy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLSeatOccupancy.h; path = public/SDLSeatOccupancy.h; sourceTree = "<group>"; };
B38389D4257C187400420C11 /* SDLSeatOccupancySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSeatOccupancySpec.m; path = SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatOccupancySpec.m; sourceTree = SOURCE_ROOT; };
B38389D5257C187500420C11 /* SDLSeatStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLSeatStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/ResponseSpecs/SDLSeatStatusSpec.m; sourceTree = SOURCE_ROOT; };
- B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDoorStatusTypeSpec.m; sourceTree = "<group>"; };
- B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m; sourceTree = SOURCE_ROOT; };
- B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGateStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m; sourceTree = SOURCE_ROOT; };
- B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRoofStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m; sourceTree = SOURCE_ROOT; };
- B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLRoofStatus.h; path = public/SDLRoofStatus.h; sourceTree = "<group>"; };
- B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRoofStatus.m; path = public/SDLRoofStatus.m; sourceTree = "<group>"; };
- B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDoorStatusType.h; path = public/SDLDoorStatusType.h; sourceTree = "<group>"; };
- B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatusType.m; path = public/SDLDoorStatusType.m; sourceTree = "<group>"; };
- B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGateStatus.m; path = public/SDLGateStatus.m; sourceTree = "<group>"; };
- B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLGateStatus.h; path = public/SDLGateStatus.h; sourceTree = "<group>"; };
- B3838A38257C6AB600420C11 /* SDLDoorStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatus.m; path = public/SDLDoorStatus.m; sourceTree = "<group>"; };
- B3838A39257C6AB600420C11 /* SDLDoorStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDoorStatus.h; path = public/SDLDoorStatus.h; sourceTree = "<group>"; };
+ B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLDoorStatusTypeSpec.m; sourceTree = "<group>"; };
+ B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLDoorStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGateStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLGateStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRoofStatusSpec.m; path = SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLRoofStatusSpec.m; sourceTree = SOURCE_ROOT; };
+ B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLRoofStatus.h; path = public/SDLRoofStatus.h; sourceTree = "<group>"; };
+ B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLRoofStatus.m; path = public/SDLRoofStatus.m; sourceTree = "<group>"; };
+ B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDoorStatusType.h; path = public/SDLDoorStatusType.h; sourceTree = "<group>"; };
+ B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatusType.m; path = public/SDLDoorStatusType.m; sourceTree = "<group>"; };
+ B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLGateStatus.m; path = public/SDLGateStatus.m; sourceTree = "<group>"; };
+ B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLGateStatus.h; path = public/SDLGateStatus.h; sourceTree = "<group>"; };
+ B3838A38257C6AB600420C11 /* SDLDoorStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLDoorStatus.m; path = public/SDLDoorStatus.m; sourceTree = "<group>"; };
+ B3838A39257C6AB600420C11 /* SDLDoorStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLDoorStatus.h; path = public/SDLDoorStatus.h; sourceTree = "<group>"; };
B38D8E7D24A118BD00B977D0 /* SDLGearStatusSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLGearStatusSpec.m; sourceTree = "<group>"; };
B38D8E7F24A1E3D000B977D0 /* SDLTransmissionTypeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLTransmissionTypeSpec.m; sourceTree = "<group>"; };
B38D8E8124A1F53500B977D0 /* SDLCapacityUnitSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLCapacityUnitSpec.m; sourceTree = "<group>"; };
+ B3A9D9DF25D2571000CDFD21 /* SDLKeyboardCapabilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLKeyboardCapabilities.m; path = public/SDLKeyboardCapabilities.m; sourceTree = "<group>"; };
+ B3A9D9E025D2571000CDFD21 /* SDLKeyboardCapabilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLKeyboardCapabilities.h; path = public/SDLKeyboardCapabilities.h; sourceTree = "<group>"; };
+ B3A9D9E525D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLKeyboardLayoutCapability.m; path = public/SDLKeyboardLayoutCapability.m; sourceTree = "<group>"; };
+ B3A9D9E625D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLKeyboardLayoutCapability.h; path = public/SDLKeyboardLayoutCapability.h; sourceTree = "<group>"; };
+ B3A9D9EB25D2586C00CDFD21 /* SDLKeyboardInputMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SDLKeyboardInputMask.h; path = public/SDLKeyboardInputMask.h; sourceTree = "<group>"; };
+ B3A9D9EC25D2586C00CDFD21 /* SDLKeyboardInputMask.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SDLKeyboardInputMask.m; path = public/SDLKeyboardInputMask.m; sourceTree = "<group>"; };
+ B3A9DA0325D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLKeyboardInputMaskSpec.m; sourceTree = "<group>"; };
+ B3A9DA0925D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLKeyboardCapabilitiesSpec.m; sourceTree = "<group>"; };
+ B3A9DA1125D270E900CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLKeyboardLayoutCapabilitySpec.m; sourceTree = "<group>"; };
B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SDLClimateDataSpec.m; sourceTree = "<group>"; };
BB3C600D221AEF37007DD4CA /* NSMutableDictionary+StoreSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = "NSMutableDictionary+StoreSpec.m"; path = "DevAPISpecs/NSMutableDictionary+StoreSpec.m"; sourceTree = "<group>"; };
C975877E257AEFDB0066F271 /* SDLSeekIndicatorTypeSpec.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDLSeekIndicatorTypeSpec.m; sourceTree = "<group>"; };
@@ -3737,7 +3755,7 @@
162E81F11A9BDE8A00906325 /* SDLDisplayTypeSpec.m */,
1EAA475D2035B177000FE74B /* SDLDisplayModeSpec.m */,
1EAA47612035B1AE000FE74B /* SDLDistanceUnitSpec.m */,
- B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */,
+ B3838A00257C47FD00420C11 /* SDLDoorStatusTypeSpec.m */,
162E81F21A9BDE8A00906325 /* SDLDriverDistractionStateSpec.m */,
162E81F31A9BDE8A00906325 /* SDLECallConfirmationStatusSpec.m */,
5DD8406420FCE21A0082CE04 /* SDLElectronicParkBrakeStatusSpec.m */,
@@ -3755,6 +3773,7 @@
162E81FD1A9BDE8A00906325 /* SDLImageTypeSpec.m */,
162E81FE1A9BDE8A00906325 /* SDLInteractionModeSpec.m */,
162E81FF1A9BDE8A00906325 /* SDLKeyboardEventSpec.m */,
+ B3A9DA0325D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m */,
162E82001A9BDE8A00906325 /* SDLKeyboardLayoutSpec.m */,
162E82011A9BDE8A00906325 /* SDLKeypressModeSpec.m */,
162E82021A9BDE8A00906325 /* SDLLanguageSpec.m */,
@@ -4027,19 +4046,20 @@
B3EC9E6D2579AA010039F3AA /* SDLClimateDataSpec.m */,
885468372225CBA400994D8D /* SDLCloudAppPropertiesSpec.m */,
162E82951A9BDE8A00906325 /* SDLClusterModeStatusSpec.m */,
+ B3992641258FAADF0048F09B /* SDLConfigurableKeyboardsSpec.m */,
DA9F7EB31DCC086400ACAE48 /* SDLDateTimeSpec.m */,
162E82961A9BDE8A00906325 /* SDLDeviceInfoSpec.m */,
162E82971A9BDE8A00906325 /* SDLDeviceStatusSpec.m */,
162E82981A9BDE8A00906325 /* SDLDIDResult.m */,
9FA0D00522DF06D3009CF344 /* SDLDisplayCapabilitySpec.m */,
162E82991A9BDE8A00906325 /* SDLDisplayCapabilitiesSpec.m */,
- B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */,
+ B3838A08257C4EB300420C11 /* SDLDoorStatusSpec.m */,
4A1B036E24CF484E008C6B13 /* SDLDriverDistractionCapabilitySpec.m */,
162E829A1A9BDE8A00906325 /* SDLECallInfoSpec.m */,
162E829B1A9BDE8A00906325 /* SDLEmergencyEventSpec.m */,
88B3BFA120DA911E00943565 /* SDLFuelRangeSpec.m */,
1EAA47752036B847000FE74B /* SDLEqualizerSettingsSpec.m */,
- B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */,
+ B3838A0E257C4EE100420C11 /* SDLGateStatusSpec.m */,
B38D8E7D24A118BD00B977D0 /* SDLGearStatusSpec.m */,
162E829C1A9BDE8A00906325 /* SDLGPSDataSpec.m */,
88EED83A1F33BECB00E6C42E /* SDLHapticRectSpec.m */,
@@ -4051,6 +4071,8 @@
162E829F1A9BDE8A00906325 /* SDLImageFieldSpec.m */,
5DB202261F5F2D030061D189 /* SDLImageResolutionSpec.m */,
162E82A01A9BDE8A00906325 /* SDLImageSpec.m */,
+ B3A9DA0925D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m */,
+ B3A9DA1125D270E900CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m */,
162E82A11A9BDE8A00906325 /* SDLKeyboardPropertiesSpec.m */,
1EAA476B2036A52F000FE74B /* SDLLightCapabilitiesSpec.m */,
1EAA476920369ECC000FE74B /* SDLLightControlCapabilitiesSpec.m */,
@@ -4081,14 +4103,12 @@
1EE8C44F1F38629200FDC2CF /* SDLRemoteControlCapabilitiesSpec.m */,
5DADA7771F4E059E0084D17D /* SDLRectangleSpec.m */,
5D92934F20AF526200FCC775 /* SDLRGBColorSpec.m */,
- B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */,
+ B3838A14257C4EFD00420C11 /* SDLRoofStatusSpec.m */,
162E82A71A9BDE8A00906325 /* SDLScreenParamsSpec.m */,
B38389D4257C187400420C11 /* SDLSeatOccupancySpec.m */,
B38389D5257C187500420C11 /* SDLSeatStatusSpec.m */,
1E89B0E1203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m */,
1E89B0DD2031636000A47992 /* SDLSeatControlDataSpec.m */,
- 000DD56B22EEF8E4005AB7A7 /* SDLSeatLocationCapabilitySpec.m */,
- 000DD56D22EF01FC005AB7A7 /* SDLSeatLocationSpec.m */,
1EB59CD9202DCEEC00343A61 /* SDLSeatMemoryActionSpec.m */,
C9758784257F4C570066F271 /* SDLSeekStreamingIndicatorSpec.m */,
162E82A81A9BDE8A00906325 /* SDLSingleTireStatusSpec.m */,
@@ -4117,8 +4137,8 @@
8855F9DF220C93B700A5C897 /* SDLWeatherDataSpec.m */,
880D2679220DDD1000B3F496 /* SDLWeatherServiceDataSpec.m */,
880D267F220E038800B3F496 /* SDLWeatherServiceManifestSpec.m */,
- 000DD56B22EEF8E4005AB7A7 /* SDLSeatLocationCapabilitySpec.m */,
- 000DD56D22EF01FC005AB7A7 /* SDLSeatLocationSpec.m */,
+ 000DD56B22EEF8E4005AB7A7 /* SDLSeatLocationCapabilitySpec.m */,
+ 000DD56D22EF01FC005AB7A7 /* SDLSeatLocationSpec.m */,
9FA0CFFF22DF06A0009CF344 /* SDLWindowCapabilitySpec.m */,
9FA0D00222DF06B9009CF344 /* SDLWindowTypeCapabilitiesSpec.m */,
);
@@ -4184,47 +4204,47 @@
path = MessageSpecs;
sourceTree = "<group>";
};
- 4A32B3E425559D93001FFA26 /* Voice Cammands */ = {
- isa = PBXGroup;
- children = (
- 4A32B3E525559DA4001FFA26 /* Cells */,
- 4A32B3E625559DAC001FFA26 /* Operations */,
- 4ABB25A824F7E6E10061BF55 /* SDLVoiceCommandManager.h */,
- 4ABB25A724F7E6E10061BF55 /* SDLVoiceCommandManager.m */,
- );
- name = "Voice Cammands";
- sourceTree = "<group>";
- };
- 4A32B3E525559DA4001FFA26 /* Cells */ = {
- isa = PBXGroup;
- children = (
- 4ABB259124F7E6820061BF55 /* SDLVoiceCommand.h */,
- 4ABB259024F7E6820061BF55 /* SDLVoiceCommand.m */,
- );
- name = Cells;
- sourceTree = "<group>";
- };
- 4A32B3E625559DAC001FFA26 /* Operations */ = {
- isa = PBXGroup;
- children = (
- 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */,
- 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */,
- );
- name = Operations;
- sourceTree = "<group>";
- };
- 4A32B3F325559F37001FFA26 /* Menu */ = {
- isa = PBXGroup;
- children = (
- 5D76751022D907F500E8D71A /* Configuration */,
- 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */,
- 5D339CEC207C08AB000CC364 /* Cells */,
- 4ABB25A924F7E6E10061BF55 /* SDLMenuManager.h */,
- 4ABB25A624F7E6E10061BF55 /* SDLMenuManager.m */,
- );
- name = Menu;
- sourceTree = "<group>";
- };
+ 4A32B3E425559D93001FFA26 /* Voice Cammands */ = {
+ isa = PBXGroup;
+ children = (
+ 4A32B3E525559DA4001FFA26 /* Cells */,
+ 4A32B3E625559DAC001FFA26 /* Operations */,
+ 4ABB25A824F7E6E10061BF55 /* SDLVoiceCommandManager.h */,
+ 4ABB25A724F7E6E10061BF55 /* SDLVoiceCommandManager.m */,
+ );
+ name = "Voice Cammands";
+ sourceTree = "<group>";
+ };
+ 4A32B3E525559DA4001FFA26 /* Cells */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABB259124F7E6820061BF55 /* SDLVoiceCommand.h */,
+ 4ABB259024F7E6820061BF55 /* SDLVoiceCommand.m */,
+ );
+ name = Cells;
+ sourceTree = "<group>";
+ };
+ 4A32B3E625559DAC001FFA26 /* Operations */ = {
+ isa = PBXGroup;
+ children = (
+ 4ABED25A257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h */,
+ 4ABED259257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m */,
+ );
+ name = Operations;
+ sourceTree = "<group>";
+ };
+ 4A32B3F325559F37001FFA26 /* Menu */ = {
+ isa = PBXGroup;
+ children = (
+ 5D76751022D907F500E8D71A /* Configuration */,
+ 755F175E229F14F70041B9CB /* Dynamic Menu Update Utilities */,
+ 5D339CEC207C08AB000CC364 /* Cells */,
+ 4ABB25A924F7E6E10061BF55 /* SDLMenuManager.h */,
+ 4ABB25A624F7E6E10061BF55 /* SDLMenuManager.m */,
+ );
+ name = Menu;
+ sourceTree = "<group>";
+ };
4A3BA4D9248E8EBB003E56B8 /* SystemRequest Handler */ = {
isa = PBXGroup;
children = (
@@ -4318,16 +4338,16 @@
name = "Status Manager";
sourceTree = "<group>";
};
- 4AD1F16A2559952D00637FE1 /* Voice Command */ = {
- isa = PBXGroup;
- children = (
- 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */,
- 5DAB5F5220989A8300A020C8 /* SDLVoiceCommandSpec.m */,
- 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */,
- );
- name = "Voice Command";
- sourceTree = "<group>";
- };
+ 4AD1F16A2559952D00637FE1 /* Voice Command */ = {
+ isa = PBXGroup;
+ children = (
+ 5DF40B27208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m */,
+ 5DAB5F5220989A8300A020C8 /* SDLVoiceCommandSpec.m */,
+ 4AD1F1732559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m */,
+ );
+ name = "Voice Command";
+ sourceTree = "<group>";
+ };
5D0218EB1A8E795700D1BF62 /* UI */ = {
isa = PBXGroup;
children = (
@@ -4499,9 +4519,9 @@
5D339CE5207C0651000CC364 /* Menu */ = {
isa = PBXGroup;
children = (
- 4A32B3F325559F37001FFA26 /* Menu */,
- 4A32B3E425559D93001FFA26 /* Voice Cammands */,
- );
+ 4A32B3F325559F37001FFA26 /* Menu */,
+ 4A32B3E425559D93001FFA26 /* Voice Cammands */,
+ );
name = Menu;
sourceTree = "<group>";
};
@@ -4550,7 +4570,7 @@
children = (
5D4019B11A76EC350006B0C2 /* Examples */,
5D61FA1D1A84237100846EE7 /* SmartDeviceLink */,
- 5D4346621E6F38E600B639C6 /* SmartDeviceLinkSwift */,
+ 5D4346621E6F38E600B639C6 /* SmartDeviceLinkSwift */,
5D61FA2C1A84237100846EE7 /* SmartDeviceLinkTests */,
5D4019B01A76EC350006B0C2 /* Products */,
);
@@ -5075,6 +5095,8 @@
4ABB2B2124F84EF00061BF55 /* SDLCloudAppProperties.m */,
4ABB2B3224F84EF30061BF55 /* SDLClusterModeStatus.h */,
4ABB2B3024F84EF30061BF55 /* SDLClusterModeStatus.m */,
+ B3992632258C276B0048F09B /* SDLConfigurableKeyboards.h */,
+ B3992631258C276A0048F09B /* SDLConfigurableKeyboards.m */,
4ABB2B2D24F84EF20061BF55 /* SDLDateTime.h */,
4ABB2B2324F84EF00061BF55 /* SDLDateTime.m */,
4ABB2B1F24F84EF00061BF55 /* SDLDeviceInfo.h */,
@@ -5087,8 +5109,8 @@
4ABB2B2524F84EF10061BF55 /* SDLDisplayCapabilities.m */,
4ABB2B3324F84EF30061BF55 /* SDLDisplayCapability.h */,
4ABB2B3824F84EF40061BF55 /* SDLDisplayCapability.m */,
- B3838A39257C6AB600420C11 /* SDLDoorStatus.h */,
- B3838A38257C6AB600420C11 /* SDLDoorStatus.m */,
+ B3838A39257C6AB600420C11 /* SDLDoorStatus.h */,
+ B3838A38257C6AB600420C11 /* SDLDoorStatus.m */,
4ABB2B3724F84EF40061BF55 /* SDLDriverDistractionCapability.h */,
4ABB2B2B24F84EF20061BF55 /* SDLDriverDistractionCapability.m */,
4A8BD3B924F98F89000945E3 /* SDLDynamicUpdateCapabilities.h */,
@@ -5101,8 +5123,8 @@
4ABB2B5D24F84FE30061BF55 /* SDLEqualizerSettings.m */,
4ABB2B6424F84FE50061BF55 /* SDLFuelRange.h */,
4ABB2B6524F84FE50061BF55 /* SDLFuelRange.m */,
- B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */,
- B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */,
+ B3838A2F257C5D1B00420C11 /* SDLGateStatus.h */,
+ B3838A2E257C5D1A00420C11 /* SDLGateStatus.m */,
4ABB2B5C24F84FE30061BF55 /* SDLGearStatus.h */,
4ABB2B5F24F84FE40061BF55 /* SDLGearStatus.m */,
4ABB2B5A24F84FE30061BF55 /* SDLGPSData.h */,
@@ -5127,6 +5149,12 @@
4ABB2B9824F850AD0061BF55 /* SDLImageField.m */,
4ABB2B9B24F850AD0061BF55 /* SDLImageResolution.h */,
4ABB2B9124F850AC0061BF55 /* SDLImageResolution.m */,
+ B3A9D9E025D2571000CDFD21 /* SDLKeyboardCapabilities.h */,
+ B3A9D9DF25D2571000CDFD21 /* SDLKeyboardCapabilities.m */,
+ B3A9D9EB25D2586C00CDFD21 /* SDLKeyboardInputMask.h */,
+ B3A9D9EC25D2586C00CDFD21 /* SDLKeyboardInputMask.m */,
+ B3A9D9E625D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h */,
+ B3A9D9E525D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m */,
4ABB2B9224F850AC0061BF55 /* SDLLightCapabilities.h */,
4ABB2B9624F850AD0061BF55 /* SDLLightCapabilities.m */,
4ABB2B8F24F850AB0061BF55 /* SDLLightControlCapabilities.h */,
@@ -5135,6 +5163,8 @@
4ABB2B9724F850AD0061BF55 /* SDLLightControlData.m */,
4ABB2B9424F850AC0061BF55 /* SDLLightState.h */,
4ABB2B9A24F850AD0061BF55 /* SDLLightState.m */,
+ B3992622258C1E480048F09B /* SDLKeyboardCapabilities.h */,
+ B3992621258C1E480048F09B /* SDLKeyboardCapabilities.m */,
4A8BD22724F93132000945E3 /* SDLKeyboardProperties.h */,
4A8BD23A24F93135000945E3 /* SDLKeyboardProperties.m */,
4A8BD22824F93132000945E3 /* SDLLocationCoordinate.h */,
@@ -5191,8 +5221,8 @@
4A8BD26C24F9343D000945E3 /* SDLRemoteControlCapabilities.m */,
4A8BD28724F934F2000945E3 /* SDLRGBColor.h */,
4A8BD28A24F934F3000945E3 /* SDLRGBColor.m */,
- B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */,
- B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */,
+ B3838A1E257C5BAF00420C11 /* SDLRoofStatus.h */,
+ B3838A1F257C5BB000420C11 /* SDLRoofStatus.m */,
4A8BD29124F93533000945E3 /* SDLScreenParams.h */,
4A8BD28F24F93533000945E3 /* SDLScreenParams.m */,
4A8BD29024F93533000945E3 /* SDLSeatControlCapabilities.h */,
@@ -5330,8 +5360,8 @@
4ABB272A24F7FD1B0061BF55 /* SDLDistanceUnit.m */,
4ABB272D24F7FD1C0061BF55 /* SDLDisplayType.h */,
4ABB272B24F7FD1B0061BF55 /* SDLDisplayType.m */,
- B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */,
- B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */,
+ B3838A26257C5CE600420C11 /* SDLDoorStatusType.h */,
+ B3838A27257C5CE600420C11 /* SDLDoorStatusType.m */,
4ABB274424F7FD9A0061BF55 /* SDLDriverDistractionState.h */,
4ABB274924F7FD9B0061BF55 /* SDLDriverDistractionState.m */,
4ABB274724F7FD9B0061BF55 /* SDLECallConfirmationStatus.h */,
@@ -5366,6 +5396,8 @@
4ABB278224F7FF090061BF55 /* SDLInteractionMode.m */,
4ABB278624F7FF0A0061BF55 /* SDLKeyboardEvent.h */,
4ABB277E24F7FF090061BF55 /* SDLKeyboardEvent.m */,
+ B3992627258C24120048F09B /* SDLKeyboardInputMask.h */,
+ B3992628258C24130048F09B /* SDLKeyboardInputMask.m */,
4ABB278B24F7FF0B0061BF55 /* SDLKeyboardLayout.h */,
4ABB277F24F7FF090061BF55 /* SDLKeyboardLayout.m */,
4ABB278824F7FF0A0061BF55 /* SDLKeypressMode.h */,
@@ -6211,7 +6243,7 @@
5DAD5F8220507DED0025624C /* Soft Button */,
88D0E5D42478656B009469AB /* Subscribe Button */,
5DAD5F8320507DF30025624C /* Text and Graphic */,
- 4AD1F16A2559952D00637FE1 /* Voice Command */,
+ 4AD1F16A2559952D00637FE1 /* Voice Command */,
5DAD5F8420507E1F0025624C /* SDLScreenManagerSpec.m */,
);
name = Screen;
@@ -6282,8 +6314,8 @@
8850DB5F1F4475D30053A48D /* TestMultipleFilesConnectionManager.m */,
5D6035D3202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.h */,
5D6035D4202CE4A500A429C9 /* TestMultipleRequestsConnectionManager.m */,
- 4A41430B255F0A090039C267 /* TestConnectionRequestObject.h */,
- 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */,
+ 4A41430B255F0A090039C267 /* TestConnectionRequestObject.h */,
+ 4A41430C255F0A090039C267 /* TestConnectionRequestObject.m */,
);
name = "Connection Manager";
sourceTree = "<group>";
@@ -6996,9 +7028,10 @@
4ABB269624F7F9400061BF55 /* SDLRPCFunctionNames.h in Headers */,
4ABB2B4024F84EF50061BF55 /* SDLCloudAppProperties.h in Headers */,
4ABB2A5824F847B10061BF55 /* SDLGetInteriorVehicleDataConsentResponse.h in Headers */,
- B3838A20257C5BB000420C11 /* SDLRoofStatus.h in Headers */,
+ B3838A20257C5BB000420C11 /* SDLRoofStatus.h in Headers */,
4ABB271824F7FC4E0061BF55 /* SDLCompassDirection.h in Headers */,
4ABB2B5924F84EF50061BF55 /* SDLDeviceStatus.h in Headers */,
+ B3992629258C24130048F09B /* SDLKeyboardInputMask.h in Headers */,
4A8BD2CF24F93803000945E3 /* SDLTouchEvent.h in Headers */,
4ABB264B24F7F5580061BF55 /* SDLManagerDelegate.h in Headers */,
4A8BD28B24F934F3000945E3 /* SDLRGBColor.h in Headers */,
@@ -7022,6 +7055,7 @@
4ABB2AB524F847F40061BF55 /* SDLShowAppMenuResponse.h in Headers */,
4A8BD3C724F998A8000945E3 /* SDLWindowState.h in Headers */,
4ABB286424F828E00061BF55 /* SDLVehicleDataNotificationStatus.h in Headers */,
+ B3992624258C1E490048F09B /* SDLKeyboardCapabilities.h in Headers */,
4ABB287C24F8294A0061BF55 /* SDLVentilationMode.h in Headers */,
4ABB292F24F842A00061BF55 /* SDLDeleteFile.h in Headers */,
4ABB294924F843440061BF55 /* SDLEncodedSyncPData.h in Headers */,
@@ -7123,7 +7157,7 @@
4ABB280124F823F20061BF55 /* SDLResult.h in Headers */,
4ABB2B8624F8504A0061BF55 /* SDLHMISettingsControlCapabilities.h in Headers */,
4ABB276924F7FE480061BF55 /* SDLHMIZoneCapabilities.h in Headers */,
- B3838A3B257C6AB700420C11 /* SDLDoorStatus.h in Headers */,
+ B3838A3B257C6AB700420C11 /* SDLDoorStatus.h in Headers */,
4ABB29DF24F846880061BF55 /* SDLSystemRequest.h in Headers */,
4ABB290224F82BE90061BF55 /* SDLAddCommand.h in Headers */,
4ABB260624F7E9650061BF55 /* SDLStreamingMediaManager.h in Headers */,
@@ -7244,6 +7278,7 @@
4ABB275224F7FD9C0061BF55 /* SDLFuelCutoffStatus.h in Headers */,
4ABB24BE24F592620061BF55 /* NSBundle+SDLBundle.h in Headers */,
4ABB286124F828E00061BF55 /* SDLVehicleDataResultCode.h in Headers */,
+ B3A9D9E825D2578F00CDFD21 /* SDLKeyboardLayoutCapability.h in Headers */,
4ABB2BA024F850AE0061BF55 /* SDLLightCapabilities.h in Headers */,
4ABB284124F828630061BF55 /* SDLTurnSignal.h in Headers */,
4ABB299D24F845440061BF55 /* SDLScrollableMessage.h in Headers */,
@@ -7258,6 +7293,7 @@
4ABB2A3124F847980061BF55 /* SDLDeleteFileResponse.h in Headers */,
4ABB294C24F843440061BF55 /* SDLEndAudioPassThru.h in Headers */,
4ABB2AD524F848130061BF55 /* SDLSubscribeVehicleDataResponse.h in Headers */,
+ B3992634258C276B0048F09B /* SDLConfigurableKeyboards.h in Headers */,
4ABB251224F7E3A30061BF55 /* SDLLifecycleConfiguration.h in Headers */,
4ABB25F624F7E7EF0061BF55 /* SDLTouch.h in Headers */,
4ABB2A8324F847DF0061BF55 /* SDLResetGlobalPropertiesResponse.h in Headers */,
@@ -7296,7 +7332,7 @@
4ABB24C924F593090061BF55 /* SDLStreamingProtocolDelegate.h in Headers */,
4ABB275F24F7FE1F0061BF55 /* SDLFuelType.h in Headers */,
4A8BD3A024F9474B000945E3 /* SDLIAPDataSessionDelegate.h in Headers */,
- B3838A28257C5CE600420C11 /* SDLDoorStatusType.h in Headers */,
+ B3838A28257C5CE600420C11 /* SDLDoorStatusType.h in Headers */,
4A8BD2F724F93872000945E3 /* SDLVrHelpItem.h in Headers */,
4ABB2A0024F8477F0061BF55 /* SDLAddCommandResponse.h in Headers */,
4ABB291124F842160061BF55 /* SDLChangeRegistration.h in Headers */,
@@ -7311,6 +7347,7 @@
4ABB26D724F7FAFD0061BF55 /* SDLRPCMessage.h in Headers */,
4A8BD24A24F93135000945E3 /* SDLMyKey.h in Headers */,
4ABB24F924F5959E0061BF55 /* SDLAsynchronousOperation.h in Headers */,
+ B3A9D9E225D2571000CDFD21 /* SDLKeyboardCapabilities.h in Headers */,
4ABB29B324F845DB0061BF55 /* SDLShow.h in Headers */,
4ABB25B424F7E6F60061BF55 /* SDLSoftButtonReplaceOperation.h in Headers */,
4ABB269C24F7F9710061BF55 /* SDLRPCParameterNames.h in Headers */,
@@ -7444,6 +7481,7 @@
4A8BD36E24F94636000945E3 /* SDLProtocolMessageAssembler.h in Headers */,
4ABB28C024F82A6A0061BF55 /* SDLOnCommand.h in Headers */,
4ABB26A824F7F9CF0061BF55 /* SDLLogTargetAppleSystemLog.h in Headers */,
+ B3A9D9ED25D2586C00CDFD21 /* SDLKeyboardInputMask.h in Headers */,
4ABB250524F596450061BF55 /* SDLListFilesOperation.h in Headers */,
4ABB268F24F7F8FC0061BF55 /* SDLHexUtility.h in Headers */,
4A8BD28124F9343F000945E3 /* SDLRemoteControlCapabilities.h in Headers */,
@@ -7471,11 +7509,11 @@
4ABB296524F844020061BF55 /* SDLListFiles.h in Headers */,
4ABB281824F824A50061BF55 /* SDLStaticIconName.h in Headers */,
4ABB290524F82BE90061BF55 /* SDLAlert.h in Headers */,
- B3838A31257C5D1B00420C11 /* SDLGateStatus.h in Headers */,
+ B3838A31257C5D1B00420C11 /* SDLGateStatus.h in Headers */,
4ABB26BA24F7FA1C0061BF55 /* SDLLogConstants.h in Headers */,
4ABB28DB24F82A6A0061BF55 /* SDLOnSystemCapabilityUpdated.h in Headers */,
4ABB269324F7F9060061BF55 /* SDLTimer.h in Headers */,
- 4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */,
+ 4ABED25C257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.h in Headers */,
4A8BD2F924F93872000945E3 /* SDLVehicleDataType.h in Headers */,
4ABB279924F7FF0B0061BF55 /* SDLLanguage.h in Headers */,
4ABB285F24F828E00061BF55 /* SDLVehicleDataActiveStatus.h in Headers */,
@@ -7681,7 +7719,7 @@
};
5D61FA1B1A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
- LastSwiftMigration = 1210;
+ LastSwiftMigration = 1210;
};
5D61FA251A84237100846EE7 = {
CreatedOnToolsVersion = 6.1.1;
@@ -7833,18 +7871,21 @@
4ABB2AD224F848130061BF55 /* SDLSubscribeWayPointsResponse.m in Sources */,
4ABB286224F828E00061BF55 /* SDLVehicleDataResultCode.m in Sources */,
4ABB2B8A24F8504A0061BF55 /* SDLHMISettingsControlCapabilities.m in Sources */,
+ B3992623258C1E490048F09B /* SDLKeyboardCapabilities.m in Sources */,
4ABB257A24F7E5FF0061BF55 /* SDLPresentKeyboardOperation.m in Sources */,
4ABB27CA24F8006D0061BF55 /* SDLMediaType.m in Sources */,
4ABB264524F7F5340061BF55 /* SDLSystemCapabilityManager.m in Sources */,
4A8BD2B124F935BC000945E3 /* SDLSoftButtonCapabilities.m in Sources */,
4ABB2A5524F847B10061BF55 /* SDLGetInteriorVehicleDataConsentResponse.m in Sources */,
- 4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */,
+ 4ABED25B257681ED005BDF61 /* SDLVoiceCommandUpdateOperation.m in Sources */,
+ B3A9D9E125D2571000CDFD21 /* SDLKeyboardCapabilities.m in Sources */,
4ABB2AA924F847F40061BF55 /* SDLSetAppIconResponse.m in Sources */,
4A8BD2D224F93803000945E3 /* SDLTemplateColorScheme.m in Sources */,
4A8BD3C124F994D5000945E3 /* SDLFileManager.m in Sources */,
4ABB25A324F7E6CE0061BF55 /* SDLDynamicMenuUpdateAlgorithm.m in Sources */,
4A8BD30C24F938D6000945E3 /* SDLWeatherAlert.m in Sources */,
4ABB250924F596920061BF55 /* SDLFileWrapper.m in Sources */,
+ B399262A258C24130048F09B /* SDLKeyboardInputMask.m in Sources */,
4ABB24E324F5948D0061BF55 /* SDLEncryptionConfiguration.m in Sources */,
4ABB273D24F7FD1D0061BF55 /* SDLDimension.m in Sources */,
4ABB267B24F7F6840061BF55 /* SDLIconArchiveFile.m in Sources */,
@@ -7951,7 +7992,7 @@
4ABB28D624F82A6A0061BF55 /* SDLOnAudioPassThru.m in Sources */,
4A8BD25224F93135000945E3 /* SDLKeyboardProperties.m in Sources */,
4ABB2B1324F84D950061BF55 /* SDLAppServiceRecord.m in Sources */,
- B3838A29257C5CE600420C11 /* SDLDoorStatusType.m in Sources */,
+ B3838A29257C5CE600420C11 /* SDLDoorStatusType.m in Sources */,
4ABB290424F82BE90061BF55 /* SDLAlertManeuver.m in Sources */,
4ABB27B224F7FFDA0061BF55 /* SDLMassageMode.m in Sources */,
4ABB274F24F7FD9C0061BF55 /* SDLECallConfirmationStatus.m in Sources */,
@@ -8073,6 +8114,7 @@
4ABB269224F7F9060061BF55 /* SDLTimer.m in Sources */,
4ABB25C624F7E73C0061BF55 /* SDLSubscribeButtonManager.m in Sources */,
4ABB278E24F7FF0B0061BF55 /* SDLKeyboardEvent.m in Sources */,
+ B3A9D9E725D2578F00CDFD21 /* SDLKeyboardLayoutCapability.m in Sources */,
4ABB279024F7FF0B0061BF55 /* SDLImageType.m in Sources */,
4ABB28CB24F82A6A0061BF55 /* SDLOnTouchEvent.m in Sources */,
4ABB2B4E24F84EF50061BF55 /* SDLClusterModeStatus.m in Sources */,
@@ -8097,7 +8139,7 @@
4A8BD24C24F93135000945E3 /* SDLLocationDetails.m in Sources */,
4ABB275C24F7FE1F0061BF55 /* SDLFuelType.m in Sources */,
4ABB2B4324F84EF50061BF55 /* SDLDisplayCapabilities.m in Sources */,
- B3838A3A257C6AB700420C11 /* SDLDoorStatus.m in Sources */,
+ B3838A3A257C6AB700420C11 /* SDLDoorStatus.m in Sources */,
4ABB267724F7F6720061BF55 /* SDLObjectWithPriority.m in Sources */,
4ABB29FE24F8477F0061BF55 /* SDLAddCommandResponse.m in Sources */,
4ABB251324F7E3A30061BF55 /* SDLLifecycleConfiguration.m in Sources */,
@@ -8134,6 +8176,7 @@
4ABB2AB924F847F40061BF55 /* SDLSetInteriorVehicleDataResponse.m in Sources */,
4ABB295424F843440061BF55 /* SDLEndAudioPassThru.m in Sources */,
4ABB2A2924F847980061BF55 /* SDLDeleteFileResponse.m in Sources */,
+ B3A9D9EE25D2586C00CDFD21 /* SDLKeyboardInputMask.m in Sources */,
4ABB284524F828630061BF55 /* SDLTouchType.m in Sources */,
4ABB2B8024F8504A0061BF55 /* SDLHapticRect.m in Sources */,
4A8BD38A24F94712000945E3 /* SDLSecondaryTransportManager.m in Sources */,
@@ -8164,6 +8207,7 @@
4ABB251724F7E3AC0061BF55 /* SDLLifecycleConfigurationUpdate.m in Sources */,
4ABB24F824F5959E0061BF55 /* SDLAsynchronousOperation.m in Sources */,
4A8BD37624F9465E000945E3 /* SDLProtocol.m in Sources */,
+ B3992633258C276B0048F09B /* SDLConfigurableKeyboards.m in Sources */,
4A8BD34D24F945E8000945E3 /* SDLControlFramePayloadRPCStartService.m in Sources */,
4A8BD36524F9461A000945E3 /* SDLV2ProtocolMessage.m in Sources */,
4ABB29BE24F845DB0061BF55 /* SDLSlider.m in Sources */,
@@ -8254,7 +8298,7 @@
4ABB2A5B24F847B10061BF55 /* SDLGetCloudAppPropertiesResponse.m in Sources */,
4ABB25F424F7E7EF0061BF55 /* SDLTouch.m in Sources */,
4ABB2B3E24F84EF50061BF55 /* SDLDeviceStatus.m in Sources */,
- B3838A21257C5BB000420C11 /* SDLRoofStatus.m in Sources */,
+ B3838A21257C5BB000420C11 /* SDLRoofStatus.m in Sources */,
4ABB28BE24F82A6A0061BF55 /* SDLOnSyncPData.m in Sources */,
4ABB275724F7FD9C0061BF55 /* SDLEmergencyEventType.m in Sources */,
4ABB29B824F845DB0061BF55 /* SDLSetMediaClockTimer.m in Sources */,
@@ -8321,7 +8365,7 @@
4ABB2AA224F847F40061BF55 /* SDLSetCloudAppPropertiesResponse.m in Sources */,
4A8BD3A224F9474B000945E3 /* SDLIAPDataSession.m in Sources */,
4A8BD3B624F98F64000945E3 /* SDLOnUpdateSubMenu.m in Sources */,
- B3838A30257C5D1B00420C11 /* SDLGateStatus.m in Sources */,
+ B3838A30257C5D1B00420C11 /* SDLGateStatus.m in Sources */,
4ABB256624F7E5B80061BF55 /* SDLRPCPermissionStatus.m in Sources */,
4ABB299824F845440061BF55 /* SDLReleaseInteriorVehicleDataModule.m in Sources */,
4ABB277724F7FE910061BF55 /* SDLIgnitionStatus.m in Sources */,
@@ -8374,6 +8418,7 @@
1680B11E1A9CD7AD00DBD79E /* SDLProtocolReceivedMessageRouterSpec.m in Sources */,
162E82FD1A9BDE8B00906325 /* SDLSystemContextSpec.m in Sources */,
162E82E21A9BDE8B00906325 /* SDLIgnitionStableStatusSpec.m in Sources */,
+ B3992642258FAAE00048F09B /* SDLConfigurableKeyboardsSpec.m in Sources */,
162E82EE1A9BDE8B00906325 /* SDLMediaClockFormatSpec.m in Sources */,
5D76751822D921CB00E8D71A /* SDLMenuLayoutSpec.m in Sources */,
5DA026901AD44EE700019F86 /* SDLDialNumberResponseSpec.m in Sources */,
@@ -8412,6 +8457,7 @@
162E837D1A9BDE8B00906325 /* SDLEmergencyEventSpec.m in Sources */,
162E82D31A9BDE8A00906325 /* SDLCarModeStatusSpec.m in Sources */,
8B7B31A91F2FB8BC00BDC38D /* SDLVideoStreamingProtocolSpec.m in Sources */,
+ B3A9DA0A25D26E1800CDFD21 /* SDLKeyboardCapabilitiesSpec.m in Sources */,
88EED83B1F33BECB00E6C42E /* SDLHapticRectSpec.m in Sources */,
162E82EA1A9BDE8B00906325 /* SDLLanguageSpec.m in Sources */,
5D76E3291D3D0A8800647CFA /* SDLFakeViewControllerPresenter.m in Sources */,
@@ -8439,7 +8485,7 @@
162E82E31A9BDE8B00906325 /* SDLIgnitionStatusSpec.m in Sources */,
162E83511A9BDE8B00906325 /* SDLDeleteInteractionChoiceSetResponseSpec.m in Sources */,
DA9F7EB41DCC086400ACAE48 /* SDLDateTimeSpec.m in Sources */,
- B3838A0F257C4EE100420C11 /* SDLGateStatusSpec.m in Sources */,
+ B3838A0F257C4EE100420C11 /* SDLGateStatusSpec.m in Sources */,
162E82E41A9BDE8B00906325 /* SDLImageFieldNameSpec.m in Sources */,
162E82ED1A9BDE8B00906325 /* SDLMaintenanceModeStatusSpec.m in Sources */,
8B9376DB1F33656C009605C4 /* SDLMetadataTagsSpec.m in Sources */,
@@ -8452,7 +8498,7 @@
162E83181A9BDE8B00906325 /* SDLOnKeyboardInputSpec.m in Sources */,
1EE8C4441F34A1B900FDC2CF /* SDLClimateControlDataSpec.m in Sources */,
162E83701A9BDE8B00906325 /* SDLUpdateTurnListResponseSpec.m in Sources */,
- 4A41430D255F0A090039C267 /* TestConnectionRequestObject.m in Sources */,
+ 4A41430D255F0A090039C267 /* TestConnectionRequestObject.m in Sources */,
88C23E8822297C6000EA171F /* SDLRPCResponseNotificationSpec.m in Sources */,
162E833B1A9BDE8B00906325 /* SDLSetGlobalPropertiesSpec.m in Sources */,
884AF94C220B3FCC00E22928 /* SDLGetSystemCapabilitySpec.m in Sources */,
@@ -8487,6 +8533,7 @@
162E835B1A9BDE8B00906325 /* SDLPerformInteractionResponseSpec.m in Sources */,
880E35B82088F78E00181259 /* SDLSystemCapabilityManagerSpec.m in Sources */,
162E832D1A9BDE8B00906325 /* SDLEncodedSyncPDataSpec.m in Sources */,
+ B3A9DA0425D26D8500CDFD21 /* SDLKeyboardInputMaskSpec.m in Sources */,
1EE8C44C1F385C7100FDC2CF /* SDLRDSDataSpec.m in Sources */,
5DB92D241AC47B2C00C15BB0 /* SDLHexUtilitySpec.m in Sources */,
8815D0F022330765000F24E6 /* SDLRPCRequestNotificationSpec.m in Sources */,
@@ -8563,7 +8610,7 @@
162E82F71A9BDE8B00906325 /* SDLResultSpec.m in Sources */,
88DDD0F9229ECA57002F9623 /* SDLIAPConstantsSpec.m in Sources */,
1680B1141A9CD7AD00DBD79E /* SDLV1ProtocolHeaderSpec.m in Sources */,
- B3838A15257C4EFD00420C11 /* SDLRoofStatusSpec.m in Sources */,
+ B3838A15257C4EFD00420C11 /* SDLRoofStatusSpec.m in Sources */,
880D2680220E038800B3F496 /* SDLWeatherServiceManifestSpec.m in Sources */,
88EEC5BE220A3B8B005AA2F9 /* SDLPublishAppServiceResponseSpec.m in Sources */,
1680B1161A9CD7AD00DBD79E /* SDLProtocolMessageSpec.m in Sources */,
@@ -8629,7 +8676,7 @@
1EAA47762036B847000FE74B /* SDLEqualizerSettingsSpec.m in Sources */,
752ECDB9228C42E100D945F4 /* SDLMenuRunScoreSpec.m in Sources */,
162E83141A9BDE8B00906325 /* SDLOnDriverDistractionSpec.m in Sources */,
- B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */,
+ B3838A09257C4EB400420C11 /* SDLDoorStatusSpec.m in Sources */,
162E83371A9BDE8B00906325 /* SDLResetGlobalPropertiesSpec.m in Sources */,
162E82DF1A9BDE8B00906325 /* SDLGlobalProperySpec.m in Sources */,
88DF998F22035D1700477AC1 /* SDLIAPSessionSpec.m in Sources */,
@@ -8658,6 +8705,7 @@
162E82FE1A9BDE8B00906325 /* SDLTBTStateSpec.m in Sources */,
5DB1BCD41D243A8E002FFC37 /* SDLListFilesOperationSpec.m in Sources */,
8863747E22D650DE00D2671F /* SDLCloseApplicationSpec.m in Sources */,
+ B3992650258FABF70048F09B /* SDLKeyboardInputMaskSpec.m in Sources */,
162E834B1A9BDE8B00906325 /* SDLAlertManeuverResponseSpec.m in Sources */,
162E833E1A9BDE8B00906325 /* SDLShowSpec.m in Sources */,
5D6035D8202CF5C900A429C9 /* TestRequestProgressResponse.m in Sources */,
@@ -8667,6 +8715,7 @@
162E82EF1A9BDE8B00906325 /* SDLPermissionStatusSpec.m in Sources */,
881F388D22D904BE00DF6DCE /* SDLCancelInteractionResponseSpec.m in Sources */,
8BA12B1822DCF59700371E82 /* SDLUnpublishAppServiceResponseSpec.m in Sources */,
+ B399264A258FAB6B0048F09B /* SDLKeyboardCapabilitiesSpec.m in Sources */,
DA9F7EA61DCC05F500ACAE48 /* SDLUnsubscribeWaypointsSpec.m in Sources */,
1E89B0E2203196B800A47992 /* SDLSeatControlCapabilitiesSpec.m in Sources */,
162E82F01A9BDE8B00906325 /* SDLPowerModeQualificationStatusSpec.m in Sources */,
@@ -8790,6 +8839,7 @@
162E830F1A9BDE8B00906325 /* SDLOnAppInterfaceUnregisteredSpec.m in Sources */,
162E83971A9BDE8B00906325 /* SDLVehicleTypeSpec.m in Sources */,
887BE4D422272B2200B397C2 /* SDLControlFramePayloadConstantsSpec.m in Sources */,
+ B3A9DA1225D270EA00CDFD21 /* SDLKeyboardLayoutCapabilitySpec.m in Sources */,
885468382225CBA400994D8D /* SDLCloudAppPropertiesSpec.m in Sources */,
88A795D5210678E000056542 /* SDLStaticIconNameSpec.m in Sources */,
1680B1131A9CD7AD00DBD79E /* SDLProtocolHeaderSpec.m in Sources */,
@@ -8832,7 +8882,7 @@
1EAA47782036BA74000FE74B /* SDLAudioControlCapabilitiesSpec.m in Sources */,
5DB1BCD51D243A8E002FFC37 /* SDLUploadFileOperationSpec.m in Sources */,
162E83401A9BDE8B00906325 /* SDLSpeakSpec.m in Sources */,
- B3838A01257C47FD00420C11 /* SDLDoorStatusTypeSpec.m in Sources */,
+ B3838A01257C47FD00420C11 /* SDLDoorStatusTypeSpec.m in Sources */,
88A5E7F4220B57F900495E8A /* SDLOnSystemCapabilityUpdatedSpec.m in Sources */,
5DCF76FC1ACDDB4200BB647B /* SDLSendLocationSpec.m in Sources */,
5DB1BCD81D243AA6002FFC37 /* SDLPermissionFilterSpec.m in Sources */,
@@ -8853,7 +8903,7 @@
162E831E1A9BDE8B00906325 /* SDLOnTBTClientStateSpec.m in Sources */,
162E83351A9BDE8B00906325 /* SDLReadDIDSpec.m in Sources */,
5DF40B28208FDA9700DD6FDA /* SDLVoiceCommandManagerSpec.m in Sources */,
- 4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */,
+ 4AD1F1742559957100637FE1 /* SDLVoiceCommandUpdateOperationSpec.m in Sources */,
88B3BFA020DA8FD000943565 /* SDLFuelTypeSpec.m in Sources */,
162E836F1A9BDE8B00906325 /* SDLUnsubscribeVehicleDataResponseSpec.m in Sources */,
162E82DB1A9BDE8B00906325 /* SDLECallConfirmationStatusSpec.m in Sources */,
@@ -9267,7 +9317,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
- VALIDATE_WORKSPACE = NO;
+ VALIDATE_WORKSPACE = NO;
};
name = Debug;
};
@@ -9300,7 +9350,7 @@
PRODUCT_BUNDLE_IDENTIFIER = "com.smartdevicelink.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
- VALIDATE_WORKSPACE = NO;
+ VALIDATE_WORKSPACE = NO;
};
name = Release;
};
diff --git a/SmartDeviceLink/private/SDLChoiceSetManager.m b/SmartDeviceLink/private/SDLChoiceSetManager.m
index 51dd32b9e..0f2cb67ad 100644
--- a/SmartDeviceLink/private/SDLChoiceSetManager.m
+++ b/SmartDeviceLink/private/SDLChoiceSetManager.m
@@ -379,10 +379,10 @@ UInt16 const ChoiceCellCancelIdMin = 1;
SDLPresentChoiceSetOperation *presentOp = nil;
if (delegate == nil) {
// Non-searchable choice set
- presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:nil keyboardDelegate:nil cancelID:self.nextCancelId];
+ presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:nil keyboardDelegate:nil cancelID:self.nextCancelId windowCapability:self.currentWindowCapability];
} else {
// Searchable choice set
- presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:self.keyboardConfiguration keyboardDelegate:delegate cancelID:self.nextCancelId];
+ presentOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:self.connectionManager choiceSet:self.pendingPresentationSet mode:mode keyboardProperties:self.keyboardConfiguration keyboardDelegate:delegate cancelID:self.nextCancelId windowCapability:self.currentWindowCapability];
}
self.pendingPresentOperation = presentOp;
@@ -421,7 +421,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
SDLLogD(@"Presenting keyboard with initial text: %@", initialText);
// Present a keyboard with the choice set that we used to test VR's optional state
UInt16 keyboardCancelId = self.nextCancelId;
- self.pendingPresentOperation = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:self.connectionManager keyboardProperties:self.keyboardConfiguration initialText:initialText keyboardDelegate:delegate cancelID:keyboardCancelId];
+ self.pendingPresentOperation = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:self.connectionManager keyboardProperties:self.keyboardConfiguration initialText:initialText keyboardDelegate:delegate cancelID:keyboardCancelId windowCapability:self.currentWindowCapability];
[self.transactionQueue addOperation:self.pendingPresentOperation];
return @(keyboardCancelId);
}
@@ -515,7 +515,7 @@ UInt16 const ChoiceCellCancelIdMin = 1;
}
- (SDLKeyboardProperties *)sdl_defaultKeyboardConfiguration {
- return [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs keyboardLayout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil];
+ return [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs keyboardLayout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
}
#pragma mark - Getters
diff --git a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
index df82bfa22..b2589a280 100644
--- a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
+++ b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.h
@@ -15,6 +15,7 @@
@class SDLChoiceCell;
@class SDLChoiceSet;
@class SDLKeyboardProperties;
+@class SDLWindowCapability;
@protocol SDLConnectionManagerType;
@protocol SDLKeyboardDelegate;
@@ -54,7 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
@param cancelID A unique ID for this specific choice set that allows cancellation through the `CancelInteraction` RPC.
@return A SDLPresentChoiceSetOperation object
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability;
@end
diff --git a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
index f0fbbf28a..121383ce7 100644
--- a/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
+++ b/SmartDeviceLink/private/SDLPresentChoiceSetOperation.m
@@ -24,6 +24,7 @@
#import "SDLRPCNotificationNotification.h"
#import "SDLSetGlobalProperties.h"
#import "SDLVersion.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -60,12 +61,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readwrite, nullable) SDLChoiceCell *selectedCell;
@property (strong, nonatomic, readwrite, nullable) SDLTriggerSource selectedTriggerSource;
@property (assign, nonatomic, readwrite) NSUInteger selectedCellRow;
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
@end
@implementation SDLPresentChoiceSetOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager choiceSet:(SDLChoiceSet *)choiceSet mode:(SDLInteractionMode)mode keyboardProperties:(nullable SDLKeyboardProperties *)originalKeyboardProperties keyboardDelegate:(nullable id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability {
self = [super init];
if (!self) { return self; }
@@ -86,6 +88,7 @@ NS_ASSUME_NONNULL_BEGIN
_cancelId = cancelID;
_selectedCellRow = NSNotFound;
+ _windowCapability = windowCapability;
return self;
}
@@ -121,15 +124,16 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Sending Requests
- (void)sdl_updateKeyboardPropertiesWithCompletionHandler:(nullable void(^)(void))completionHandler {
- if (self.keyboardProperties == nil) {
+ // Create the keyboard configuration based on the window capability's keyboard capabilities
+ SDLKeyboardProperties *modifiedKeyboardConfig = [self.windowCapability createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:self.keyboardProperties];
+ if (modifiedKeyboardConfig == nil) {
if (completionHandler != nil) {
completionHandler();
}
return;
}
-
SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
- setProperties.keyboardProperties = self.keyboardProperties;
+ setProperties.keyboardProperties = modifiedKeyboardConfig;
__weak typeof(self) weakself = self;
[self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
@@ -295,6 +299,12 @@ NS_ASSUME_NONNULL_BEGIN
} else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventAborted] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventCancelled]) {
// Notify of abort / cancellation
[self.keyboardDelegate keyboardDidAbortWithReason:onKeyboard.event];
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskDisabled]) {
+ // Notify of key mask change
+ if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidUpdateInputMask:)]) {
+ BOOL isEnabled = [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ [self.keyboardDelegate keyboardDidUpdateInputMask:isEnabled];
+ }
}
}
diff --git a/SmartDeviceLink/private/SDLPresentKeyboardOperation.h b/SmartDeviceLink/private/SDLPresentKeyboardOperation.h
index 9a5a6cfb5..508c948b4 100644
--- a/SmartDeviceLink/private/SDLPresentKeyboardOperation.h
+++ b/SmartDeviceLink/private/SDLPresentKeyboardOperation.h
@@ -10,6 +10,8 @@
#import "NSNumber+NumberType.h"
@class SDLKeyboardProperties;
+@class SDLWindowCapability;
+
@protocol SDLConnectionManagerType;
@protocol SDLKeyboardDelegate;
@@ -33,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN
@param cancelID An ID for this specific keyboard to allow cancellation through the `CancelInteraction` RPC.
@return A SDLPresentKeyboardOperation object
*/
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID;
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability;
/**
Cancels the keyboard-only interface if it is currently showing. If the keyboard has not yet been sent to Core, it will not be sent.
diff --git a/SmartDeviceLink/private/SDLPresentKeyboardOperation.m b/SmartDeviceLink/private/SDLPresentKeyboardOperation.m
index 798e046af..939869680 100644
--- a/SmartDeviceLink/private/SDLPresentKeyboardOperation.m
+++ b/SmartDeviceLink/private/SDLPresentKeyboardOperation.m
@@ -21,6 +21,7 @@
#import "SDLRPCNotificationNotification.h"
#import "SDLSetGlobalProperties.h"
#import "SDLVersion.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
NS_ASSUME_NONNULL_BEGIN
@@ -37,12 +38,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (strong, nonatomic, readonly) SDLPerformInteraction *performInteraction;
@property (copy, nonatomic, nullable) NSError *internalError;
+@property (strong, nonatomic) SDLWindowCapability *windowCapability;
@end
@implementation SDLPresentKeyboardOperation
-- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID {
+- (instancetype)initWithConnectionManager:(id<SDLConnectionManagerType>)connectionManager keyboardProperties:(SDLKeyboardProperties *)originalKeyboardProperties initialText:(NSString *)initialText keyboardDelegate:(id<SDLKeyboardDelegate>)keyboardDelegate cancelID:(UInt16)cancelID windowCapability:(SDLWindowCapability *)windowCapability {
self = [super init];
if (!self) { return self; }
@@ -53,6 +55,7 @@ NS_ASSUME_NONNULL_BEGIN
_keyboardProperties = originalKeyboardProperties;
_cancelId = cancelID;
_operationId = [NSUUID UUID];
+ _windowCapability = windowCapability;
return self;
}
@@ -87,8 +90,16 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark - Sending Requests
- (void)sdl_updateKeyboardPropertiesWithCompletionHandler:(nullable void(^)(void))completionHandler {
+ // Create the keyboard configuration based on the window capability's keyboard capabilities
+ SDLKeyboardProperties *keyboardConfiguration = [self.windowCapability createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:self.keyboardProperties];
+ if (keyboardConfiguration == nil) {
+ if (completionHandler != nil) {
+ completionHandler();
+ }
+ return;
+ }
SDLSetGlobalProperties *setProperties = [[SDLSetGlobalProperties alloc] init];
- setProperties.keyboardProperties = self.keyboardProperties;
+ setProperties.keyboardProperties = keyboardConfiguration;
[self.connectionManager sendConnectionRequest:setProperties withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
if (error != nil) {
@@ -209,6 +220,12 @@ NS_ASSUME_NONNULL_BEGIN
} else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventAborted] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventCancelled]) {
// Notify of abort / cancellation
[self.keyboardDelegate keyboardDidAbortWithReason:onKeyboard.event];
+ } else if ([onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled] || [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskDisabled]) {
+ // Notify of key mask change
+ if ([self.keyboardDelegate respondsToSelector:@selector(keyboardDidUpdateInputMask:)]) {
+ BOOL isEnabled = [onKeyboard.event isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ [self.keyboardDelegate keyboardDidUpdateInputMask:isEnabled];
+ }
}
}
diff --git a/SmartDeviceLink/private/SDLRPCParameterNames.h b/SmartDeviceLink/private/SDLRPCParameterNames.h
index cd34d66e9..d792b9b1a 100644
--- a/SmartDeviceLink/private/SDLRPCParameterNames.h
+++ b/SmartDeviceLink/private/SDLRPCParameterNames.h
@@ -166,6 +166,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameCurrentForecastSupported;
extern SDLRPCParameterName const SDLRPCParameterNameCurrentTemperature;
extern SDLRPCParameterName const SDLRPCParameterNameCushion;
extern SDLRPCParameterName const SDLRPCParameterNameCustomButtonId;
+extern SDLRPCParameterName const SDLRPCParameterNameCustomKeys;
extern SDLRPCParameterName const SDLRPCParameterNameCustomPresets;
extern SDLRPCParameterName const SDLRPCParameterNameOEMCustomDataType;
extern SDLRPCParameterName const SDLRPCParameterNameData;
@@ -354,6 +355,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameIsSubscribed;
extern SDLRPCParameterName const SDLRPCParameterNameJunctionType;
extern SDLRPCParameterName const SDLRPCParameterNameKeepContext;
extern SDLRPCParameterName const SDLRPCParameterNameKeepContextAvailable;
+extern SDLRPCParameterName const SDLRPCParameterNameKeyboardCapabilities;
extern SDLRPCParameterName const SDLRPCParameterNameKeyboardLayout;
extern SDLRPCParameterName const SDLRPCParameterNameKeyboardProperties;
extern SDLRPCParameterName const SDLRPCParameterNameKeypressMode;
@@ -400,6 +402,8 @@ extern SDLRPCParameterName const SDLRPCParameterNameMajorVersion;
extern SDLRPCParameterName const SDLRPCParameterNameMake;
extern SDLRPCParameterName const SDLRPCParameterNameManeuverComplete;
extern SDLRPCParameterName const SDLRPCParameterNameManualTextEntry;
+extern SDLRPCParameterName const SDLRPCParameterNameMaskInputCharacters;
+extern SDLRPCParameterName const SDLRPCParameterNameMaskInputCharactersSupported;
extern SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmness;
extern SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmnessAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameMassageEnabled;
@@ -485,6 +489,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameNotification;
extern SDLRPCParameterName const SDLRPCParameterNameNumber;
extern SDLRPCParameterName const SDLRPCParameterNameNumberCustomPresetsAvailable;
extern SDLRPCParameterName const SDLRPCParameterNameNumberTicks;
+extern SDLRPCParameterName const SDLRPCParameterNameNumConfigurableKeys;
extern SDLRPCParameterName const SDLRPCParameterNameOdometer;
extern SDLRPCParameterName const SDLRPCParameterNameOffset;
extern SDLRPCParameterName const SDLRPCParameterNameOnLockScreenStatus;
@@ -675,6 +680,7 @@ extern SDLRPCParameterName const SDLRPCParameterNameSupportedDiagnosticModes;
extern SDLRPCParameterName const SDLRPCParameterNameSupportedDynamicImageFieldNames;
extern SDLRPCParameterName const SDLRPCParameterNameSupportsDynamicSubMenus;
extern SDLRPCParameterName const SDLRPCParameterNameSupportedFormats;
+extern SDLRPCParameterName const SDLRPCParameterNameSupportedKeyboards;
extern SDLRPCParameterName const SDLRPCParameterNameSupportedLights;
extern SDLRPCParameterName const SDLRPCParameterNameSyncFileName;
extern SDLRPCParameterName const SDLRPCParameterNameSyncMessageVersion;
diff --git a/SmartDeviceLink/private/SDLRPCParameterNames.m b/SmartDeviceLink/private/SDLRPCParameterNames.m
index d95d6af05..04c9e66b8 100644
--- a/SmartDeviceLink/private/SDLRPCParameterNames.m
+++ b/SmartDeviceLink/private/SDLRPCParameterNames.m
@@ -165,6 +165,7 @@ SDLRPCParameterName const SDLRPCParameterNameCurrentForecastSupported = @"curren
SDLRPCParameterName const SDLRPCParameterNameCurrentTemperature = @"currentTemperature";
SDLRPCParameterName const SDLRPCParameterNameCushion = @"cushion";
SDLRPCParameterName const SDLRPCParameterNameCustomButtonId = @"customButtonID";
+SDLRPCParameterName const SDLRPCParameterNameCustomKeys = @"customKeys";
SDLRPCParameterName const SDLRPCParameterNameCustomPresets = @"customPresets";
SDLRPCParameterName const SDLRPCParameterNameData = @"data";
SDLRPCParameterName const SDLRPCParameterNameDataResult = @"dataResult";
@@ -353,6 +354,7 @@ SDLRPCParameterName const SDLRPCParameterNameIsSubscribed = @"isSubscribed";
SDLRPCParameterName const SDLRPCParameterNameJunctionType = @"junctionType";
SDLRPCParameterName const SDLRPCParameterNameKeepContext = @"keepContext";
SDLRPCParameterName const SDLRPCParameterNameKeepContextAvailable = @"keepContextAvailable";
+SDLRPCParameterName const SDLRPCParameterNameKeyboardCapabilities = @"keyboardCapabilities";
SDLRPCParameterName const SDLRPCParameterNameKeyboardLayout = @"keyboardLayout";
SDLRPCParameterName const SDLRPCParameterNameKeyboardProperties = @"keyboardProperties";
SDLRPCParameterName const SDLRPCParameterNameKeypressMode = @"keypressMode";
@@ -395,6 +397,8 @@ SDLRPCParameterName const SDLRPCParameterNameMajorVersion = @"majorVersion";
SDLRPCParameterName const SDLRPCParameterNameMake = @"make";
SDLRPCParameterName const SDLRPCParameterNameManeuverComplete = @"maneuverComplete";
SDLRPCParameterName const SDLRPCParameterNameManualTextEntry = @"manualTextEntry";
+SDLRPCParameterName const SDLRPCParameterNameMaskInputCharacters = @"maskInputCharacters";
+SDLRPCParameterName const SDLRPCParameterNameMaskInputCharactersSupported = @"maskInputCharactersSupported";
SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmness = @"massageCushionFirmness";
SDLRPCParameterName const SDLRPCParameterNameMassageCushionFirmnessAvailable = @"massageCushionFirmnessAvailable";
SDLRPCParameterName const SDLRPCParameterNameMassageEnabled = @"massageEnabled";
@@ -480,6 +484,7 @@ SDLRPCParameterName const SDLRPCParameterNameNotification = @"notification";
SDLRPCParameterName const SDLRPCParameterNameNumber = @"number";
SDLRPCParameterName const SDLRPCParameterNameNumberCustomPresetsAvailable = @"numCustomPresetsAvailable";
SDLRPCParameterName const SDLRPCParameterNameNumberTicks = @"numTicks";
+SDLRPCParameterName const SDLRPCParameterNameNumConfigurableKeys = @"numConfigurableKeys";
SDLRPCParameterName const SDLRPCParameterNameOdometer = @"odometer";
SDLRPCParameterName const SDLRPCParameterNameOEMCustomDataType = @"oemCustomDataType";
SDLRPCParameterName const SDLRPCParameterNameOffset = @"offset";
@@ -671,6 +676,7 @@ SDLRPCParameterName const SDLRPCParameterNameSupportedDiagnosticModes = @"suppor
SDLRPCParameterName const SDLRPCParameterNameSupportedDynamicImageFieldNames = @"supportedDynamicImageFieldNames";
SDLRPCParameterName const SDLRPCParameterNameSupportsDynamicSubMenus = @"supportsDynamicSubMenus";
SDLRPCParameterName const SDLRPCParameterNameSupportedFormats = @"supportedFormats";
+SDLRPCParameterName const SDLRPCParameterNameSupportedKeyboards = @"supportedKeyboards";
SDLRPCParameterName const SDLRPCParameterNameSupportedLights = @"supportedLights";
SDLRPCParameterName const SDLRPCParameterNameSyncFileName = @"syncFileName";
SDLRPCParameterName const SDLRPCParameterNameSyncMessageVersion = @"syncMsgVersion";
diff --git a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h
index 9321c98cd..ca095da24 100644
--- a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h
+++ b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.h
@@ -12,6 +12,8 @@
#import "SDLTextFieldName.h"
#import "SDLWindowCapability.h"
+@class SDLKeyboardProperties;
+
NS_ASSUME_NONNULL_BEGIN
@interface SDLWindowCapability (ScreenManagerExtensions)
@@ -21,6 +23,13 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL)hasTextFieldOfName:(SDLTextFieldName)name;
- (BOOL)hasImageFieldOfName:(SDLImageFieldName)name;
+/// Takes a keyboard configuration (SDLKeyboardProperties) and creates a valid version of it, if possible, based on this object's internal keyboardCapabilities (SDLKeyboardCapabilities).
+/// If there is no internal keyboardCapabilities, it will just return the passed configuration as-is.
+/// If no valid configuration can be determined based on the internal keyboard capabilities, it will return nil.
+/// @param keyboardConfiguration The configuration to use to determine a valid configuration
+/// @return The passed keyboardConfiguration if there are no changes needed or possible, a modified keyboardConfiguration if a valid version of the configuration could be determined, or nil if a valid configuration could not be created
+- (nullable SDLKeyboardProperties *)createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:(nullable SDLKeyboardProperties *)keyboardConfiguration;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m
index 441356a83..9aa00fa62 100644
--- a/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m
+++ b/SmartDeviceLink/private/SDLWindowCapability+ScreenManagerExtensions.m
@@ -10,6 +10,10 @@
#import "SDLWindowCapability+ScreenManagerExtensions.h"
#import "SDLImageField.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLKeyboardProperties.h"
+#import "SDLLogMacros.h"
#import "SDLTextField.h"
@implementation SDLWindowCapability (ScreenManagerExtensions)
@@ -52,4 +56,44 @@
return NO;
}
+- (nullable SDLKeyboardProperties *)createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:(nullable SDLKeyboardProperties *)keyboardConfiguration {
+ // If there are no keyboard capabilities, if there is no passed keyboard configuration, or if there is no layout to the passed keyboard configuration, just pass back the passed in configuration
+ if ((self.keyboardCapabilities == nil) || (keyboardConfiguration == nil) || (keyboardConfiguration.keyboardLayout == nil)) {
+ return keyboardConfiguration;
+ }
+
+ // Find the capability for the keyboard configuration's layout
+ SDLKeyboardLayoutCapability *selectedLayoutCapability = nil;
+ for (SDLKeyboardLayoutCapability *layoutCapability in self.keyboardCapabilities.supportedKeyboards) {
+ if ([layoutCapability.keyboardLayout isEqualToEnum:keyboardConfiguration.keyboardLayout]) {
+ selectedLayoutCapability = layoutCapability;
+ break;
+ }
+ }
+ if (selectedLayoutCapability == nil) {
+ SDLLogE(@"Configured keyboard layout is not supported: %@", keyboardConfiguration.keyboardLayout);
+ return nil;
+ }
+
+ // Modify the keyboard configuration if there are fewer customKeys allowed than were set, or if an empty array was set.
+ SDLKeyboardProperties *modifiedKeyboardConfiguration = [keyboardConfiguration copy];
+ if (keyboardConfiguration.customKeys.count == 0) {
+ modifiedKeyboardConfiguration.customKeys = nil;
+ } else {
+ NSUInteger numConfigurableKeys = selectedLayoutCapability.numConfigurableKeys.unsignedIntegerValue;
+ if (modifiedKeyboardConfiguration.customKeys.count > numConfigurableKeys) {
+ SDLLogW(@"%lu custom keys set, but the selected layout: %@ only supports %lu. Dropping the rest.", (unsigned long)modifiedKeyboardConfiguration.customKeys.count, modifiedKeyboardConfiguration.keyboardLayout, (unsigned long)numConfigurableKeys);
+ // If there are more custom keys than are allowed for the selected keyboard layout, we need to trim the number of keys to only use the first n number of custom keys, where n is the number of allowed custom keys for that layout.
+ modifiedKeyboardConfiguration.customKeys = [modifiedKeyboardConfiguration.customKeys subarrayWithRange:NSMakeRange(0, numConfigurableKeys)];
+ }
+ }
+
+ // If the keyboard does not support masking input characters, we will remove it from the keyboard configuration
+ if (!self.keyboardCapabilities.maskInputCharactersSupported.boolValue) {
+ modifiedKeyboardConfiguration.maskInputCharacters = nil;
+ }
+
+ return modifiedKeyboardConfiguration;
+}
+
@end
diff --git a/SmartDeviceLink/public/SDLKeyboardCapabilities.h b/SmartDeviceLink/public/SDLKeyboardCapabilities.h
new file mode 100644
index 000000000..9ed4e831e
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardCapabilities.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLRPCStruct.h"
+
+@class SDLKeyboardLayoutCapability;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLKeyboardCapabilities : SDLRPCStruct
+
+/**
+ * @param maskInputCharactersSupported - maskInputCharactersSupported
+ * @param supportedKeyboards - supportedKeyboards
+ * @return A SDLKeyboardCapabilities object
+ */
+- (instancetype)initWithMaskInputCharactersSupported:(nullable NSNumber<SDLBool> *)maskInputCharactersSupported supportedKeyboards:(nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards;
+
+/**
+ * Availability of capability to mask input characters using keyboard. True: Available, False: Not Available
+ */
+@property (nullable, strong, nonatomic) NSNumber<SDLBool> *maskInputCharactersSupported;
+
+/**
+ * Capabilities of supported keyboard layouts by HMI.
+ * {"array_min_size": 1, "array_max_size": 1000}
+ */
+@property (nullable, strong, nonatomic) NSArray<SDLKeyboardLayoutCapability *> *supportedKeyboards;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardCapabilities.m b/SmartDeviceLink/public/SDLKeyboardCapabilities.m
new file mode 100644
index 000000000..27799f17a
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardCapabilities.m
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLKeyboardCapabilities
+
+- (instancetype)initWithMaskInputCharactersSupported:(nullable NSNumber<SDLBool> *)maskInputCharactersSupported supportedKeyboards:(nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.maskInputCharactersSupported = maskInputCharactersSupported;
+ self.supportedKeyboards = supportedKeyboards;
+ return self;
+}
+
+- (void)setMaskInputCharactersSupported:(nullable NSNumber<SDLBool> *)maskInputCharactersSupported {
+ [self.store sdl_setObject:maskInputCharactersSupported forName:SDLRPCParameterNameMaskInputCharactersSupported];
+}
+
+- (nullable NSNumber<SDLBool> *)maskInputCharactersSupported {
+ return [self.store sdl_objectForName:SDLRPCParameterNameMaskInputCharactersSupported ofClass:NSNumber.class error:nil];
+}
+
+- (void)setSupportedKeyboards:(nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards {
+ [self.store sdl_setObject:supportedKeyboards forName:SDLRPCParameterNameSupportedKeyboards];
+}
+
+- (nullable NSArray<SDLKeyboardLayoutCapability *> *)supportedKeyboards {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameSupportedKeyboards ofClass:SDLKeyboardLayoutCapability.class error:nil];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardDelegate.h b/SmartDeviceLink/public/SDLKeyboardDelegate.h
index 652066d64..33da49969 100644
--- a/SmartDeviceLink/public/SDLKeyboardDelegate.h
+++ b/SmartDeviceLink/public/SDLKeyboardDelegate.h
@@ -93,6 +93,14 @@ typedef void(^SDLKeyboardCharacterSetCompletionHandler)(NSArray<NSString *> *_Nu
*/
- (void)keyboardDidSendEvent:(SDLKeyboardEvent)event text:(NSString *)currentInputText;
+/**
+ Implement this to be notified of input key mask update (whether or not the user has changed the input to be hidden, like passwords)
+
+ @param isEnabled - YES if the mask is enabled, NO if the mask is disabled
+ @added in SmartDeviceLink 7.1.0
+ */
+- (void)keyboardDidUpdateInputMask:(BOOL)isEnabled;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardEvent.h b/SmartDeviceLink/public/SDLKeyboardEvent.h
index 1ac7b67e4..9e017c8d6 100644
--- a/SmartDeviceLink/public/SDLKeyboardEvent.h
+++ b/SmartDeviceLink/public/SDLKeyboardEvent.h
@@ -37,3 +37,13 @@ extern SDLKeyboardEvent const SDLKeyboardEventAborted;
@since SDL 4.0
*/
extern SDLKeyboardEvent const SDLKeyboardEventVoice;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskEnabled;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskDisabled;
diff --git a/SmartDeviceLink/public/SDLKeyboardEvent.m b/SmartDeviceLink/public/SDLKeyboardEvent.m
index 67f4e60f2..f55ac3597 100644
--- a/SmartDeviceLink/public/SDLKeyboardEvent.m
+++ b/SmartDeviceLink/public/SDLKeyboardEvent.m
@@ -9,3 +9,5 @@ SDLKeyboardEvent const SDLKeyboardEventSubmitted = @"ENTRY_SUBMITTED";
SDLKeyboardEvent const SDLKeyboardEventCancelled = @"ENTRY_CANCELLED";
SDLKeyboardEvent const SDLKeyboardEventAborted = @"ENTRY_ABORTED";
SDLKeyboardEvent const SDLKeyboardEventVoice = @"ENTRY_VOICE";
+SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskEnabled = @"INPUT_KEY_MASK_ENABLED";
+SDLKeyboardEvent const SDLKeyboardEventInputKeyMaskDisabled = @"INPUT_KEY_MASK_DISABLED";
diff --git a/SmartDeviceLink/public/SDLKeyboardInputMask.h b/SmartDeviceLink/public/SDLKeyboardInputMask.h
new file mode 100644
index 000000000..fc16b1756
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardInputMask.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLEnum.h"
+
+/**
+ * Enumeration listing possible input character masking.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+typedef SDLEnum SDLKeyboardInputMask NS_TYPED_ENUM;
+
+extern SDLKeyboardInputMask const SDLKeyboardInputMaskEnableInputKeyMask;
+
+extern SDLKeyboardInputMask const SDLKeyboardInputMaskDisableInputKeyMask;
+
+extern SDLKeyboardInputMask const SDLKeyboardInputMaskUserChoiceInputKeyMask;
diff --git a/SmartDeviceLink/public/SDLKeyboardInputMask.m b/SmartDeviceLink/public/SDLKeyboardInputMask.m
new file mode 100644
index 000000000..e8be72db1
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardInputMask.m
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLKeyboardInputMask.h"
+
+SDLKeyboardInputMask const SDLKeyboardInputMaskEnableInputKeyMask = @"ENABLE_INPUT_KEY_MASK";
+SDLKeyboardInputMask const SDLKeyboardInputMaskDisableInputKeyMask = @"DISABLE_INPUT_KEY_MASK";
+SDLKeyboardInputMask const SDLKeyboardInputMaskUserChoiceInputKeyMask = @"USER_CHOICE_INPUT_KEY_MASK";
diff --git a/SmartDeviceLink/public/SDLKeyboardLayout.h b/SmartDeviceLink/public/SDLKeyboardLayout.h
index 4b4e97550..181836146 100644
--- a/SmartDeviceLink/public/SDLKeyboardLayout.h
+++ b/SmartDeviceLink/public/SDLKeyboardLayout.h
@@ -25,3 +25,8 @@ extern SDLKeyboardLayout const SDLKeyboardLayoutQWERTZ;
AZERTY layout (the name comes from the first six keys<br> appearing on the top left letter row of the keyboard and read from left to right)
*/
extern SDLKeyboardLayout const SDLKeyboardLayoutAZERTY;
+
+/**
+ * @added in SmartDeviceLink 7.1.0
+ */
+extern SDLKeyboardLayout const SDLKeyboardLayoutNumeric;
diff --git a/SmartDeviceLink/public/SDLKeyboardLayout.m b/SmartDeviceLink/public/SDLKeyboardLayout.m
index 7fa8e1958..0bc5ecc3b 100644
--- a/SmartDeviceLink/public/SDLKeyboardLayout.m
+++ b/SmartDeviceLink/public/SDLKeyboardLayout.m
@@ -7,3 +7,4 @@
SDLKeyboardLayout const SDLKeyboardLayoutQWERTY = @"QWERTY";
SDLKeyboardLayout const SDLKeyboardLayoutQWERTZ = @"QWERTZ";
SDLKeyboardLayout const SDLKeyboardLayoutAZERTY = @"AZERTY";
+SDLKeyboardLayout const SDLKeyboardLayoutNumeric = @"NUMERIC";
diff --git a/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
new file mode 100644
index 000000000..b78218663
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SDLKeyboardLayout.h"
+#import "SDLRPCStruct.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * Describes the capabilities of a single keyboard layout.
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@interface SDLKeyboardLayoutCapability : SDLRPCStruct
+
+/**
+ * @param keyboardLayout - keyboardLayout
+ * @param numConfigurableKeys - @(numConfigurableKeys)
+ * @return A SDLKeyboardLayoutCapability object
+ */
+- (instancetype)initWithKeyboardLayout:(SDLKeyboardLayout)keyboardLayout numConfigurableKeys:(UInt8)numConfigurableKeys;
+
+@property (strong, nonatomic) SDLKeyboardLayout keyboardLayout;
+
+/**
+ * Number of keys available for special characters, App can customize as per their needs.
+ * {"num_min_value": 0, "num_max_value": 10}
+ */
+@property (strong, nonatomic) NSNumber<SDLUInt> *numConfigurableKeys;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardLayoutCapability.m b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.m
new file mode 100644
index 000000000..57cb9a81c
--- /dev/null
+++ b/SmartDeviceLink/public/SDLKeyboardLayoutCapability.m
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2021, SmartDeviceLink Consortium, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * Neither the name of the SmartDeviceLink Consortium Inc. nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "NSMutableDictionary+Store.h"
+#import "SDLKeyboardLayout.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLRPCParameterNames.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@implementation SDLKeyboardLayoutCapability
+
+- (instancetype)initWithKeyboardLayout:(SDLKeyboardLayout)keyboardLayout numConfigurableKeys:(UInt8)numConfigurableKeys {
+ self = [self init];
+ if (!self) {
+ return nil;
+ }
+ self.keyboardLayout = keyboardLayout;
+ self.numConfigurableKeys = @(numConfigurableKeys);
+ return self;
+}
+
+- (void)setKeyboardLayout:(SDLKeyboardLayout)keyboardLayout {
+ [self.store sdl_setObject:keyboardLayout forName:SDLRPCParameterNameKeyboardLayout];
+}
+
+- (SDLKeyboardLayout)keyboardLayout {
+ NSError *error = nil;
+ return [self.store sdl_enumForName:SDLRPCParameterNameKeyboardLayout error:&error];
+}
+
+- (void)setNumConfigurableKeys:(NSNumber<SDLUInt> *)numConfigurableKeys {
+ [self.store sdl_setObject:numConfigurableKeys forName:SDLRPCParameterNameNumConfigurableKeys];
+}
+
+- (NSNumber<SDLUInt> *)numConfigurableKeys {
+ NSError *error = nil;
+ return [self.store sdl_objectForName:SDLRPCParameterNameNumConfigurableKeys ofClass:NSNumber.class error:&error];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardProperties.h b/SmartDeviceLink/public/SDLKeyboardProperties.h
index a538b52bd..55a3ed1b0 100644
--- a/SmartDeviceLink/public/SDLKeyboardProperties.h
+++ b/SmartDeviceLink/public/SDLKeyboardProperties.h
@@ -1,11 +1,11 @@
// SDLKeyboardProperties.h
//
-#import "SDLRPCMessage.h"
-
+#import "SDLKeyboardInputMask.h"
#import "SDLKeyboardLayout.h"
#import "SDLKeypressMode.h"
#import "SDLLanguage.h"
+#import "SDLRPCStruct.h"
NS_ASSUME_NONNULL_BEGIN
@@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN
@param autoCompleteList A list of strings to show the user to complete what they are typing.
@return The RPC object
*/
-- (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable SDLKeyboardLayout)layout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteText:(nullable NSString *)autoCompleteText autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList __deprecated_msg("Use initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList: instead");
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable SDLKeyboardLayout)layout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteText:(nullable NSString *)autoCompleteText autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList __deprecated_msg("Use initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys: instead");
/**
* Convenience init with all properties.
@@ -37,7 +37,19 @@ NS_ASSUME_NONNULL_BEGIN
* @param autoCompleteList - autoCompleteList
* @return A SDLKeyboardProperties object
*/
-- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList;
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList __deprecated_msg("Use initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys: instead");
+
+/**
+ * @param language - language
+ * @param keyboardLayout - keyboardLayout
+ * @param keypressMode - keypressMode
+ * @param limitedCharacterList - limitedCharacterList
+ * @param autoCompleteList - autoCompleteList
+ * @param maskInputCharacters - maskInputCharacters
+ * @param customKeys - customKeys
+ * @return A SDLKeyboardProperties object
+ */
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList maskInputCharacters:(nullable SDLKeyboardInputMask)maskInputCharacters customKeys:(nullable NSArray<NSString *> *)customKeys;
/**
The keyboard language
@@ -85,6 +97,21 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) NSArray<NSString *> *autoCompleteList;
+/**
+ * Allows an app to mask entered characters on HMI
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLKeyboardInputMask maskInputCharacters;
+
+/**
+ * Array of special characters to show in customizable keys. If omitted, keyboard will show default special characters
+ * {"array_min_size": 1, "array_max_size": 10, "string_min_length": 1, "string_max_length": 1}
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) NSArray<NSString *> *customKeys;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLKeyboardProperties.m b/SmartDeviceLink/public/SDLKeyboardProperties.m
index c21c91bc7..d57a21c2c 100644
--- a/SmartDeviceLink/public/SDLKeyboardProperties.m
+++ b/SmartDeviceLink/public/SDLKeyboardProperties.m
@@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SDLKeyboardProperties
- (instancetype)initWithLanguage:(nullable SDLLanguage)language layout:(nullable SDLKeyboardLayout)layout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteText:(nullable NSString *)autoCompleteText autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList {
- self = [[self init] initWithLanguage:language keyboardLayout:layout keypressMode:keypressMode limitedCharacterList:limitedCharacterList autoCompleteList:autoCompleteList];
+ self = [self initWithLanguage:language keyboardLayout:layout keypressMode:keypressMode limitedCharacterList:limitedCharacterList autoCompleteList:autoCompleteList maskInputCharacters:nil customKeys:nil];
if (!self) { return nil; }
self.autoCompleteText = autoCompleteText;
@@ -19,17 +19,21 @@ NS_ASSUME_NONNULL_BEGIN
}
- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList {
+ return [self initWithLanguage:language keyboardLayout:keyboardLayout keypressMode:keypressMode limitedCharacterList:limitedCharacterList autoCompleteList:autoCompleteList maskInputCharacters:nil customKeys:nil];
+}
+
+- (instancetype)initWithLanguage:(nullable SDLLanguage)language keyboardLayout:(nullable SDLKeyboardLayout)keyboardLayout keypressMode:(nullable SDLKeypressMode)keypressMode limitedCharacterList:(nullable NSArray<NSString *> *)limitedCharacterList autoCompleteList:(nullable NSArray<NSString *> *)autoCompleteList maskInputCharacters:(nullable SDLKeyboardInputMask)maskInputCharacters customKeys:(nullable NSArray<NSString *> *)customKeys {
self = [self init];
if (!self) {
return nil;
}
-
self.language = language;
self.keyboardLayout = keyboardLayout;
self.keypressMode = keypressMode;
self.limitedCharacterList = limitedCharacterList;
self.autoCompleteList = autoCompleteList;
-
+ self.maskInputCharacters = maskInputCharacters;
+ self.customKeys = customKeys;
return self;
}
@@ -81,6 +85,22 @@ NS_ASSUME_NONNULL_BEGIN
return [self.store sdl_objectsForName:SDLRPCParameterNameAutoCompleteList ofClass:NSString.class error:nil];
}
+- (void)setMaskInputCharacters:(nullable SDLKeyboardInputMask)maskInputCharacters {
+ [self.store sdl_setObject:maskInputCharacters forName:SDLRPCParameterNameMaskInputCharacters];
+}
+
+- (nullable SDLKeyboardInputMask)maskInputCharacters {
+ return [self.store sdl_enumForName:SDLRPCParameterNameMaskInputCharacters error:nil];
+}
+
+- (void)setCustomKeys:(nullable NSArray<NSString *> *)customKeys {
+ [self.store sdl_setObject:customKeys forName:SDLRPCParameterNameCustomKeys];
+}
+
+- (nullable NSArray<NSString *> *)customKeys {
+ return [self.store sdl_objectsForName:SDLRPCParameterNameCustomKeys ofClass:NSString.class error:nil];
+}
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLWindowCapability.h b/SmartDeviceLink/public/SDLWindowCapability.h
index 4795e667b..afb7a905e 100644
--- a/SmartDeviceLink/public/SDLWindowCapability.h
+++ b/SmartDeviceLink/public/SDLWindowCapability.h
@@ -38,10 +38,10 @@
@class SDLButtonCapabilities;
@class SDLDynamicUpdateCapabilities;
@class SDLImageField;
+@class SDLKeyboardCapabilities;
@class SDLSoftButtonCapabilities;
@class SDLTextField;
-
NS_ASSUME_NONNULL_BEGIN
/**
@@ -64,7 +64,23 @@ NS_ASSUME_NONNULL_BEGIN
* @param dynamicUpdateCapabilities - dynamicUpdateCapabilities
* @return A SDLWindowCapability object
*/
-- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities;
+- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities __deprecated_msg("please use initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities: instead");
+
+/**
+ * @param windowID - windowID
+ * @param textFields - textFields
+ * @param imageFields - imageFields
+ * @param imageTypeSupported - imageTypeSupported
+ * @param templatesAvailable - templatesAvailable
+ * @param numCustomPresetsAvailable - numCustomPresetsAvailable
+ * @param buttonCapabilities - buttonCapabilities
+ * @param softButtonCapabilities - softButtonCapabilities
+ * @param menuLayoutsAvailable - menuLayoutsAvailable
+ * @param dynamicUpdateCapabilities - dynamicUpdateCapabilities
+ * @param keyboardCapabilities - keyboardCapabilities
+ * @return A SDLWindowCapability object
+ */
+- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities keyboardCapabilities:(nullable SDLKeyboardCapabilities *)keyboardCapabilities;
/**
The specified ID of the window. Can be set to a predefined window, or omitted for the main window on the main display.
@@ -136,6 +152,13 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nullable, strong, nonatomic) SDLDynamicUpdateCapabilities *dynamicUpdateCapabilities;
+/**
+ * See KeyboardCapabilities
+ *
+ * @added in SmartDeviceLink 7.1.0
+ */
+@property (nullable, strong, nonatomic) SDLKeyboardCapabilities *keyboardCapabilities;
+
@end
NS_ASSUME_NONNULL_END
diff --git a/SmartDeviceLink/public/SDLWindowCapability.m b/SmartDeviceLink/public/SDLWindowCapability.m
index 9c3ebe7e2..3db3195ff 100644
--- a/SmartDeviceLink/public/SDLWindowCapability.m
+++ b/SmartDeviceLink/public/SDLWindowCapability.m
@@ -36,6 +36,7 @@
#import "SDLButtonCapabilities.h"
#import "SDLDynamicUpdateCapabilities.h"
#import "SDLImageField.h"
+#import "SDLKeyboardCapabilities.h"
#import "SDLRPCParameterNames.h"
#import "SDLSoftButtonCapabilities.h"
#import "SDLTextField.h"
@@ -43,6 +44,10 @@
@implementation SDLWindowCapability
- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities {
+ return [self initWithWindowID:windowID textFields:textFields imageFields:imageFields imageTypeSupported:imageTypeSupported templatesAvailable:templatesAvailable numCustomPresetsAvailable:numCustomPresetsAvailable buttonCapabilities:buttonCapabilities softButtonCapabilities:softButtonCapabilities menuLayoutsAvailable:menuLayoutsAvailable dynamicUpdateCapabilities:dynamicUpdateCapabilities keyboardCapabilities:nil];
+}
+
+- (instancetype)initWithWindowID:(nullable NSNumber<SDLInt> *)windowID textFields:(nullable NSArray<SDLTextField *> *)textFields imageFields:(nullable NSArray<SDLImageField *> *)imageFields imageTypeSupported:(nullable NSArray<SDLImageType> *)imageTypeSupported templatesAvailable:(nullable NSArray<NSString *> *)templatesAvailable numCustomPresetsAvailable:(nullable NSNumber<SDLUInt> *)numCustomPresetsAvailable buttonCapabilities:(nullable NSArray<SDLButtonCapabilities *> *)buttonCapabilities softButtonCapabilities:(nullable NSArray<SDLSoftButtonCapabilities *> *)softButtonCapabilities menuLayoutsAvailable:(nullable NSArray<SDLMenuLayout> *)menuLayoutsAvailable dynamicUpdateCapabilities:(nullable SDLDynamicUpdateCapabilities *)dynamicUpdateCapabilities keyboardCapabilities:(nullable SDLKeyboardCapabilities *)keyboardCapabilities {
self = [super init];
if (!self) {
return nil;
@@ -57,6 +62,7 @@
self.softButtonCapabilities = softButtonCapabilities;
self.menuLayoutsAvailable = menuLayoutsAvailable;
self.dynamicUpdateCapabilities = dynamicUpdateCapabilities;
+ self.keyboardCapabilities = keyboardCapabilities;
return self;
}
@@ -141,4 +147,12 @@
return [self.store sdl_objectForName:SDLRPCParameterNameDynamicUpdateCapabilities ofClass:SDLDynamicUpdateCapabilities.class error:nil];
}
+- (void)setKeyboardCapabilities:(nullable SDLKeyboardCapabilities *)keyboardCapabilities {
+ [self.store sdl_setObject:keyboardCapabilities forName:SDLRPCParameterNameKeyboardCapabilities];
+}
+
+- (nullable SDLKeyboardCapabilities *)keyboardCapabilities {
+ return [self.store sdl_objectForName:SDLRPCParameterNameKeyboardCapabilities ofClass:SDLKeyboardCapabilities.class error:nil];
+}
+
@end
diff --git a/SmartDeviceLink/public/SmartDeviceLink.h b/SmartDeviceLink/public/SmartDeviceLink.h
index 8b8b6f68d..16a573ebf 100644
--- a/SmartDeviceLink/public/SmartDeviceLink.h
+++ b/SmartDeviceLink/public/SmartDeviceLink.h
@@ -225,6 +225,8 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLImage.h"
#import "SDLImageField.h"
#import "SDLImageResolution.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
#import "SDLKeyboardProperties.h"
#import "SDLLightCapabilities.h"
#import "SDLLightControlCapabilities.h"
@@ -340,6 +342,7 @@ FOUNDATION_EXPORT const unsigned char SmartDeviceLinkVersionString[];
#import "SDLImageType.h"
#import "SDLInteractionMode.h"
#import "SDLKeyboardEvent.h"
+#import "SDLKeyboardInputMask.h"
#import "SDLKeyboardLayout.h"
#import "SDLKeypressMode.h"
#import "SDLLanguage.h"
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
index 321a2dde6..2d3fa0707 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLChoiceSetManagerSpec.m
@@ -105,7 +105,7 @@ describe(@"choice set manager tests", ^{
it(@"should be in the correct startup state", ^{
expect(testManager.currentState).to(equal(SDLChoiceManagerStateShutdown));
- SDLKeyboardProperties *defaultProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs keyboardLayout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil];
+ SDLKeyboardProperties *defaultProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageEnUs keyboardLayout:SDLKeyboardLayoutQWERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
expect(testManager.keyboardConfiguration).to(equal(defaultProperties));
});
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
index 883720b82..f918c6909 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentChoiceSetOperationSpec.m
@@ -46,6 +46,7 @@ describe(@"present choice operation", ^{
__block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
+ __block SDLWindowCapability *windowCapability = nil;
beforeEach(^{
resultError = nil;
@@ -58,9 +59,10 @@ describe(@"present choice operation", ^{
testChoices = @[cell1];
testChoiceSet = [[SDLChoiceSet alloc] initWithTitle:@"Test Title" delegate:testChoiceDelegate layout:SDLChoiceSetLayoutTiles timeout:13 initialPromptString:@"Test initial prompt" timeoutPromptString:@"Test timeout prompt" helpPromptString:@"Test help prompt" vrHelpList:nil choices:testChoices];
+ windowCapability = [[SDLWindowCapability alloc] init];
testKeyboardDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
OCMStub([testKeyboardDelegate customKeyboardConfiguration]).andReturn(nil);
- testKeyboardProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil];
+ testKeyboardProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
});
it(@"should have a priority of 'normal'", ^{
@@ -71,7 +73,7 @@ describe(@"present choice operation", ^{
describe(@"running a non-searchable choice set operation", ^{
beforeEach(^{
- testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID];
+ testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
@@ -125,7 +127,7 @@ describe(@"present choice operation", ^{
__block SDLPresentChoiceSetOperation *testCancelOp = nil;
beforeEach(^{
- testCancelOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID];
+ testCancelOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:nil keyboardDelegate:nil cancelID:testCancelID windowCapability:windowCapability];
testCancelOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
@@ -313,7 +315,7 @@ describe(@"present choice operation", ^{
describe(@"running a searchable choice set operation", ^{
beforeEach(^{
- testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID];
+ testOp = [[SDLPresentChoiceSetOperation alloc] initWithConnectionManager:testConnectionManager choiceSet:testChoiceSet mode:testInteractionMode keyboardProperties:testKeyboardProperties keyboardDelegate:testKeyboardDelegate cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
@@ -414,6 +416,25 @@ describe(@"present choice operation", ^{
}]]);
});
+ it(@"should respond to enabled keyboard event", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventInputKeyMaskEnabled;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testKeyboardDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testKeyboardDelegate keyboardDidUpdateInputMask:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }]]);
+ });
+
it(@"should respond to cancellation notifications", ^{
SDLRPCNotificationNotification *notification = nil;
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m
index 29ed6d0b0..389e0367d 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLPresentKeyboardOperationSpec.m
@@ -33,6 +33,7 @@ describe(@"present keyboard operation", ^{
__block BOOL hasCalledOperationCompletionHandler = NO;
__block NSError *resultError = nil;
+ __block SDLWindowCapability *windowCapability = nil;
beforeEach(^{
testOp = nil;
@@ -43,7 +44,17 @@ describe(@"present keyboard operation", ^{
testDelegate = OCMProtocolMock(@protocol(SDLKeyboardDelegate));
OCMStub([testDelegate customKeyboardConfiguration]).andReturn(nil);
- testInitialProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil];
+ windowCapability = [[SDLWindowCapability alloc] init];
+ testInitialProperties = [[SDLKeyboardProperties alloc] initWithLanguage:SDLLanguageArSa keyboardLayout:SDLKeyboardLayoutAZERTY keypressMode:SDLKeypressModeResendCurrentEntry limitedCharacterList:nil autoCompleteList:nil maskInputCharacters:nil customKeys:nil];
+ });
+
+ afterEach(^{
+ if (testOp) {
+ // rationale: every test run creates a new operation to test, the old operation from a previous test
+ // stays 'undead' undefined time and can receive notifications causing a test fail at random
+ [[NSNotificationCenter defaultCenter] removeObserver:testOp];
+ testOp = nil;
+ }
});
it(@"should have a priority of 'normal'", ^{
@@ -54,7 +65,7 @@ describe(@"present keyboard operation", ^{
describe(@"running the operation", ^{
beforeEach(^{
- testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID];
+ testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
@@ -148,6 +159,25 @@ describe(@"present keyboard operation", ^{
}]]);
});
+ it(@"should respond to enabled keyboard event", ^{
+ SDLRPCNotificationNotification *notification = nil;
+
+ // Submit notification
+ SDLOnKeyboardInput *input = [[SDLOnKeyboardInput alloc] init];
+ input.event = SDLKeyboardEventInputKeyMaskEnabled;
+ notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidReceiveKeyboardInputNotification object:nil rpcNotification:input];
+
+ [[NSNotificationCenter defaultCenter] postNotification:notification];
+
+ OCMVerify([testDelegate keyboardDidSendEvent:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }] text:[OCMArg isNil]]);
+
+ OCMVerify([testDelegate keyboardDidUpdateInputMask:[OCMArg checkWithBlock:^BOOL(id obj) {
+ return [(SDLKeyboardEvent)obj isEqualToEnum:SDLKeyboardEventInputKeyMaskEnabled];
+ }]]);
+ });
+
it(@"should respond to cancellation notifications", ^{
SDLRPCNotificationNotification *notification = nil;
@@ -260,7 +290,7 @@ describe(@"present keyboard operation", ^{
describe(@"Canceling the keyboard", ^{
beforeEach(^{
- testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID];
+ testOp = [[SDLPresentKeyboardOperation alloc] initWithConnectionManager:testConnectionManager keyboardProperties:testInitialProperties initialText:testInitialText keyboardDelegate:testDelegate cancelID:testCancelID windowCapability:windowCapability];
testOp.completionBlock = ^{
hasCalledOperationCompletionHandler = YES;
};
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
index 41ff4ba56..c3e95144a 100644
--- a/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
+++ b/SmartDeviceLinkTests/DevAPISpecs/SDLTextAndGraphicManagerSpec.m
@@ -489,7 +489,7 @@ describe(@"text and graphic manager", ^{
beforeEach(^{
testHMIStatus = [[SDLOnHMIStatus alloc] init];
- testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil];
+ testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
testDisplayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"Test display" windowCapabilities:@[testWindowCapability] windowTypeSupported:nil];
testSystemCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:@[testDisplayCapability]];
@@ -554,7 +554,7 @@ describe(@"text and graphic manager", ^{
SDLRPCNotificationNotification *notification = [[SDLRPCNotificationNotification alloc] initWithName:SDLDidChangeHMIStatusNotification object:nil rpcNotification:testHMIStatus];
[[NSNotificationCenter defaultCenter] postNotification:notification];
- testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil];
+ testWindowCapability = [[SDLWindowCapability alloc] initWithWindowID:@(SDLPredefinedWindowsDefaultWindow) textFields:nil imageFields:nil imageTypeSupported:nil templatesAvailable:nil numCustomPresetsAvailable:nil buttonCapabilities:nil softButtonCapabilities:nil menuLayoutsAvailable:nil dynamicUpdateCapabilities:nil keyboardCapabilities:nil];
testDisplayCapability = [[SDLDisplayCapability alloc] initWithDisplayName:@"Test display" windowCapabilities:@[testWindowCapability] windowTypeSupported:nil];
testSystemCapability = [[SDLSystemCapability alloc] initWithDisplayCapabilities:@[testDisplayCapability]];
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m
index ce2782d3f..d47e87d4c 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardEventSpec.m
@@ -12,13 +12,15 @@
QuickSpecBegin(SDLKeyboardEventSpec)
-describe(@"Individual Enum Value Tests", ^ {
- it(@"Should match internal values", ^ {
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
expect(SDLKeyboardEventKeypress).to(equal(@"KEYPRESS"));
expect(SDLKeyboardEventSubmitted).to(equal(@"ENTRY_SUBMITTED"));
expect(SDLKeyboardEventCancelled).to(equal(@"ENTRY_CANCELLED"));
expect(SDLKeyboardEventAborted).to(equal(@"ENTRY_ABORTED"));
expect(SDLKeyboardEventVoice).to(equal(@"ENTRY_VOICE"));
+ expect(SDLKeyboardEventInputKeyMaskEnabled).to(equal(@"INPUT_KEY_MASK_ENABLED"));
+ expect(SDLKeyboardEventInputKeyMaskDisabled).to(equal(@"INPUT_KEY_MASK_DISABLED"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m
new file mode 100644
index 000000000..dd7bd708e
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardInputMaskSpec.m
@@ -0,0 +1,23 @@
+//
+// SDLAppHMITypeSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLKeyboardInputMask.h"
+
+QuickSpecBegin(SDLKeyboardInputMaskSpec)
+
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
+ expect(SDLKeyboardInputMaskEnableInputKeyMask).to(equal(@"ENABLE_INPUT_KEY_MASK"));
+ expect(SDLKeyboardInputMaskDisableInputKeyMask).to(equal(@"DISABLE_INPUT_KEY_MASK"));
+ expect(SDLKeyboardInputMaskUserChoiceInputKeyMask).to(equal(@"USER_CHOICE_INPUT_KEY_MASK"));
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m
index ec0298852..d254c9d06 100644
--- a/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/EnumSpecs/SDLKeyboardLayoutSpec.m
@@ -12,11 +12,12 @@
QuickSpecBegin(SDLKeyboardLayoutSpec)
-describe(@"Individual Enum Value Tests", ^ {
- it(@"Should match internal values", ^ {
+describe(@"individual enum value tests", ^{
+ it(@"should match internal values", ^{
expect(SDLKeyboardLayoutQWERTY).to(equal(@"QWERTY"));
expect(SDLKeyboardLayoutQWERTZ).to(equal(@"QWERTZ"));
expect(SDLKeyboardLayoutAZERTY).to(equal(@"AZERTY"));
+ expect(SDLKeyboardLayoutNumeric).to(equal(@"NUMERIC"));
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m
new file mode 100644
index 000000000..18abde7e6
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardCapabilitiesSpec.m
@@ -0,0 +1,75 @@
+//
+// SDLKeyboardCapabilitiesSpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLKeyboardCapabilities.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLKeyboardLayoutCapability.h"
+
+QuickSpecBegin(SDLKeyboardCapabilitiesSpec)
+
+NSNumber *maskInputCharactersSupported = @YES;
+SDLKeyboardLayoutCapability *keyboardLayoutCapability = [[SDLKeyboardLayoutCapability alloc] init];
+NSArray<SDLKeyboardLayoutCapability *> *supportedKeyboards = @[keyboardLayoutCapability];
+__block SDLKeyboardCapabilities* testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardCapabilities alloc] init];
+ });
+
+ it(@"should return nil if not set", ^{
+ expect(testStruct.maskInputCharactersSupported).to(beNil());
+ expect(testStruct.supportedKeyboards).to(beNil());
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardCapabilities alloc] init];
+ testStruct.maskInputCharactersSupported = maskInputCharactersSupported;
+ testStruct.supportedKeyboards = supportedKeyboards;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.maskInputCharactersSupported).to(equal(maskInputCharactersSupported));
+ expect(testStruct.supportedKeyboards).to(equal(supportedKeyboards));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary<NSString *, id> *dict = @{
+ SDLRPCParameterNameMaskInputCharactersSupported: maskInputCharactersSupported,
+ SDLRPCParameterNameSupportedKeyboards: supportedKeyboards,
+ };
+ testStruct = [[SDLKeyboardCapabilities alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.maskInputCharactersSupported).to(equal(maskInputCharactersSupported));
+ expect(testStruct.supportedKeyboards).to(equal(supportedKeyboards));
+ });
+ });
+
+ context(@"initWithMaskInputCharactersSupported:supportedKeyboards:", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardCapabilities alloc] initWithMaskInputCharactersSupported:maskInputCharactersSupported supportedKeyboards:supportedKeyboards];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct).notTo(beNil());
+ expect(testStruct.maskInputCharactersSupported).to(equal(maskInputCharactersSupported));
+ expect(testStruct.supportedKeyboards).to(equal(supportedKeyboards));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m
new file mode 100644
index 000000000..f938c30a9
--- /dev/null
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardLayoutCapabilitySpec.m
@@ -0,0 +1,75 @@
+//
+// SDLKeyboardLayoutCapabilitySpec.m
+// SmartDeviceLink
+
+
+#import <Foundation/Foundation.h>
+
+#import <Quick/Quick.h>
+#import <Nimble/Nimble.h>
+
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayout.h"
+#import "SDLRPCParameterNames.h"
+#import "SDLKeyboardLayoutCapability.h"
+
+QuickSpecBegin(SDLKeyboardLayoutCapabilitySpec)
+
+SDLKeyboardLayout keyboardLayout = SDLKeyboardLayoutNumeric;
+UInt8 numConfigurableKeys = 9;
+__block SDLKeyboardLayoutCapability* testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardLayoutCapability alloc] init];
+ });
+
+ it(@"should return nil if not set", ^{
+ expect(testStruct.keyboardLayout).to(beNil());
+ expect(testStruct.numConfigurableKeys).to(beNil());
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardLayoutCapability alloc] init];
+ testStruct.numConfigurableKeys = @(numConfigurableKeys);
+ testStruct.keyboardLayout = keyboardLayout;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.numConfigurableKeys).to(equal(@(numConfigurableKeys)));
+ expect(testStruct.keyboardLayout).to(equal(keyboardLayout));
+ });
+ });
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary<NSString *, id> *dict = @{
+ SDLRPCParameterNameNumConfigurableKeys: @(numConfigurableKeys),
+ SDLRPCParameterNameKeyboardLayout: keyboardLayout,
+ };
+ testStruct = [[SDLKeyboardLayoutCapability alloc] initWithDictionary:dict];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.numConfigurableKeys).to(equal(@(numConfigurableKeys)));
+ expect(testStruct.keyboardLayout).to(equal(keyboardLayout));
+ });
+ });
+
+ context(@"initWithKeyboardLayout:numConfigurableKeys:", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardLayoutCapability alloc] initWithKeyboardLayout:keyboardLayout numConfigurableKeys:numConfigurableKeys];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct).notTo(beNil());
+ expect(testStruct.numConfigurableKeys).to(equal(@(numConfigurableKeys)));
+ expect(testStruct.keyboardLayout).to(equal(keyboardLayout));
+ });
+ });
+});
+
+QuickSpecEnd
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m
index b1f15a63f..8735babca 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLKeyboardPropertiesSpec.m
@@ -8,109 +8,182 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
+#import "SDLKeyboardInputMask.h"
#import "SDLKeyboardLayout.h"
#import "SDLKeypressMode.h"
#import "SDLKeyboardProperties.h"
#import "SDLLanguage.h"
#import "SDLRPCParameterNames.h"
-
QuickSpecBegin(SDLKeyboardPropertiesSpec)
-describe(@"Getter/Setter Tests", ^ {
- __block SDLLanguage testLanguage = SDLLanguageDaDk;
- __block SDLKeyboardLayout testLayout = SDLKeyboardLayoutAZERTY;
- __block SDLKeypressMode testMode = SDLKeypressModeSingleKeypress;
- __block NSArray<NSString *> *testLimitedCharacterList = @[@"s", @"r", @"f"];
- __block NSString *testAutoCompleteText = @"Auto Carrot";
- __block NSArray<NSString *> *testAutoCompleteList = @[@"Hello World", @"How are you"];
-
- it(@"Should set and get correctly", ^ {
- SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] init];
-
- testStruct.language = testLanguage;
- testStruct.keyboardLayout = testLayout;
- testStruct.keypressMode = testMode;
- testStruct.limitedCharacterList = testLimitedCharacterList;
- testStruct.autoCompleteList = testAutoCompleteList;
+__block SDLLanguage testLanguage = nil;
+__block SDLKeyboardLayout testLayout = nil;
+__block SDLKeypressMode testMode = nil;
+__block NSArray<NSString *> *testLimitedCharacterList = nil;
+__block NSString *testAutoCompleteText = nil;
+__block NSArray<NSString *> *testAutoCompleteList = nil;
+__block SDLKeyboardInputMask maskInputCharacters = nil;
+__block NSArray<NSString *> *customKeys = nil;
+__block SDLKeyboardProperties* testStruct = nil;
+
+describe(@"getter/setter tests", ^{
+ beforeEach(^{
+ testLanguage = SDLLanguageDaDk;
+ testLayout = SDLKeyboardLayoutAZERTY;
+ testMode = SDLKeypressModeSingleKeypress;
+ testLimitedCharacterList = @[@"s", @"r", @"f"];
+ testAutoCompleteText = @"Auto Carrot";
+ testAutoCompleteList = @[@"Hello World", @"How are you"];
+ maskInputCharacters = SDLKeyboardInputMaskEnableInputKeyMask;
+ customKeys = @[@"abc", @"DEF"];
+ });
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardProperties alloc] init];
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.language).to(beNil());
+ expect(testStruct.keyboardLayout).to(beNil());
+ expect(testStruct.keypressMode).to(beNil());
+ expect(testStruct.limitedCharacterList).to(beNil());
+ expect(testStruct.autoCompleteList).to(beNil());
+ expect(testStruct.maskInputCharacters).to(beNil());
+ expect(testStruct.customKeys).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(beNil());
+#pragma clang diagnostic pop
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardProperties alloc] init];
+ testStruct.language = testLanguage;
+ testStruct.keyboardLayout = testLayout;
+ testStruct.keypressMode = testMode;
+ testStruct.limitedCharacterList = testLimitedCharacterList;
+ testStruct.autoCompleteList = testAutoCompleteList;
+ testStruct.maskInputCharacters = maskInputCharacters;
+ testStruct.customKeys = customKeys;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- testStruct.autoCompleteText = testAutoCompleteText;
+ testStruct.autoCompleteText = testAutoCompleteText;
#pragma clang diagnostic pop
+ testStruct.maskInputCharacters = maskInputCharacters;
+ });
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(equal(maskInputCharacters));
+ expect(testStruct.customKeys).to(equal(customKeys));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
+ expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
#pragma clang diagnostic pop
+ });
});
-
- it(@"Should get correctly when initialized with a dictionary", ^ {
- NSDictionary* dict = @{SDLRPCParameterNameLanguage: testLanguage,
- SDLRPCParameterNameKeyboardLayout: testLayout,
- SDLRPCParameterNameKeypressMode: testMode,
- SDLRPCParameterNameLimitedCharacterList: testLimitedCharacterList,
- SDLRPCParameterNameAutoCompleteList: testAutoCompleteList,
- SDLRPCParameterNameAutoCompleteText: testAutoCompleteText
- };
- SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] initWithDictionary:dict];
-
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+
+ context(@"initWithDictionary:", ^{
+ beforeEach(^{
+ NSDictionary* dict = @{SDLRPCParameterNameLanguage: testLanguage,
+ SDLRPCParameterNameKeyboardLayout: testLayout,
+ SDLRPCParameterNameKeypressMode: testMode,
+ SDLRPCParameterNameLimitedCharacterList: testLimitedCharacterList,
+ SDLRPCParameterNameAutoCompleteList: testAutoCompleteList,
+ SDLRPCParameterNameAutoCompleteText: testAutoCompleteText,
+ SDLRPCParameterNameMaskInputCharacters: maskInputCharacters,
+ SDLRPCParameterNameCustomKeys: customKeys,
+ };
+ testStruct = [[SDLKeyboardProperties alloc] initWithDictionary:dict];
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(equal(maskInputCharacters));
+ expect(testStruct.customKeys).to(equal(customKeys));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
+ expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
#pragma clang diagnostic pop
+ });
});
- it(@"Should get correctly when initialized with initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:", ^ {
+ context(@"initWithLanguage:layout:keypressMode:limitedCharacterList:autoCompleteText:autoCompleteList:", ^{
+ beforeEach(^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- SDLKeyboardProperties *testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage layout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteText:testAutoCompleteText autoCompleteList:testAutoCompleteList];
+ testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage layout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteText:testAutoCompleteText autoCompleteList:testAutoCompleteList];
#pragma clang diagnostic pop
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(beNil());
+ expect(testStruct.customKeys).to(beNil());
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
+ expect(testStruct.autoCompleteText).to(equal(testAutoCompleteText));
#pragma clang diagnostic pop
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ });
});
- it(@"Should get correctly when initialized with initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:", ^ {
- SDLKeyboardProperties *testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage keyboardLayout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteList:testAutoCompleteList];
- expect(testStruct.language).to(equal(testLanguage));
- expect(testStruct.keyboardLayout).to(equal(testLayout));
- expect(testStruct.keypressMode).to(equal(testMode));
- expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
- expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ context(@"initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:", ^{
+ beforeEach(^{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testStruct.autoCompleteText).to(beNil());
+ testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage keyboardLayout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteList:testAutoCompleteList];
#pragma clang diagnostic pop
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(beNil());
+ expect(testStruct.customKeys).to(beNil());
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ expect(testStruct.autoCompleteText).to(beNil());
+#pragma clang diagnostic pop
+ });
});
-
- it(@"Should return nil if not set", ^ {
- SDLKeyboardProperties* testStruct = [[SDLKeyboardProperties alloc] init];
-
- expect(testStruct.language).to(beNil());
- expect(testStruct.keyboardLayout).to(beNil());
- expect(testStruct.keypressMode).to(beNil());
- expect(testStruct.limitedCharacterList).to(beNil());
- expect(testStruct.autoCompleteList).to(beNil());
+
+ context(@"initWithLanguage:keyboardLayout:keypressMode:limitedCharacterList:autoCompleteList:maskInputCharacters:customKeys:", ^{
+ beforeEach(^{
+ testStruct = [[SDLKeyboardProperties alloc] initWithLanguage:testLanguage keyboardLayout:testLayout keypressMode:testMode limitedCharacterList:testLimitedCharacterList autoCompleteList:testAutoCompleteList maskInputCharacters:maskInputCharacters customKeys:customKeys];
+ });
+
+ it(@"should be set properly", ^{
+ expect(testStruct.language).to(equal(testLanguage));
+ expect(testStruct.keyboardLayout).to(equal(testLayout));
+ expect(testStruct.keypressMode).to(equal(testMode));
+ expect(testStruct.limitedCharacterList).to(equal(testLimitedCharacterList));
+ expect(testStruct.autoCompleteList).to(equal(testAutoCompleteList));
+ expect(testStruct.maskInputCharacters).to(equal(maskInputCharacters));
+ expect(testStruct.customKeys).to(equal(customKeys));
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- expect(testStruct.autoCompleteText).to(beNil());
+ expect(testStruct.autoCompleteText).to(beNil());
#pragma clang diagnostic pop
+ });
});
});
diff --git a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m
index e8c2514b4..ee5d34ef5 100644
--- a/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m
+++ b/SmartDeviceLinkTests/RPCSpecs/StructSpecs/SDLWindowCapabilitySpec.m
@@ -5,16 +5,18 @@
#import <Quick/Quick.h>
#import <Nimble/Nimble.h>
-#import "SDLWindowCapability.h"
-
#import "SDLButtonCapabilities.h"
#import "SDLDynamicUpdateCapabilities.h"
#import "SDLImageField.h"
#import "SDLImageType.h"
+#import "SDLKeyboardCapabilities.h"
+#import "SDLKeyboardLayoutCapability.h"
+#import "SDLKeyboardProperties.h"
#import "SDLRPCParameterNames.h"
#import "SDLSoftButtonCapabilities.h"
#import "SDLTextField.h"
#import "SDLTextFieldName.h"
+#import "SDLWindowCapability+ScreenManagerExtensions.h"
QuickSpecBegin(SDLWindowCapabilitySpec)
@@ -30,89 +32,253 @@ __block NSString *testImageName = nil;
__block NSString *testTemplateAvailable = nil;
__block SDLMenuLayout testMenuLayout = SDLMenuLayoutTiles;
__block SDLDynamicUpdateCapabilities *testDynamicUpdates = nil;
+__block NSArray<SDLTextField *> *textFields = nil;
+__block NSArray<SDLImageField *> *imageFields = nil;
+__block NSArray<SDLButtonCapabilities *> *buttonCapabilities = nil;
+__block SDLKeyboardCapabilities *keyboardCapabilities = nil;
+__block id windowID = nil;
+__block id numCustomPresetsAvailable = nil;
+__block NSArray<SDLImageType> *imageTypeSupported = nil;
+__block NSArray<NSString *> *templatesAvailable = nil;
+__block NSArray<SDLSoftButtonCapabilities *> *softButtonCapabilities = nil;
+__block NSArray<SDLMenuLayout> *menuLayoutsAvailable = nil;
-describe(@"Getter/Setter Tests", ^ {
+describe(@"getter/setter tests", ^{
beforeEach(^{
testImageType = SDLImageTypeDynamic;
testTextName = @"test Text field";
testImageName = @"test Image field";
-
+
testTextField = [[SDLTextField alloc] init];
testTextField.name = SDLTextFieldNameTertiaryText;
testImageField = [[SDLImageField alloc] init];
testImageField.name = testImageName;
-
+
testButtonCapabilities = [[SDLButtonCapabilities alloc] init];
testButtonCapabilities.name = SDLButtonNameOk;
testButtonCapabilities.shortPressAvailable = @YES;
testButtonCapabilities.longPressAvailable = @YES;
testButtonCapabilities.upDownAvailable = @YES;
-
+
testSoftButtonsCapabilities = [[SDLSoftButtonCapabilities alloc] init];
testSoftButtonsCapabilities.imageSupported = @YES;
testTemplateAvailable = @"myTemplate";
testDynamicUpdates = [[SDLDynamicUpdateCapabilities alloc] initWithSupportedDynamicImageFieldNames:@[SDLImageFieldNameSubMenuIcon] supportsDynamicSubMenus:@YES];
+
+ textFields = @[testTextField];
+ imageFields = @[testImageField];
+ buttonCapabilities = @[testButtonCapabilities];
+ keyboardCapabilities = [[SDLKeyboardCapabilities alloc] init];
+ windowID = @444;
+ numCustomPresetsAvailable = @10;
+ imageTypeSupported = @[testImageType];
+ templatesAvailable = @[testTemplateAvailable];
+ softButtonCapabilities = @[testSoftButtonsCapabilities];
+ menuLayoutsAvailable = @[testMenuLayout];
});
-
- it(@"Should set and get correctly", ^ {
- testStruct = [[SDLWindowCapability alloc] init];
- testStruct.windowID = @444;
- testStruct.numCustomPresetsAvailable = @10;
- testStruct.textFields = @[testTextField];
- testStruct.imageFields = @[testImageField];
- testStruct.imageTypeSupported = @[testImageType];
- testStruct.buttonCapabilities = @[testButtonCapabilities];
- testStruct.softButtonCapabilities = @[testSoftButtonsCapabilities];
- testStruct.menuLayoutsAvailable = @[testMenuLayout];
- testStruct.templatesAvailable = @[testTemplateAvailable];
- testStruct.dynamicUpdateCapabilities = testDynamicUpdates;
-
- expect(testStruct.windowID).to(equal(@444));
- expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
- expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
- expect(testStruct.numCustomPresetsAvailable).to(equal(@10));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
- expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
- expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
- expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+
+ context(@"init", ^{
+ beforeEach(^{
+ testStruct = [[SDLWindowCapability alloc] init];
+ });
+
+ it(@"expect all properties to be nil", ^{
+ expect(testStruct.windowID).to(beNil());
+ expect(testStruct.textFields.firstObject.name).to(beNil());
+ expect(testStruct.imageFields.firstObject.name).to(beNil());
+ expect(testStruct.numCustomPresetsAvailable).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.name).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(beNil());
+ expect(testStruct.buttonCapabilities.firstObject.name).to(beNil());
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(beNil());
+ expect(testStruct.menuLayoutsAvailable).to(beNil());
+ expect(testStruct.templatesAvailable).to(beNil());
+ expect(testStruct.dynamicUpdateCapabilities).to(beNil());
+ expect(testStruct.imageTypeSupported).to(beNil());
+ expect(testStruct.keyboardCapabilities).to(beNil());
+ });
+ });
+
+ context(@"init and assign", ^{
+ beforeEach(^{
+ testStruct = [[SDLWindowCapability alloc] init];
+ testStruct.windowID = windowID;
+ testStruct.numCustomPresetsAvailable = numCustomPresetsAvailable;
+ testStruct.textFields = @[testTextField];
+ testStruct.imageFields = @[testImageField];
+ testStruct.imageTypeSupported = @[testImageType];
+ testStruct.buttonCapabilities = @[testButtonCapabilities];
+ testStruct.softButtonCapabilities = @[testSoftButtonsCapabilities];
+ testStruct.menuLayoutsAvailable = @[testMenuLayout];
+ testStruct.templatesAvailable = @[testTemplateAvailable];
+ testStruct.dynamicUpdateCapabilities = testDynamicUpdates;
+ testStruct.keyboardCapabilities = keyboardCapabilities;
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.windowID).to(equal(windowID));
+ expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
+ expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
+ expect(testStruct.numCustomPresetsAvailable).to(equal(numCustomPresetsAvailable));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
+ expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
+ expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
+ expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ expect(testStruct.imageTypeSupported).to(equal(@[testImageType]));
+ expect(testStruct.keyboardCapabilities).to(equal(keyboardCapabilities));
+ });
+ });
+
+ context(@"initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:", ^{
+ beforeEach(^{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+ testStruct = [[SDLWindowCapability alloc] initWithWindowID:windowID textFields:textFields imageFields:imageFields imageTypeSupported:imageTypeSupported templatesAvailable:templatesAvailable numCustomPresetsAvailable:numCustomPresetsAvailable buttonCapabilities:buttonCapabilities softButtonCapabilities:softButtonCapabilities menuLayoutsAvailable:menuLayoutsAvailable dynamicUpdateCapabilities:testDynamicUpdates];
+#pragma clang diagnostic pop
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.windowID).to(equal(windowID));
+ expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
+ expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
+ expect(testStruct.numCustomPresetsAvailable).to(equal(numCustomPresetsAvailable));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
+ expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
+ expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
+ expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ expect(testStruct.imageTypeSupported).to(equal(@[testImageType]));
+ expect(testStruct.keyboardCapabilities).to(beNil());
+ });
+ });
+
+ context(@"initWithWindowID:textFields:imageFields:imageTypeSupported:templatesAvailable:numCustomPresetsAvailable:buttonCapabilities:softButtonCapabilities:menuLayoutsAvailable:dynamicUpdateCapabilities:keyboardCapabilities:", ^{
+ beforeEach(^{
+ testStruct = [[SDLWindowCapability alloc] initWithWindowID:windowID textFields:textFields imageFields:imageFields imageTypeSupported:imageTypeSupported templatesAvailable:templatesAvailable numCustomPresetsAvailable:numCustomPresetsAvailable buttonCapabilities:buttonCapabilities softButtonCapabilities:softButtonCapabilities menuLayoutsAvailable:menuLayoutsAvailable dynamicUpdateCapabilities:testDynamicUpdates keyboardCapabilities:keyboardCapabilities];
+ });
+
+ it(@"expect all properties to be set properly", ^{
+ expect(testStruct.windowID).to(equal(windowID));
+ expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
+ expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
+ expect(testStruct.numCustomPresetsAvailable).to(equal(numCustomPresetsAvailable));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
+ expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
+ expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
+ expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
+ expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
+ expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ expect(testStruct.imageTypeSupported).to(equal(@[testImageType]));
+ expect(testStruct.keyboardCapabilities).to(equal(keyboardCapabilities));
+ });
});
});
-describe(@"initializing with ", ^{
+describe(@"creating a valid keyboard configuration based on keyboard capabilities", ^{
+ UInt8 numConfigurableKeys = 7;
+
beforeEach(^{
- testStruct = [[SDLWindowCapability alloc] initWithWindowID:@444 textFields:@[testTextField] imageFields:@[testImageField] imageTypeSupported:@[testImageType] templatesAvailable:@[testTemplateAvailable] numCustomPresetsAvailable:@10 buttonCapabilities:@[testButtonCapabilities] softButtonCapabilities:@[testSoftButtonsCapabilities] menuLayoutsAvailable:@[testMenuLayout] dynamicUpdateCapabilities:testDynamicUpdates];
+ testStruct = [[SDLWindowCapability alloc] init];
+ testStruct.keyboardCapabilities = nil;
});
- it(@"Should set and get correctly", ^ {
- testStruct = [[SDLWindowCapability alloc] init];
- testStruct.windowID = @444;
- testStruct.numCustomPresetsAvailable = @10;
- testStruct.textFields = @[testTextField];
- testStruct.imageFields = @[testImageField];
- testStruct.imageTypeSupported = @[testImageType];
- testStruct.buttonCapabilities = @[testButtonCapabilities];
- testStruct.softButtonCapabilities = @[testSoftButtonsCapabilities];
- testStruct.menuLayoutsAvailable = @[testMenuLayout];
- testStruct.templatesAvailable = @[testTemplateAvailable];
- testStruct.dynamicUpdateCapabilities = testDynamicUpdates;
-
- expect(testStruct.windowID).to(equal(@444));
- expect(testStruct.textFields.firstObject.name).to(equal(SDLTextFieldNameTertiaryText));
- expect(testStruct.imageFields.firstObject.name).to(equal(testImageName));
- expect(testStruct.numCustomPresetsAvailable).to(equal(@10));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.buttonCapabilities.firstObject.shortPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.longPressAvailable).to(equal(@YES));
- expect(testStruct.buttonCapabilities.firstObject.name).to(equal(SDLButtonNameOk));
- expect(testStruct.softButtonCapabilities.firstObject.imageSupported).to(equal(@YES));
- expect(testStruct.menuLayoutsAvailable).to(equal(@[testMenuLayout]));
- expect(testStruct.templatesAvailable).to(equal(@[testTemplateAvailable]));
- expect(testStruct.dynamicUpdateCapabilities).to(equal(testDynamicUpdates));
+ context(@"when keyboardCapabilities is nil or empty", ^{
+ it(@"result should be nil when the argument is nil", ^{
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:nil];
+ expect(resultProperties).to(beNil());
+ });
+
+ it(@"result should be equal to the argument when keyboardLayout is nil", ^{
+ SDLKeyboardProperties *testKeyboardProperties = [[SDLKeyboardProperties alloc] init];
+ testKeyboardProperties.maskInputCharacters = SDLKeyboardInputMaskUserChoiceInputKeyMask;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties).to(equal(testKeyboardProperties));
+ expect(resultProperties.maskInputCharacters).to(equal(SDLKeyboardInputMaskUserChoiceInputKeyMask));
+ });
+
+ it(@"result should be nil when the argument is not nil and keyboardCapabilities is empty", ^{
+ testStruct.keyboardCapabilities = [[SDLKeyboardCapabilities alloc] init];
+ SDLKeyboardProperties *testKeyboardProperties = [[SDLKeyboardProperties alloc] init];
+ testKeyboardProperties.keyboardLayout = SDLKeyboardLayoutNumeric;
+ testKeyboardProperties.maskInputCharacters = SDLKeyboardInputMaskUserChoiceInputKeyMask;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).to(beNil());
+ });
+
+ context(@"when keyboardCapabilities is not empty", ^{
+ __block SDLKeyboardProperties *testKeyboardProperties = nil;
+ __block SDLKeyboardCapabilities *keyboardCapabilities = nil;
+ __block NSArray *testCustomKeysLong = nil;
+
+ beforeEach(^{
+ // create a long array that contains more custom keys than <numConfigurableKeys>
+ testCustomKeysLong = [@"a ä æ b c d e ê f j h i j k l m n o p q r s ß t u v w x y z" componentsSeparatedByString:@" "];
+ NSArray *arrayLayouts = @[SDLKeyboardLayoutQWERTY, SDLKeyboardLayoutQWERTZ, SDLKeyboardLayoutAZERTY, SDLKeyboardLayoutNumeric];
+ NSMutableArray *arrayLayoutCapability = [[NSMutableArray alloc] initWithCapacity:arrayLayouts.count];
+ for (SDLKeyboardLayout layout in arrayLayouts) {
+ SDLKeyboardLayoutCapability *layoutCapability = [[SDLKeyboardLayoutCapability alloc] initWithKeyboardLayout:layout numConfigurableKeys:numConfigurableKeys];
+ [arrayLayoutCapability addObject:layoutCapability];
+ }
+ keyboardCapabilities = [[SDLKeyboardCapabilities alloc] init];
+ keyboardCapabilities.supportedKeyboards = arrayLayoutCapability;
+ testStruct.keyboardCapabilities = keyboardCapabilities;
+
+ testKeyboardProperties = [[SDLKeyboardProperties alloc] init];
+ testKeyboardProperties.keyboardLayout = SDLKeyboardLayoutNumeric;
+ // create custom keys array longer than <numConfigurableKeys>
+ testKeyboardProperties.customKeys = testCustomKeysLong;
+ testKeyboardProperties.maskInputCharacters = SDLKeyboardInputMaskUserChoiceInputKeyMask;
+ testKeyboardProperties.keyboardLayout = SDLKeyboardLayoutAZERTY;
+ });
+
+ it(@"maskInputCharacters should not be nil when maskInputCharactersSupported = YES", ^{
+ keyboardCapabilities.maskInputCharactersSupported = @YES;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties).notTo(equal(testKeyboardProperties));
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.maskInputCharacters).to(equal(SDLKeyboardInputMaskUserChoiceInputKeyMask));
+ });
+
+ it(@"maskInputCharacters should be nil when maskInputCharactersSupported = NO", ^{
+ keyboardCapabilities.maskInputCharactersSupported = @NO;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties).notTo(equal(testKeyboardProperties));
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.maskInputCharacters).to(beNil());
+ });
+
+ it(@"customKeys should be trimmed to contain <numConfigurableKeys> items", ^{
+ NSArray *expectedCustomKeys = [testCustomKeysLong subarrayWithRange:NSMakeRange(0, numConfigurableKeys)];
+ testKeyboardProperties.customKeys = testCustomKeysLong;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.customKeys).to(equal(expectedCustomKeys));
+ });
+
+ it(@"customKeys should not be trimmed and should be equal to the initial array", ^{
+ NSArray *testCustomKeys = [testCustomKeysLong subarrayWithRange:NSMakeRange(0, numConfigurableKeys)];
+ testKeyboardProperties.customKeys = testCustomKeys;
+ SDLKeyboardProperties *resultProperties = [testStruct createValidKeyboardConfigurationBasedOnKeyboardCapabilitiesFromConfiguration:testKeyboardProperties];
+ expect(resultProperties).notTo(beNil());
+ expect(resultProperties.customKeys.count).to(equal(numConfigurableKeys));
+ expect(resultProperties.customKeys).to(equal(testCustomKeys));
+ });
+ });
});
});