diff --git a/samples/v1.5/Elements/Input.Text.PasswordStyle.json b/samples/v1.5/Elements/Input.Text.PasswordStyle.json new file mode 100644 index 0000000000..d39f6e3d3d --- /dev/null +++ b/samples/v1.5/Elements/Input.Text.PasswordStyle.json @@ -0,0 +1,20 @@ +{ + "type": "AdaptiveCard", + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.5", + "body": [ + { + "type": "Input.Text", + "id": "id0", + "placeholder": "password", + "style": "password", + "label": "Input.Text With Password Style" + } + ], + "actions": [ + { + "type": "Action.Submit", + "title": "OK" + } + ] +} diff --git a/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCards/ACRInputRenderer.mm b/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCards/ACRInputRenderer.mm index a6c4d7336d..8ea7554bc1 100644 --- a/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCards/ACRInputRenderer.mm +++ b/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCards/ACRInputRenderer.mm @@ -65,6 +65,11 @@ + (ACRTextField *)configTextFiled:(std::shared_ptr const &)inputBlock txtInput = [bundle loadNibNamed:@"ACRTextUrlField" owner:rootView options:nil][0]; break; } + case TextInputStyle::Password: { + txtInput = [bundle loadNibNamed:@"ACRTextField" owner:rootView options:nil][0]; + txtInput.secureTextEntry = YES; + break; + } case TextInputStyle::Text: default: { txtInput = [bundle loadNibNamed:@"ACRTextField" owner:rootView options:nil][0]; @@ -74,6 +79,7 @@ + (ACRTextField *)configTextFiled:(std::shared_ptr const &)inputBlock txtInput.placeholder = [NSString stringWithCString:inputBlock->GetPlaceholder().c_str() encoding:NSUTF8StringEncoding]; txtInput.text = [NSString stringWithCString:inputBlock->GetValue().c_str() encoding:NSUTF8StringEncoding]; + txtInput.allowsEditingTextAttributes = YES; return txtInput; } @@ -107,7 +113,9 @@ - (UIView *)render:(UIView *)viewGroup } ACRTextInputHandler *textInputHandler = [[ACRTextInputHandler alloc] init:acoElem]; - if (inputBlck->GetIsMultiline()) { + + BOOL isMultiline = (inputBlck->GetTextInputStyle() != TextInputStyle::Password) && inputBlck->GetIsMultiline(); + if (isMultiline) { if (renderAction) { // if action is defined, load ACRQuickReplyMultilineView nib for customizable UI multilineview = [[ACRQuickReplyMultilineView alloc] initWithFrame:CGRectMake(0, 0, viewGroup.frame.size.width, 0)]; @@ -169,7 +177,7 @@ - (UIView *)render:(UIView *)viewGroup // configures for action if (renderAction) { - if (inputBlck->GetIsMultiline()) { + if (isMultiline) { [inputs addObject:txtview]; } else { [inputs addObject:inputview]; diff --git a/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCardsTests/AdaptiveCardsTests.mm b/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCardsTests/AdaptiveCardsTests.mm index 726be92766..14e9ac9892 100644 --- a/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCardsTests/AdaptiveCardsTests.mm +++ b/source/ios/AdaptiveCards/AdaptiveCards/AdaptiveCardsTests/AdaptiveCardsTests.mm @@ -7,10 +7,18 @@ // #import "ACRContentHoldingUIView.h" +#import "ACOBaseCardElementPrivate.h" +#import "ACRRegistration.h" +#import "ACRBaseCardElementRenderer.h" #import "TextBlock.h" +#import "TextInput.h" +#import "ACRInputLabelView.h" +#import "ACRTextView.h" #import #import +using namespace AdaptiveCards; + @interface AdaptiveCardsTests : XCTestCase @end @@ -47,5 +55,73 @@ - (void)testContentHoldingUIViewWithImage XCTAssertEqualObjects(wrapperView.contentView, imageView); } +- (void)testPasswordStyleIsCorrectSet +{ + std::shared_ptr textInput = std::make_shared(); + textInput->SetTextInputStyle(TextInputStyle::Password); + ACOBaseCardElement *baseCardElement = [[ACOBaseCardElement alloc] initWithBaseCardElement:textInput]; + ACRRegistration *registration = [ACRRegistration getInstance]; + ACRBaseCardElementRenderer *renderer = [registration getRenderer:[NSNumber numberWithInt:ACRTextInput]]; + ACRColumnView *viewGroup = [[ACRColumnView alloc] init]; + ACRView *rootView = [[ACRView alloc] init]; + NSMutableArray *inputs = [[NSMutableArray alloc] init]; + ACOHostConfig *config = [[ACOHostConfig alloc] init]; + UIView *inputView = [renderer render:viewGroup rootView:rootView inputs:inputs + baseCardElement:baseCardElement + hostConfig:config]; + XCTAssertNotNil(inputView); + XCTAssertTrue([inputView isKindOfClass:[ACRInputLabelView class]]); + ACRInputLabelView *labelview = (ACRInputLabelView *)inputView; + XCTAssertNotNil(labelview.inputView); + XCTAssertTrue([labelview.inputView isKindOfClass:[UITextField class]]); + UITextField *textField = (UITextField *)labelview.inputView; + XCTAssertTrue(textField.isSecureTextEntry); +} + +- (void)testInputIsSetToACRTextViewWhenMultiline +{ + std::shared_ptr textInput = std::make_shared(); + textInput->SetIsMultiline(true); + ACOBaseCardElement *baseCardElement = [[ACOBaseCardElement alloc] initWithBaseCardElement:textInput]; + ACRRegistration *registration = [ACRRegistration getInstance]; + ACRBaseCardElementRenderer *renderer = [registration getRenderer:[NSNumber numberWithInt:ACRTextInput]]; + ACRColumnView *viewGroup = [[ACRColumnView alloc] init]; + ACRView *rootView = [[ACRView alloc] init]; + NSMutableArray *inputs = [[NSMutableArray alloc] init]; + ACOHostConfig *config = [[ACOHostConfig alloc] init]; + UIView *inputView = [renderer render:viewGroup rootView:rootView inputs:inputs + baseCardElement:baseCardElement + hostConfig:config]; + XCTAssertNotNil(inputView); + XCTAssertTrue([inputView isKindOfClass:[ACRInputLabelView class]]); + ACRInputLabelView *labelview = (ACRInputLabelView *)inputView; + XCTAssertNotNil(labelview.inputView); + XCTAssertTrue([labelview.inputView isKindOfClass:[ACRTextView class]]); +} + +- (void)testInputIsSetToACRTextFieldWhenMultilineAndPasswordStyleAreSet +{ + std::shared_ptr textInput = std::make_shared(); + textInput->SetIsMultiline(true); + textInput->SetTextInputStyle(TextInputStyle::Password); + ACOBaseCardElement *baseCardElement = [[ACOBaseCardElement alloc] initWithBaseCardElement:textInput]; + ACRRegistration *registration = [ACRRegistration getInstance]; + ACRBaseCardElementRenderer *renderer = [registration getRenderer:[NSNumber numberWithInt:ACRTextInput]]; + ACRColumnView *viewGroup = [[ACRColumnView alloc] init]; + ACRView *rootView = [[ACRView alloc] init]; + NSMutableArray *inputs = [[NSMutableArray alloc] init]; + ACOHostConfig *config = [[ACOHostConfig alloc] init]; + UIView *inputView = [renderer render:viewGroup rootView:rootView inputs:inputs + baseCardElement:baseCardElement + hostConfig:config]; + XCTAssertNotNil(inputView); + XCTAssertTrue([inputView isKindOfClass:[ACRInputLabelView class]]); + ACRInputLabelView *labelview = (ACRInputLabelView *)inputView; + XCTAssertNotNil(labelview.inputView); + XCTAssertTrue([labelview.inputView isKindOfClass:[UITextField class]]); + UITextField *textField = (UITextField *)labelview.inputView; + XCTAssertTrue(textField.isSecureTextEntry); +} + @end