element-ios/Riot/Modules/Room/TimelineCells/Common/MXKRoomIOSOutgoingBubbleTab...

123 lines
3.8 KiB
Objective-C

/*
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