/* Copyright 2024 New Vector Ltd. Copyright 2015 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only Please see LICENSE in the repository root for full details. */ #import "MXKRoomIOSOutgoingBubbleTableViewCell.h" #import "MXKRoomBubbleCellData.h" #import "MXEvent+MatrixKit.h" #import "MXKTools.h" #import "NSBundle+MatrixKit.h" #import "MXKImageView.h" #define OUTGOING_BUBBLE_COLOR 0x00e34d @implementation MXKRoomIOSOutgoingBubbleTableViewCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // Create the strechable background bubble self.bubbleImageView.image = self.class.bubbleImage; } return self; } - (void)layoutSubviews { [super layoutSubviews]; } - (void)render:(MXKCellData *)cellData { [super render:cellData]; // Reset values self.bubbleImageView.hidden = NO; // Customise the data precomputed by the legacy classes // Replace black color in texts by the white color expected for outgoing messages. NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.messageTextView.attributedText]; // Change all attributes one by one [attributedString enumerateAttributesInRange:NSMakeRange(0, attributedString.length) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { // Replace only black colored texts if (attrs[NSForegroundColorAttributeName] == self->bubbleData.eventFormatter.defaultTextColor) { // By white NSMutableDictionary *newAttrs = [NSMutableDictionary dictionaryWithDictionary:attrs]; newAttrs[NSForegroundColorAttributeName] = [UIColor whiteColor]; [attributedString setAttributes:newAttrs range:range]; } }]; self.messageTextView.attributedText = attributedString; // Update the bubble width to include the text view self.bubbleImageViewWidthConstraint.constant = bubbleData.contentSize.width + 17; // Limit bubble width if (self.bubbleImageViewWidthConstraint.constant < 46) { self.bubbleImageViewWidthConstraint.constant = 46; } // Mask the image with the bubble if (bubbleData.attachment && bubbleData.attachment.type != MXKAttachmentTypeFile && bubbleData.attachment.type != MXKAttachmentTypeAudio) { self.bubbleImageView.hidden = YES; UIImageView *rightBubbleImageView = [[UIImageView alloc] initWithImage:self.class.bubbleImage]; rightBubbleImageView.frame = CGRectMake(0, 0, self.bubbleImageViewWidthConstraint.constant, bubbleData.contentSize.height + self.attachViewTopConstraint.constant - 4); self.attachmentView.layer.mask = rightBubbleImageView.layer; } } + (CGFloat)heightForCellData:(MXKCellData *)cellData withMaximumWidth:(CGFloat)maxWidth { CGFloat rowHeight = [super heightForCellData:cellData withMaximumWidth:maxWidth]; CGFloat height = self.cellWithOriginalXib.frame.size.height; // Use the xib height as the minimal height if (rowHeight < height) { rowHeight = height; } return rowHeight; } /** Create the strechable background bubble. @return the bubble image. */ + (UIImage *)bubbleImage { UIImage *rightBubbleImage = [NSBundle mxk_imageFromMXKAssetsBundleWithName:@"bubble_ios_messages_right"]; rightBubbleImage = [MXKTools paintImage:rightBubbleImage withColor:[MXKTools colorWithRGBValue:OUTGOING_BUBBLE_COLOR]]; UIEdgeInsets edgeInsets = UIEdgeInsetsMake(17, 22, 17, 27); return [rightBubbleImage resizableImageWithCapInsets:edgeInsets]; } @end