mirror of
https://gitlab.opencode.de/bwi/bundesmessenger/clients/bundesmessenger-ios.git
synced 2026-04-22 01:22:46 +02:00
merged element 1.8.10
This commit is contained in:
@@ -30,7 +30,7 @@
|
||||
|
||||
const CGFloat kTypingCellHeight = 24;
|
||||
|
||||
@interface RoomDataSource() <BubbleReactionsViewModelDelegate, URLPreviewViewDelegate, ThreadSummaryViewDelegate>
|
||||
@interface RoomDataSource() <RoomReactionsViewModelDelegate, URLPreviewViewDelegate, ThreadSummaryViewDelegate, MXThreadingServiceDelegate>
|
||||
{
|
||||
// Observe kThemeServiceDidChangeThemeNotification to handle user interface theme change.
|
||||
id kThemeServiceDidChangeThemeNotificationObserver;
|
||||
@@ -93,12 +93,9 @@ const CGFloat kTypingCellHeight = 24;
|
||||
[self reload];
|
||||
|
||||
}];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(newThreadCreated:)
|
||||
name:MXThreadingService.newThreadCreated
|
||||
object:nil];
|
||||
|
||||
|
||||
[matrixSession.threadingService addDelegate:self];
|
||||
|
||||
[self registerKeyVerificationRequestNotification];
|
||||
[self registerKeyVerificationTransactionNotification];
|
||||
[self registerTrustLevelDidChangeNotifications];
|
||||
@@ -178,6 +175,8 @@ const CGFloat kTypingCellHeight = 24;
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self.keyVerificationTransactionDidChangeNotificationObserver];
|
||||
}
|
||||
|
||||
[self.mxSession.threadingService removeDelegate:self];
|
||||
|
||||
[super destroy];
|
||||
}
|
||||
@@ -239,7 +238,6 @@ const CGFloat kTypingCellHeight = 24;
|
||||
}
|
||||
|
||||
[self fetchEncryptionTrustedLevel];
|
||||
[self enableRoomCreationIntroCellDisplayIfNeeded];
|
||||
}
|
||||
|
||||
- (void)fetchEncryptionTrustedLevel
|
||||
@@ -248,6 +246,7 @@ const CGFloat kTypingCellHeight = 24;
|
||||
[self.roomDataSourceDelegate roomDataSourceDidUpdateEncryptionTrustLevel:self];
|
||||
}
|
||||
|
||||
/* $$$
|
||||
- (NSArray *)attachmentsWithThumbnail
|
||||
{
|
||||
NSMutableArray *attachments = [NSMutableArray array];
|
||||
@@ -286,6 +285,7 @@ const CGFloat kTypingCellHeight = 24;
|
||||
{
|
||||
[self enableRoomCreationIntroCellDisplayIfNeeded];
|
||||
}
|
||||
*/
|
||||
|
||||
- (BOOL)shouldQueueEventForProcessing:(MXEvent *)event roomState:(MXRoomState *)roomState direction:(MXTimelineDirection)direction
|
||||
{
|
||||
@@ -344,8 +344,6 @@ const CGFloat kTypingCellHeight = 24;
|
||||
// Enable the containsLastMessage flag for the cell data which contains the last message.
|
||||
@synchronized(bubbles)
|
||||
{
|
||||
[self insertRoomCreationIntroCellDataIfNeeded];
|
||||
|
||||
// Reset first all cell data
|
||||
for (RoomBubbleCellData *cellData in bubbles)
|
||||
{
|
||||
@@ -398,7 +396,7 @@ const CGFloat kTypingCellHeight = 24;
|
||||
{
|
||||
if (indexPath.row == self.typingCellIndex)
|
||||
{
|
||||
RoomTypingBubbleCell *cell = [tableView dequeueReusableCellWithIdentifier:RoomTypingBubbleCell.defaultReuseIdentifier forIndexPath:indexPath];
|
||||
MessageTypingCell *cell = [tableView dequeueReusableCellWithIdentifier:MessageTypingCell.defaultReuseIdentifier forIndexPath:indexPath];
|
||||
[cell updateWithTheme:ThemeService.shared.theme];
|
||||
[cell updateTypingUsers:_currentTypingUsers mediaManager:self.mxSession.mediaManager];
|
||||
return cell;
|
||||
@@ -495,21 +493,21 @@ const CGFloat kTypingCellHeight = 24;
|
||||
|
||||
MXAggregatedReactions* reactions = cellData.reactions[componentEventId].aggregatedReactionsWithNonZeroCount;
|
||||
|
||||
BubbleReactionsView *reactionsView;
|
||||
RoomReactionsView *reactionsView;
|
||||
|
||||
if (!component.event.isRedactedEvent && reactions && !isCollapsableCellCollapsed)
|
||||
{
|
||||
BOOL showAllReactions = [cellData showAllReactionsForEvent:componentEventId];
|
||||
BubbleReactionsViewModel *bubbleReactionsViewModel = [[BubbleReactionsViewModel alloc] initWithAggregatedReactions:reactions
|
||||
RoomReactionsViewModel *roomReactionsViewModel = [[RoomReactionsViewModel alloc] initWithAggregatedReactions:reactions
|
||||
eventId:componentEventId
|
||||
showAll:showAllReactions];
|
||||
|
||||
reactionsView = [BubbleReactionsView new];
|
||||
reactionsView.viewModel = bubbleReactionsViewModel;
|
||||
reactionsView = [RoomReactionsView new];
|
||||
reactionsView.viewModel = roomReactionsViewModel;
|
||||
reactionsView.tag = index;
|
||||
[reactionsView updateWithTheme:ThemeService.shared.theme];
|
||||
|
||||
bubbleReactionsViewModel.viewModelDelegate = self;
|
||||
roomReactionsViewModel.viewModelDelegate = self;
|
||||
|
||||
[temporaryViews addObject:reactionsView];
|
||||
[cellDecorator addReactionView:reactionsView toCell:bubbleCell
|
||||
@@ -521,7 +519,8 @@ const CGFloat kTypingCellHeight = 24;
|
||||
// display thread summary view if the component has a thread in the room timeline
|
||||
if (RiotSettings.shared.enableThreads && component.thread && !self.threadId)
|
||||
{
|
||||
threadSummaryView = [[ThreadSummaryView alloc] initWithThread:component.thread];
|
||||
threadSummaryView = [[ThreadSummaryView alloc] initWithThread:component.thread
|
||||
session:self.mxSession];
|
||||
threadSummaryView.delegate = self;
|
||||
threadSummaryView.tag = index;
|
||||
|
||||
@@ -567,7 +566,7 @@ const CGFloat kTypingCellHeight = 24;
|
||||
if (roomMembers.count)
|
||||
{
|
||||
// Define the read receipts container, positioned on the right border of the bubble cell (Note the right margin 6 pts).
|
||||
avatarsContainer = [[MXKReceiptSendersContainer alloc] initWithFrame:CGRectMake(bubbleCell.frame.size.width - RoomBubbleCellLayout.readReceiptsViewWidth + RoomBubbleCellLayout.readReceiptsViewRightMargin, bottomPositionY + RoomBubbleCellLayout.readReceiptsViewTopMargin, RoomBubbleCellLayout.readReceiptsViewWidth, RoomBubbleCellLayout.readReceiptsViewHeight) andMediaManager:self.mxSession.mediaManager];
|
||||
avatarsContainer = [[MXKReceiptSendersContainer alloc] initWithFrame:CGRectMake(bubbleCell.frame.size.width - PlainRoomCellLayoutConstants.readReceiptsViewWidth + PlainRoomCellLayoutConstants.readReceiptsViewRightMargin, bottomPositionY + PlainRoomCellLayoutConstants.readReceiptsViewTopMargin, PlainRoomCellLayoutConstants.readReceiptsViewWidth, PlainRoomCellLayoutConstants.readReceiptsViewHeight) andMediaManager:self.mxSession.mediaManager];
|
||||
|
||||
// Custom avatar display
|
||||
avatarsContainer.maxDisplayedAvatars = 5;
|
||||
@@ -612,48 +611,17 @@ const CGFloat kTypingCellHeight = 24;
|
||||
|
||||
if ([componentEventId isEqualToString:self.room.accountData.readMarkerEventId])
|
||||
{
|
||||
bubbleCell.readMarkerView = [[UIView alloc] initWithFrame:CGRectMake(0, bottomPositionY - RoomBubbleCellLayout.readMarkerViewHeight, bubbleCell.bubbleOverlayContainer.frame.size.width, RoomBubbleCellLayout.readMarkerViewHeight)];
|
||||
bubbleCell.readMarkerView.backgroundColor = ThemeService.shared.theme.tintColor;
|
||||
UIView *readMarkerView = [[UIView alloc] initWithFrame:CGRectMake(0, bottomPositionY - PlainRoomCellLayoutConstants.readMarkerViewHeight, bubbleCell.bubbleOverlayContainer.frame.size.width, PlainRoomCellLayoutConstants.readMarkerViewHeight)];
|
||||
readMarkerView.backgroundColor = ThemeService.shared.theme.tintColor;
|
||||
// Hide by default the marker, it will be shown and animated when the cell will be rendered.
|
||||
bubbleCell.readMarkerView.hidden = YES;
|
||||
bubbleCell.readMarkerView.tag = index;
|
||||
readMarkerView.hidden = YES;
|
||||
readMarkerView.tag = index;
|
||||
readMarkerView.accessibilityIdentifier = @"readMarker";
|
||||
|
||||
bubbleCell.readMarkerView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||
bubbleCell.readMarkerView.accessibilityIdentifier = @"readMarker";
|
||||
[bubbleCell.bubbleOverlayContainer addSubview:bubbleCell.readMarkerView];
|
||||
|
||||
// Force read marker constraints
|
||||
bubbleCell.readMarkerViewTopConstraint = [NSLayoutConstraint constraintWithItem:bubbleCell.readMarkerView
|
||||
attribute:NSLayoutAttributeTop
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:bubbleCell.bubbleOverlayContainer
|
||||
attribute:NSLayoutAttributeTop
|
||||
multiplier:1.0
|
||||
constant:bottomPositionY - RoomBubbleCellLayout.readMarkerViewHeight];
|
||||
bubbleCell.readMarkerViewLeadingConstraint = [NSLayoutConstraint constraintWithItem:bubbleCell.readMarkerView
|
||||
attribute:NSLayoutAttributeLeading
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:bubbleCell.bubbleOverlayContainer
|
||||
attribute:NSLayoutAttributeLeading
|
||||
multiplier:1.0
|
||||
constant:0];
|
||||
bubbleCell.readMarkerViewTrailingConstraint = [NSLayoutConstraint constraintWithItem:bubbleCell.bubbleOverlayContainer
|
||||
attribute:NSLayoutAttributeTrailing
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:bubbleCell.readMarkerView
|
||||
attribute:NSLayoutAttributeTrailing
|
||||
multiplier:1.0
|
||||
constant:0];
|
||||
|
||||
bubbleCell.readMarkerViewHeightConstraint = [NSLayoutConstraint constraintWithItem:bubbleCell.readMarkerView
|
||||
attribute:NSLayoutAttributeHeight
|
||||
relatedBy:NSLayoutRelationEqual
|
||||
toItem:nil
|
||||
attribute:NSLayoutAttributeNotAnAttribute
|
||||
multiplier:1.0
|
||||
constant:RoomBubbleCellLayout.readMarkerViewHeight];
|
||||
|
||||
[NSLayoutConstraint activateConstraints:@[bubbleCell.readMarkerViewTopConstraint, bubbleCell.readMarkerViewLeadingConstraint, bubbleCell.readMarkerViewTrailingConstraint, bubbleCell.readMarkerViewHeightConstraint]];
|
||||
[cellDecorator addReadMarkerView:readMarkerView
|
||||
toCell:bubbleCell
|
||||
cellData:cellData
|
||||
contentViewPositionY:bottomPositionY];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1058,13 +1026,13 @@ const CGFloat kTypingCellHeight = 24;
|
||||
cell.attachmentView.accessibilityLabel = nil;
|
||||
}
|
||||
|
||||
#pragma mark - Threads
|
||||
#pragma mark - MXThreadingServiceDelegate
|
||||
|
||||
- (void)newThreadCreated:(NSNotification *)notification
|
||||
- (void)threadingService:(MXThreadingService *)service didCreateNewThread:(MXThread *)thread direction:(MXTimelineDirection)direction
|
||||
{
|
||||
if (self.threadId)
|
||||
if (direction == MXTimelineDirectionBackwards)
|
||||
{
|
||||
// no need to reload the thread screen
|
||||
// no need to reload when paginating back
|
||||
return;
|
||||
}
|
||||
NSUInteger count = 0;
|
||||
@@ -1078,9 +1046,9 @@ const CGFloat kTypingCellHeight = 24;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - BubbleReactionsViewModelDelegate
|
||||
#pragma mark - RoomReactionsViewModelDelegate
|
||||
|
||||
- (void)bubbleReactionsViewModel:(BubbleReactionsViewModel *)viewModel didAddReaction:(MXReactionCount *)reactionCount forEventId:(NSString *)eventId
|
||||
- (void)roomReactionsViewModel:(RoomReactionsViewModel *)viewModel didAddReaction:(MXReactionCount *)reactionCount forEventId:(NSString *)eventId
|
||||
{
|
||||
[self addReaction:reactionCount.reaction forEventId:eventId success:^{
|
||||
|
||||
@@ -1089,7 +1057,7 @@ const CGFloat kTypingCellHeight = 24;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)bubbleReactionsViewModel:(BubbleReactionsViewModel *)viewModel didRemoveReaction:(MXReactionCount * _Nonnull)reactionCount forEventId:(NSString * _Nonnull)eventId
|
||||
- (void)roomReactionsViewModel:(RoomReactionsViewModel *)viewModel didRemoveReaction:(MXReactionCount * _Nonnull)reactionCount forEventId:(NSString * _Nonnull)eventId
|
||||
{
|
||||
[self removeReaction:reactionCount.reaction forEventId:eventId success:^{
|
||||
|
||||
@@ -1098,12 +1066,12 @@ const CGFloat kTypingCellHeight = 24;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)bubbleReactionsViewModel:(BubbleReactionsViewModel *)viewModel didShowAllTappedForEventId:(NSString * _Nonnull)eventId
|
||||
- (void)roomReactionsViewModel:(RoomReactionsViewModel *)viewModel didShowAllTappedForEventId:(NSString * _Nonnull)eventId
|
||||
{
|
||||
[self setShowAllReactions:YES forEvent:eventId];
|
||||
}
|
||||
|
||||
- (void)bubbleReactionsViewModel:(BubbleReactionsViewModel *)viewModel didShowLessTappedForEventId:(NSString * _Nonnull)eventId
|
||||
- (void)roomReactionsViewModel:(RoomReactionsViewModel *)viewModel didShowLessTappedForEventId:(NSString * _Nonnull)eventId
|
||||
{
|
||||
[self setShowAllReactions:NO forEvent:eventId];
|
||||
}
|
||||
@@ -1122,7 +1090,7 @@ const CGFloat kTypingCellHeight = 24;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)bubbleReactionsViewModel:(BubbleReactionsViewModel *)viewModel didLongPressForEventId:(NSString *)eventId
|
||||
- (void)roomReactionsViewModel:(RoomReactionsViewModel *)viewModel didLongPressForEventId:(NSString *)eventId
|
||||
{
|
||||
[self.delegate dataSource:self didRecognizeAction:kMXKRoomBubbleCellLongPressOnReactionView inCell:nil userInfo:@{ kMXKRoomBubbleCellEventIdKey: eventId }];
|
||||
}
|
||||
@@ -1176,83 +1144,6 @@ const CGFloat kTypingCellHeight = 24;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Room creation intro cell
|
||||
|
||||
- (BOOL)canShowRoomCreationIntroCell
|
||||
{
|
||||
NSString* userId = self.mxSession.myUser.userId;
|
||||
|
||||
if (!userId || !self.isLive || self.isPeeking)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
|
||||
// Room creation cell is only shown for the creator
|
||||
return [self.room.summary.creatorUserId isEqualToString:userId];
|
||||
}
|
||||
|
||||
- (void)enableRoomCreationIntroCellDisplayIfNeeded
|
||||
{
|
||||
self.showRoomCreationCell = [self canShowRoomCreationIntroCell];
|
||||
}
|
||||
|
||||
// Insert the room creation intro cell at the begining
|
||||
- (void)insertRoomCreationIntroCellDataIfNeeded
|
||||
{
|
||||
@synchronized(bubbles)
|
||||
{
|
||||
NSUInteger existingRoomCreationCellDataIndex = [self roomBubbleDataIndexWithTag:RoomBubbleCellDataTagRoomCreationIntro];
|
||||
|
||||
if (existingRoomCreationCellDataIndex != NSNotFound)
|
||||
{
|
||||
[bubbles removeObjectAtIndex:existingRoomCreationCellDataIndex];
|
||||
}
|
||||
|
||||
if (self.showRoomCreationCell)
|
||||
{
|
||||
NSUInteger roomCreationConfigCellDataIndex = [self roomBubbleDataIndexWithTag:RoomBubbleCellDataTagRoomCreateConfiguration];
|
||||
|
||||
// Only add room creation intro cell if `bubbles` array contains the room creation event
|
||||
if (roomCreationConfigCellDataIndex != NSNotFound)
|
||||
{
|
||||
if (!self.roomCreationCellData)
|
||||
{
|
||||
MXEvent *event = [MXEvent new];
|
||||
MXRoomState *roomState = [MXRoomState new];
|
||||
RoomBubbleCellData *roomBubbleCellData = [[RoomBubbleCellData alloc] initWithEvent:event andRoomState:roomState andRoomDataSource:self];
|
||||
roomBubbleCellData.tag = RoomBubbleCellDataTagRoomCreationIntro;
|
||||
|
||||
self.roomCreationCellData = roomBubbleCellData;
|
||||
}
|
||||
|
||||
[bubbles insertObject:self.roomCreationCellData atIndex:0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self.roomCreationCellData = nil;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (NSUInteger)roomBubbleDataIndexWithTag:(RoomBubbleCellDataTag)tag
|
||||
{
|
||||
@synchronized(bubbles)
|
||||
{
|
||||
return [bubbles indexOfObjectPassingTest:^BOOL(id<MXKRoomBubbleCellDataStoring> _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
|
||||
if ([obj isKindOfClass:RoomBubbleCellData.class])
|
||||
{
|
||||
RoomBubbleCellData *roomBubbleCellData = (RoomBubbleCellData*)obj;
|
||||
if (roomBubbleCellData.tag == tag)
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
return NO;
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - URLPreviewViewDelegate
|
||||
|
||||
- (void)didOpenURLFromPreviewView:(URLPreviewView *)previewView for:(NSString *)eventID in:(NSString *)roomID
|
||||
|
||||
Reference in New Issue
Block a user