|
|
@ -20,11 +20,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
// * MessageView (message)
|
|
|
|
// * MessageView (message)
|
|
|
|
// * dateHeaderLabel (above message)
|
|
|
|
// * dateHeaderLabel (above message)
|
|
|
|
// * footerView (below message)
|
|
|
|
// * footerView (below message)
|
|
|
|
// * failedSendBadgeView ("trailing" beside message)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property (nonatomic) OWSMessageBubbleView *messageBubbleView;
|
|
|
|
@property (nonatomic) OWSMessageBubbleView *messageBubbleView;
|
|
|
|
@property (nonatomic) UILabel *dateHeaderLabel;
|
|
|
|
@property (nonatomic) UILabel *dateHeaderLabel;
|
|
|
|
@property (nonatomic, nullable) UIImageView *failedSendBadgeView;
|
|
|
|
|
|
|
|
@property (nonatomic) UIView *footerView;
|
|
|
|
@property (nonatomic) UIView *footerView;
|
|
|
|
@property (nonatomic) UILabel *footerLabel;
|
|
|
|
@property (nonatomic) UILabel *footerLabel;
|
|
|
|
@property (nonatomic, nullable) OWSExpirationTimerView *expirationTimerView;
|
|
|
|
@property (nonatomic, nullable) OWSExpirationTimerView *expirationTimerView;
|
|
|
@ -53,12 +51,11 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
|
|
self.preservesSuperviewLayoutMargins = NO;
|
|
|
|
self.preservesSuperviewLayoutMargins = NO;
|
|
|
|
self.contentView.preservesSuperviewLayoutMargins = NO;
|
|
|
|
self.contentView.preservesSuperviewLayoutMargins = NO;
|
|
|
|
|
|
|
|
|
|
|
|
_viewConstraints = [NSMutableArray new];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.layoutMargins = UIEdgeInsetsZero;
|
|
|
|
self.layoutMargins = UIEdgeInsetsZero;
|
|
|
|
self.contentView.layoutMargins = UIEdgeInsetsZero;
|
|
|
|
self.contentView.layoutMargins = UIEdgeInsetsZero;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_viewConstraints = [NSMutableArray new];
|
|
|
|
|
|
|
|
|
|
|
|
self.messageBubbleView = [OWSMessageBubbleView new];
|
|
|
|
self.messageBubbleView = [OWSMessageBubbleView new];
|
|
|
|
[self.contentView addSubview:self.messageBubbleView];
|
|
|
|
[self.contentView addSubview:self.messageBubbleView];
|
|
|
|
|
|
|
|
|
|
|
@ -112,28 +109,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
return NSStringFromClass([self class]);
|
|
|
|
return NSStringFromClass([self class]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- (BOOL)shouldHaveFailedSendBadge
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) {
|
|
|
|
|
|
|
|
return NO;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)self.viewItem.interaction;
|
|
|
|
|
|
|
|
return outgoingMessage.messageState == TSOutgoingMessageStateFailed;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (UIImage *)failedSendBadge
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
UIImage *image = [UIImage imageNamed:@"message_send_failure"];
|
|
|
|
|
|
|
|
OWSAssert(image);
|
|
|
|
|
|
|
|
OWSAssert(image.size.width == self.failedSendBadgeSize && image.size.height == self.failedSendBadgeSize);
|
|
|
|
|
|
|
|
return image;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (CGFloat)failedSendBadgeSize
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return 20.f;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark - Convenience Accessors
|
|
|
|
#pragma mark - Convenience Accessors
|
|
|
|
|
|
|
|
|
|
|
|
- (OWSMessageCellType)cellType
|
|
|
|
- (OWSMessageCellType)cellType
|
|
|
@ -177,25 +152,19 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
self.dateHeaderLabel.font = self.dateHeaderDateFont;
|
|
|
|
self.dateHeaderLabel.font = self.dateHeaderDateFont;
|
|
|
|
self.footerLabel.font = UIFont.ows_dynamicTypeCaption2Font;
|
|
|
|
self.footerLabel.font = UIFont.ows_dynamicTypeCaption2Font;
|
|
|
|
|
|
|
|
|
|
|
|
if (self.shouldHaveFailedSendBadge) {
|
|
|
|
if (self.isIncoming) {
|
|
|
|
self.failedSendBadgeView = [UIImageView new];
|
|
|
|
|
|
|
|
self.failedSendBadgeView.image =
|
|
|
|
|
|
|
|
[self.failedSendBadge imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
|
|
|
|
|
|
|
|
self.failedSendBadgeView.tintColor = [UIColor ows_destructiveRedColor];
|
|
|
|
|
|
|
|
[self.contentView addSubview:self.failedSendBadgeView];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[self.viewConstraints addObjectsFromArray:@[
|
|
|
|
[self.viewConstraints addObjectsFromArray:@[
|
|
|
|
[self.messageBubbleView autoPinLeadingToSuperviewMargin],
|
|
|
|
[self.messageBubbleView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:self.layoutInfo.gutterLeading],
|
|
|
|
[self.failedSendBadgeView autoPinLeadingToTrailingEdgeOfView:self.messageBubbleView],
|
|
|
|
[self.messageBubbleView autoPinEdgeToSuperviewEdge:ALEdgeTrailing
|
|
|
|
[self.failedSendBadgeView autoAlignAxis:ALAxisHorizontal toSameAxisOfView:self.messageBubbleView],
|
|
|
|
withInset:self.layoutInfo.gutterTrailing
|
|
|
|
[self.failedSendBadgeView autoPinTrailingToSuperviewMargin],
|
|
|
|
relation:NSLayoutRelationGreaterThanOrEqual],
|
|
|
|
[self.failedSendBadgeView autoSetDimension:ALDimensionWidth toSize:self.failedSendBadgeSize],
|
|
|
|
|
|
|
|
[self.failedSendBadgeView autoSetDimension:ALDimensionHeight toSize:self.failedSendBadgeSize],
|
|
|
|
|
|
|
|
]];
|
|
|
|
]];
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
[self.viewConstraints addObjectsFromArray:@[
|
|
|
|
[self.viewConstraints addObjectsFromArray:@[
|
|
|
|
[self.messageBubbleView autoPinLeadingToSuperviewMargin],
|
|
|
|
[self.messageBubbleView autoPinEdgeToSuperviewEdge:ALEdgeLeading
|
|
|
|
[self.messageBubbleView autoPinTrailingToSuperviewMargin],
|
|
|
|
withInset:self.layoutInfo.gutterLeading
|
|
|
|
|
|
|
|
relation:NSLayoutRelationGreaterThanOrEqual],
|
|
|
|
|
|
|
|
[self.messageBubbleView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:self.layoutInfo.gutterTrailing],
|
|
|
|
]];
|
|
|
|
]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -313,6 +282,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
|
|
- (void)updateFooter
|
|
|
|
- (void)updateFooter
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
OWSAssert(self.layoutInfo);
|
|
|
|
OWSAssert(self.viewItem.interaction.interactionType == OWSInteractionType_IncomingMessage
|
|
|
|
OWSAssert(self.viewItem.interaction.interactionType == OWSInteractionType_IncomingMessage
|
|
|
|
|| self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage);
|
|
|
|
|| self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage);
|
|
|
|
|
|
|
|
|
|
|
@ -342,10 +312,8 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
[self.viewConstraints addObjectsFromArray:@[
|
|
|
|
[self.viewConstraints addObjectsFromArray:@[
|
|
|
|
(self.isIncoming ? [self.footerView autoPinLeadingToSuperviewMarginWithInset:kBubbleThornSideInset]
|
|
|
|
(self.isIncoming ? [self.footerView autoPinLeadingToSuperviewMarginWithInset:self.layoutInfo.gutterLeading]
|
|
|
|
: [self.footerView autoPinTrailingToSuperviewMarginWithInset:kBubbleThornSideInset]),
|
|
|
|
: [self.footerView autoPinTrailingToSuperviewMarginWithInset:self.layoutInfo.gutterTrailing]),
|
|
|
|
(self.isIncoming ? [self.footerView autoPinTrailingToSuperviewMargin]
|
|
|
|
|
|
|
|
: [self.footerView autoPinLeadingToSuperviewMargin]),
|
|
|
|
|
|
|
|
]];
|
|
|
|
]];
|
|
|
|
|
|
|
|
|
|
|
|
[self.viewConstraints addObject:[self.footerView autoPinEdge:ALEdgeTop
|
|
|
|
[self.viewConstraints addObject:[self.footerView autoPinEdge:ALEdgeTop
|
|
|
@ -418,7 +386,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark - Measurement
|
|
|
|
#pragma mark - Measurement
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (CGSize)cellSize
|
|
|
|
- (CGSize)cellSize
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OWSAssert(self.layoutInfo);
|
|
|
|
OWSAssert(self.layoutInfo);
|
|
|
@ -441,10 +408,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
cellSize.height += self.footerHeight;
|
|
|
|
cellSize.height += self.footerHeight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (self.shouldHaveFailedSendBadge) {
|
|
|
|
|
|
|
|
cellSize.width += self.failedSendBadgeSize;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cellSize = CGSizeCeil(cellSize);
|
|
|
|
cellSize = CGSizeCeil(cellSize);
|
|
|
|
|
|
|
|
|
|
|
|
return cellSize;
|
|
|
|
return cellSize;
|
|
|
@ -474,8 +437,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
|
|
|
|
|
|
|
self.dateHeaderLabel.text = nil;
|
|
|
|
self.dateHeaderLabel.text = nil;
|
|
|
|
self.dateHeaderLabel.hidden = YES;
|
|
|
|
self.dateHeaderLabel.hidden = YES;
|
|
|
|
[self.failedSendBadgeView removeFromSuperview];
|
|
|
|
|
|
|
|
self.failedSendBadgeView = nil;
|
|
|
|
|
|
|
|
self.footerLabel.text = nil;
|
|
|
|
self.footerLabel.text = nil;
|
|
|
|
self.footerLabel.hidden = YES;
|
|
|
|
self.footerLabel.hidden = YES;
|
|
|
|
|
|
|
|
|
|
|
|