|  |  | @ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (nonatomic) OWSMessageHeaderView *headerView; |  |  |  | @property (nonatomic) OWSMessageHeaderView *headerView; | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (nonatomic) OWSMessageBubbleView *messageBubbleView; |  |  |  | @property (nonatomic) OWSMessageBubbleView *messageBubbleView; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | @property (nonatomic) NSLayoutConstraint *messageBubbleViewBottomConstraint; | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (nonatomic) AvatarImageView *avatarView; |  |  |  | @property (nonatomic) AvatarImageView *avatarView; | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (nonatomic, nullable) FriendRequestView *friendRequestView; |  |  |  | @property (nonatomic, nullable) FriendRequestView *friendRequestView; | 
			
		
	
		
		
			
				
					
					|  |  |  | @property (nonatomic, nullable) UIImageView *sendFailureBadgeView; |  |  |  | @property (nonatomic, nullable) UIImageView *sendFailureBadgeView; | 
			
		
	
	
		
		
			
				
					|  |  | @ -60,7 +61,7 @@ NS_ASSUME_NONNULL_BEGIN | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self.avatarView autoSetDimension:ALDimensionWidth toSize:self.avatarSize]; |  |  |  |     [self.avatarView autoSetDimension:ALDimensionWidth toSize:self.avatarSize]; | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self.avatarView autoSetDimension:ALDimensionHeight toSize:self.avatarSize]; |  |  |  |     [self.avatarView autoSetDimension:ALDimensionHeight toSize:self.avatarSize]; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self.messageBubbleView autoPinBottomToSuperviewMarginWithInset:0]; |  |  |  |     self.messageBubbleViewBottomConstraint = [self.messageBubbleView autoPinBottomToSuperviewMarginWithInset:0]; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.contentView.userInteractionEnabled = YES; |  |  |  |     self.contentView.userInteractionEnabled = YES; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -114,6 +115,19 @@ NS_ASSUME_NONNULL_BEGIN | 
			
		
	
		
		
			
				
					
					|  |  |  |     return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage; |  |  |  |     return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage; | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | - (BOOL)isIncomingFriendRequest { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     if ([self.viewItem.interaction isKindOfClass:TSIncomingMessage.class]) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // TODO: Enable this when possible | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // ======== | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | //        TSIncomingMessage *message = (TSIncomingMessage *)self.message; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | //        return message.isFriendRequest | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // ======== | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return YES; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         return NO; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | - (BOOL)shouldHaveSendFailureBadge |  |  |  | - (BOOL)shouldHaveSendFailureBadge | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) { |  |  |  |     if (![self.viewItem.interaction isKindOfClass:[TSOutgoingMessage class]]) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -133,6 +147,7 @@ NS_ASSUME_NONNULL_BEGIN | 
			
		
	
		
		
			
				
					
					|  |  |  |     OWSAssertDebug([self.viewItem.interaction isKindOfClass:[TSMessage class]]); |  |  |  |     OWSAssertDebug([self.viewItem.interaction isKindOfClass:[TSMessage class]]); | 
			
		
	
		
		
			
				
					
					|  |  |  |     OWSAssertDebug(self.messageBubbleView); |  |  |  |     OWSAssertDebug(self.messageBubbleView); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     [self.messageBubbleViewBottomConstraint setActive:YES]; | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.messageBubbleView.viewItem = self.viewItem; |  |  |  |     self.messageBubbleView.viewItem = self.viewItem; | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.messageBubbleView.cellMediaCache = self.delegate.cellMediaCache; |  |  |  |     self.messageBubbleView.cellMediaCache = self.delegate.cellMediaCache; | 
			
		
	
		
		
			
				
					
					|  |  |  |     [self.messageBubbleView configureViews]; |  |  |  |     [self.messageBubbleView configureViews]; | 
			
		
	
	
		
		
			
				
					|  |  | @ -166,20 +181,19 @@ NS_ASSUME_NONNULL_BEGIN | 
			
		
	
		
		
			
				
					
					|  |  |  |                                                       relation:NSLayoutRelationGreaterThanOrEqual], |  |  |  |                                                       relation:NSLayoutRelationGreaterThanOrEqual], | 
			
		
	
		
		
			
				
					
					|  |  |  |         ]]; |  |  |  |         ]]; | 
			
		
	
		
		
			
				
					
					|  |  |  |          |  |  |  |          | 
			
		
	
		
		
			
				
					
					|  |  |  |         if ([self.viewItem.interaction isKindOfClass:TSIncomingMessage.class]) { |  |  |  |         if (self.isIncomingFriendRequest) { // TODO: message.isFriendRequest | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |             TSIncomingMessage *message = (TSIncomingMessage *)self.message; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |             if (YES) { // TODO: message.isFriendRequest |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             self.friendRequestView = [FriendRequestView new]; |  |  |  |             self.friendRequestView = [FriendRequestView new]; | 
			
		
	
		
		
			
				
					
					|  |  |  |                 self.friendRequestView.message = message; |  |  |  |             self.friendRequestView.message = (TSIncomingMessage *)self.message; | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |             self.friendRequestView.delegate = self.friendRequestViewDelegate; |  |  |  |             self.friendRequestView.delegate = self.friendRequestViewDelegate; | 
			
		
	
		
		
			
				
					
					|  |  |  |             [self.contentView addSubview:self.friendRequestView]; |  |  |  |             [self.contentView addSubview:self.friendRequestView]; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             [self.messageBubbleViewBottomConstraint setActive:NO]; | 
			
		
	
		
		
			
				
					
					|  |  |  |             [self.viewConstraints addObjectsFromArray:@[ |  |  |  |             [self.viewConstraints addObjectsFromArray:@[ | 
			
		
	
		
		
			
				
					
					|  |  |  |                 [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:self.conversationStyle.gutterLeading], |  |  |  |                 [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:self.conversationStyle.gutterLeading], | 
			
		
	
		
		
			
				
					
					|  |  |  |                 [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:self.conversationStyle.gutterTrailing], |  |  |  |                 [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:self.conversationStyle.gutterTrailing], | 
			
		
	
		
		
			
				
					
					|  |  |  |                     [self.friendRequestView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageBubbleView withOffset:12.f] |  |  |  |                 [self.friendRequestView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageBubbleView withOffset:12.f], | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeBottom] | 
			
		
	
		
		
			
				
					
					|  |  |  |             ]]; |  |  |  |             ]]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     } else { |  |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (self.shouldHaveSendFailureBadge) { |  |  |  |         if (self.shouldHaveSendFailureBadge) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             self.sendFailureBadgeView = [UIImageView new]; |  |  |  |             self.sendFailureBadgeView = [UIImageView new]; | 
			
		
	
	
		
		
			
				
					|  |  | @ -356,8 +370,8 @@ NS_ASSUME_NONNULL_BEGIN | 
			
		
	
		
		
			
				
					
					|  |  |  |         cellSize.width += self.sendFailureBadgeSize + self.sendFailureBadgeSpacing; |  |  |  |         cellSize.width += self.sendFailureBadgeSize + self.sendFailureBadgeSpacing; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (self.friendRequestView != nil) { |  |  |  |     if (self.isIncomingFriendRequest) { | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         cellSize.height += 118.f; // TODO: Measure dynamically |  |  |  |         cellSize.height += 118; // TODO: Measure dynamically | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |      |  |  |  |      | 
			
		
	
		
		
			
				
					
					|  |  |  |     cellSize = CGSizeCeil(cellSize); |  |  |  |     cellSize = CGSizeCeil(cellSize); | 
			
		
	
	
		
		
			
				
					|  |  | 
 |