diff --git a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib index d19e81d0c..8635ea28c 100644 --- a/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib +++ b/Classes/LinphoneUI/Base.lproj/UIChatBubbleTextCell.xib @@ -1,9 +1,9 @@ - + - + diff --git a/Classes/LinphoneUI/UIChatBubbleTextCell.m b/Classes/LinphoneUI/UIChatBubbleTextCell.m index ce09f8140..7da5f39eb 100644 --- a/Classes/LinphoneUI/UIChatBubbleTextCell.m +++ b/Classes/LinphoneUI/UIChatBubbleTextCell.m @@ -46,10 +46,8 @@ [self setFrame:CGRectMake(0, 0, sub.frame.size.width, sub.frame.size.height)]; [self addSubview:sub]; self.icsBubbleView = [[ICSBubbleView alloc] init]; - self.icsBubbleView.frame = CGRectMake(_messageText.frame.origin.x, _messageText.frame.origin.y+25, CONFERENCE_INVITATION_WIDTH-80, CONFERENCE_INVITATION_HEIGHT-20); [self.innerView addSubview:self.icsBubbleView]; [(ICSBubbleView*)self.icsBubbleView setLayoutConstraintsWithView:self.backgroundColorImage]; - } } @@ -491,7 +489,7 @@ static const CGFloat REPLY_OR_FORWARD_TAG_HEIGHT = 18; + (CGSize)ViewHeightForMessageText:(LinphoneChatMessage *)chat withWidth:(int)width textForImdn:(NSString *)imdnText { if ([ICSBubbleView isConferenceInvitationMessageWithCmessage:chat]) { - return CGSizeMake(CONFERENCE_INVITATION_WIDTH, CONFERENCE_INVITATION_HEIGHT); + return CGSizeMake(CONFERENCE_INVITATION_WIDTH, CONFERENCE_INVITATION_HEIGHT+[ICSBubbleView getDescriptionHeightFromContentWithCmessage:chat]); } NSString *messageText = [UIChatBubbleTextCell TextMessageForChat:chat]; @@ -791,6 +789,8 @@ static const CGFloat REPLY_OR_FORWARD_TAG_HEIGHT = 18; _replyTransferIcon.hidden = ! linphone_chat_message_is_reply(_message) && !linphone_chat_message_is_forward(_message); _replyTransferLabel.hidden = ! linphone_chat_message_is_reply(_message) && !linphone_chat_message_is_forward(_message); + [(ICSBubbleView*)self.icsBubbleView updateTopLayoutConstraintsWithView:self.backgroundColorImage replyOrForward:linphone_chat_message_is_reply(_message)||linphone_chat_message_is_forward(_message)]; + if (linphone_chat_message_is_reply(_message)) { CGRect replyFrame = CGRectMake(10, _replyTransferLabel.frame.origin.y+_replyTransferLabel.frame.size.height+5,MAX(self.contactDateLabel.frame.size.width-20,180), REPLY_CHAT_BUBBLE_HEIGHT); @@ -869,7 +869,7 @@ static const CGFloat REPLY_OR_FORWARD_TAG_HEIGHT = 18; } - if (linphone_chat_message_get_utf8_text(message)) { + if (linphone_chat_message_get_utf8_text(message) && ![ICSBubbleView isConferenceInvitationMessageWithCmessage:message]) { [_messageActionsTitles addObject:NSLocalizedString(@"Copy text", nil)]; [_messageActionsIcons addObject:@"menu_copy_text_default"]; [_messageActionsBlocks addObject:^{ @@ -896,7 +896,7 @@ static const CGFloat REPLY_OR_FORWARD_TAG_HEIGHT = 18; [VIEW(ChatConversationView) initiateReplyViewForMessage:message]; }]; - if (linphone_chat_message_is_outgoing(self.message) || linphone_chat_room_get_nb_participants(linphone_chat_message_get_chat_room(self.message)) > 1) { + if (linphone_chat_message_is_outgoing(self.message) && linphone_chat_room_get_nb_participants(linphone_chat_message_get_chat_room(self.message)) > 1) { [_messageActionsTitles addObject:NSLocalizedString(@"Infos", nil)]; [_messageActionsIcons addObject:@"menu_info"]; [_messageActionsBlocks addObject:^{ @@ -930,7 +930,7 @@ static const CGFloat REPLY_OR_FORWARD_TAG_HEIGHT = 18; int cellHeight = 45; int numberOfItems = (int) _messageActionsTitles.count; CGRect screenRect = UIScreen.mainScreen.bounds; - int menuHeight = numberOfItems * cellHeight + 15; + int menuHeight = numberOfItems * cellHeight; CGRect frame = CGRectMake( linphone_chat_message_is_outgoing(self.message) ? screenRect.size.width - width - 10 : 10, diff --git a/Classes/Swift/Conference/Views/ICSBubbleView.swift b/Classes/Swift/Conference/Views/ICSBubbleView.swift index a4cebbef5..a8397a368 100644 --- a/Classes/Swift/Conference/Views/ICSBubbleView.swift +++ b/Classes/Swift/Conference/Views/ICSBubbleView.swift @@ -30,11 +30,11 @@ import EventKitUI let border_width = 2.0 let rows_spacing = 6.0 let inner_padding = 8.0 + let forward_reply_title_height = 10.0 let indicator_y = 3.0 let share_size = 25 let join_share_width = 150.0 - - + let inviteTitle = StyledLabel(VoipTheme.conference_invite_title_font, VoipTexts.conference_invite_title) let subject = StyledLabel(VoipTheme.conference_invite_subject_font) let participants = StyledLabel(VoipTheme.conference_invite_desc_font) @@ -45,20 +45,19 @@ import EventKitUI let joinShare = UIStackView() let join = FormButton(title:VoipTexts.conference_invite_join.uppercased(), backgroundStateColors: VoipTheme.button_green_background) let share = UIImageView(image:UIImage(named:"voip_export")?.tinted(with: VoipTheme.primaryTextColor.get())) - - + var conferenceData: ScheduledConferenceData? = nil { didSet { if let data = conferenceData { subject.text = data.subject.value participants.text = VoipTexts.conference_invite_participants_count.replacingOccurrences(of: "%d", with: String(data.conferenceInfo.participants.count+1)) participants.addIndicatorIcon(iconName: "conference_schedule_participants_default",padding : 0.0, y: -indicator_y, trailing: false) - date.text = " "+TimestampUtils.dateToString(date: data.rawDate) + date.text = TimestampUtils.dateToString(date: data.rawDate) date.addIndicatorIcon(iconName: "conference_schedule_calendar_default", padding: 0.0, y:-indicator_y, trailing:false) - timeDuration.text = " \(data.time.value)" + (data.duration.value != nil ? " ( \(data.duration.value) )" : "") + timeDuration.text = "\(data.time.value)" + (data.duration.value != nil ? " ( \(data.duration.value) )" : "") timeDuration.addIndicatorIcon(iconName: "conference_schedule_time_default",padding : 0.0, y: -indicator_y, trailing: false) - descriptionTitle.isHidden = true // data.description.value == nil || data.description.value!.count == 0 - descriptionValue.isHidden = true // descriptionTitle.isHidden + descriptionTitle.isHidden = data.description.value == nil || data.description.value!.count == 0 + descriptionValue.isHidden = descriptionTitle.isHidden descriptionValue.text = data.description.value } } @@ -85,6 +84,8 @@ import EventKitUI rows.addArrangedSubview(descriptionTitle) rows.addArrangedSubview(descriptionValue) + descriptionValue.numberOfLines = 5 + addSubview(joinShare) joinShare.axis = .horizontal @@ -162,7 +163,11 @@ import EventKitUI } @objc func setLayoutConstraints(view:UIView) { - matchDimensionsWith(view: view, insetedByDx: inner_padding).done() + matchBordersWith(view: view, insetedByDx: inner_padding).done() + } + + @objc func updateTopLayoutConstraints(view:UIView, replyOrForward: Bool) { + updateTopBorderWith(view: view, inset: inner_padding + (replyOrForward ? forward_reply_title_height : 0.0)).done() } func eventEditViewController(_ controller: EKEventEditViewController, didCompleteWith action: EKEventEditViewAction) { @@ -182,4 +187,23 @@ import EventKitUI return subject } + @objc static func getDescriptionHeightFromContent(cmessage: OpaquePointer) -> CGFloat { + let message = ChatMessage.getSwiftObject(cObject: cmessage) + var height = 0.0 + message.contents.forEach { content in + if (content.isIcalendar) { + if let conferenceInfo = try? Factory.Instance.createConferenceInfoFromIcalendarContent(content: content) { + let description = NSString(string: conferenceInfo.description) + if (description.length > 0) { + let dummyTitle = StyledLabel(VoipTheme.conference_invite_desc_title_font, VoipTexts.conference_description_title) + let dummyLabel = StyledLabel(VoipTheme.conference_invite_desc_font) + let rect = CGSize(width: CGFloat(CONFERENCE_INVITATION_WIDTH-80), height: CGFloat.greatestFiniteMagnitude) + height = dummyTitle.intrinsicContentSize.height + description.boundingRect(with: rect, options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [NSAttributedString.Key.font: dummyLabel.font!], context: nil).height + } + } + } + } + return height + } + } diff --git a/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift b/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift index 89ea7f451..c34f80730 100644 --- a/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift +++ b/Classes/Swift/Extensions/IOS/UIVIewExtensions.swift @@ -147,7 +147,7 @@ extension UIView { return self } - func matchDimensionsWith(view:UIView, insetedByDx:CGFloat = 0) -> UIView { + func matchBordersWith(view:UIView, insetedByDx:CGFloat = 0) -> UIView { snp.makeConstraints { (make) in make.left.top.equalTo(view).offset(insetedByDx) make.right.bottom.equalTo(view).offset(-insetedByDx) @@ -155,6 +155,13 @@ extension UIView { return self } + func updateTopBorderWith(view:UIView, inset:CGFloat = 0) -> UIView { + snp.updateConstraints { (make) in + make.top.equalTo(view).offset(inset) + } + return self + } + func matchParentEdges() -> UIView { snp.makeConstraints { (make) in make.edges.equalToSuperview() diff --git a/Resources/images/menu_copy_text_default.png b/Resources/images/menu_copy_text_default.png index ccdef4e4b..ac945fb5e 100644 Binary files a/Resources/images/menu_copy_text_default.png and b/Resources/images/menu_copy_text_default.png differ diff --git a/Resources/images/menu_delete.png b/Resources/images/menu_delete.png index 947c0abf4..65d612aae 100644 Binary files a/Resources/images/menu_delete.png and b/Resources/images/menu_delete.png differ diff --git a/Resources/images/menu_forward_default.png b/Resources/images/menu_forward_default.png index 910450bf9..9a5b9d85f 100644 Binary files a/Resources/images/menu_forward_default.png and b/Resources/images/menu_forward_default.png differ diff --git a/Resources/images/menu_info.png b/Resources/images/menu_info.png index d45da33d5..249d74a56 100644 Binary files a/Resources/images/menu_info.png and b/Resources/images/menu_info.png differ diff --git a/Resources/images/menu_reply_default.png b/Resources/images/menu_reply_default.png index 8aa5b5e1e..7f898c47e 100644 Binary files a/Resources/images/menu_reply_default.png and b/Resources/images/menu_reply_default.png differ diff --git a/Resources/images/menu_resend_default.png b/Resources/images/menu_resend_default.png index 5f5ab4ddd..cce92a4b9 100644 Binary files a/Resources/images/menu_resend_default.png and b/Resources/images/menu_resend_default.png differ