Meeting invitations bubble :
- Fix description displaying (dynamic height) - Fix reply/forward header overlap - Remove copy text option from contextual menu of ICS - Improved chat bubble context menu icons quality - Do not show IMDM option menu in 1-1 chat room - Remove extra space at bottom of contextual menu in chat bubbles
|
|
@ -1,9 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="20037" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" colorMatched="YES">
|
||||
<device id="retina4_7" orientation="portrait" appearance="light"/>
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="20020"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 729 B After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8 KiB After Width: | Height: | Size: 9.4 KiB |