Update the room description in the rooms list in case of live broadcast (incoming or outgoing) (#7160)

This commit is contained in:
Yoan Pintas 2022-12-19 19:26:55 +01:00 committed by GitHub
parent 710b09ed44
commit 3e9b3aa877
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 119 additions and 10 deletions

View file

@ -2698,6 +2698,9 @@ To enable access, tap Settings> Location and select Always";
"notice_crypto_error_unknown_inbound_session_id" = "The sender's session has not sent us the keys for this message.";
"notice_sticker" = "sticker";
"notice_in_reply_to" = "In reply to";
"notice_voice_broadcast_live" = "Live broadcast";
"notice_voice_broadcast_ended" = "%@ ended a voice broadcast.";
"notice_voice_broadcast_ended_by_you" = "You ended a voice broadcast.";
// room display name
"room_displayname_empty_room" = "Empty room";

View file

@ -4323,6 +4323,18 @@ public class VectorL10n: NSObject {
public static var noticeVideoAttachment: String {
return VectorL10n.tr("Vector", "notice_video_attachment")
}
/// %@ ended a voice broadcast.
public static func noticeVoiceBroadcastEnded(_ p1: String) -> String {
return VectorL10n.tr("Vector", "notice_voice_broadcast_ended", p1)
}
/// You ended a voice broadcast.
public static var noticeVoiceBroadcastEndedByYou: String {
return VectorL10n.tr("Vector", "notice_voice_broadcast_ended_by_you")
}
/// Live broadcast
public static var noticeVoiceBroadcastLive: String {
return VectorL10n.tr("Vector", "notice_voice_broadcast_live")
}
/// Always notify
public static var notificationSettingsAlwaysNotify: String {
return VectorL10n.tr("Vector", "notification_settings_always_notify")

View file

@ -80,10 +80,7 @@
// Manage lastEventAttributedTextMessage optional property
if (!roomCellData.roomSummary.spaceChildInfo && [roomCellData respondsToSelector:@selector(lastEventAttributedTextMessage)])
{
// Force the default text color for the last message (cancel highlighted message color)
NSMutableAttributedString *lastEventDescription = [[NSMutableAttributedString alloc] initWithAttributedString:roomCellData.lastEventAttributedTextMessage];
[lastEventDescription addAttribute:NSForegroundColorAttributeName value:ThemeService.shared.theme.textSecondaryColor range:NSMakeRange(0, lastEventDescription.length)];
self.lastEventDescription.attributedText = lastEventDescription;
self.lastEventDescription.attributedText = roomCellData.lastEventAttributedTextMessage;
}
else
{

View file

@ -16,3 +16,4 @@
#import "MXKImageView.h"
#import "MXKRoomBubbleCellData.h"
#import "UserIndicatorCancel.h"
#import "VoiceBroadcastInfo.h"

View file

@ -546,6 +546,40 @@ static NSString *const kEventFormatterTimeFormat = @"HH:mm";
}
#pragma mark - MXRoomSummaryUpdating
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withLastEvent:(MXEvent *)event eventState:(MXRoomState *)eventState roomState:(MXRoomState *)roomState {
// Do not display voice broadcast chunk in last message.
if (event.eventType == MXEventTypeRoomMessage && event.content[VoiceBroadcastSettings.voiceBroadcastContentKeyChunkType])
{
return NO;
}
// Update last message if we have a voice broadcast in the room.
if ([event.type isEqualToString:VoiceBroadcastSettings.voiceBroadcastInfoContentKeyType])
{
return [self session:session updateRoomSummary:summary withVoiceBroadcastInfoStateEvent:event roomState:roomState];
}
else
{
MXEvent *stateEvent = [roomState stateEventsWithType:VoiceBroadcastSettings.voiceBroadcastInfoContentKeyType].lastObject;
if (stateEvent && ![VoiceBroadcastInfo isStoppedFor:[VoiceBroadcastInfo modelFromJSON: stateEvent.content].state])
{
return [self session:session updateRoomSummary:summary withVoiceBroadcastInfoStateEvent:stateEvent roomState:roomState];
}
}
BOOL updated = [super session:session updateRoomSummary:summary withLastEvent:event eventState:eventState roomState:roomState];
if (updated) {
// Force the default text color for the last message (cancel highlighted message color)
NSMutableAttributedString *lastEventDescription = [[NSMutableAttributedString alloc] initWithAttributedString:summary.lastMessage.attributedText];
[lastEventDescription addAttribute:NSForegroundColorAttributeName value:ThemeService.shared.theme.textSecondaryColor range:NSMakeRange(0, lastEventDescription.length)];
summary.lastMessage.attributedText = lastEventDescription;
}
return updated;
}
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withStateEvents:(NSArray<MXEvent *> *)stateEvents roomState:(MXRoomState *)roomState
{
BOOL updated = [super session:session updateRoomSummary:summary withStateEvents:stateEvents roomState:roomState];
@ -569,6 +603,67 @@ static NSString *const kEventFormatterTimeFormat = @"HH:mm";
return updated;
}
- (BOOL)session:(MXSession *)session updateRoomSummary:(MXRoomSummary *)summary withVoiceBroadcastInfoStateEvent:(MXEvent *)stateEvent roomState:(MXRoomState *)roomState
{
[summary updateLastMessage:[[MXRoomLastMessage alloc] initWithEvent:stateEvent]];
if (summary.lastMessage.others == nil)
{
summary.lastMessage.others = [NSMutableDictionary dictionary];
}
summary.lastMessage.others[@"lastEventDate"] = [self dateStringFromEvent:stateEvent withTime:YES];
NSAttributedString *attachmentString = nil;
UIColor *textColor;
if ([VoiceBroadcastInfo isStoppedFor:[VoiceBroadcastInfo modelFromJSON: stateEvent.content].state])
{
textColor = ThemeService.shared.theme.textSecondaryColor;
NSString *senderDisplayName;
if ([stateEvent.stateKey isEqualToString:session.myUser.userId])
{
summary.lastMessage.text = VectorL10n.noticeVoiceBroadcastEndedByYou;
}
else
{
senderDisplayName = [self senderDisplayNameForEvent:stateEvent withRoomState:roomState];
summary.lastMessage.text = [VectorL10n noticeVoiceBroadcastEnded:senderDisplayName];
}
}
else
{
textColor = ThemeService.shared.theme.colors.alert;
UIImage *liveImage = AssetImages.voiceBroadcastLive.image;
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [liveImage imageWithTintColor:textColor renderingMode:UIImageRenderingModeAlwaysTemplate];
attachmentString = [NSAttributedString attributedStringWithAttachment:attachment];
summary.lastMessage.text = VectorL10n.noticeVoiceBroadcastLive;
}
// Compute the attribute text message
NSMutableAttributedString *lastMessage;
if (attachmentString)
{
lastMessage = [[NSMutableAttributedString alloc] initWithAttributedString:attachmentString];
// Change base line
[lastMessage addAttribute:NSBaselineOffsetAttributeName value:@(-3.0f) range:NSMakeRange(0, attachmentString.length)];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@" %@", summary.lastMessage.text]];
[lastMessage appendAttributedString:attributedText];
[lastMessage addAttribute:NSFontAttributeName value:self.defaultTextFont range:NSMakeRange(0, lastMessage.length)];
}
else
{
NSAttributedString *attributedText = [self renderString:summary.lastMessage.text forEvent:stateEvent];
lastMessage = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
}
[lastMessage addAttribute:NSForegroundColorAttributeName value:textColor range:NSMakeRange(0, lastMessage.length)];
summary.lastMessage.attributedText = lastMessage;
return YES;
}
- (NSAttributedString *)redactedMessageReplacementAttributedString
{
UIFont *font = self.defaultTextFont;

View file

@ -76,4 +76,4 @@ targets:
excludes:
- "**/*.md" # excludes all files with the .md extension
- path: ../Riot/Modules/Room/TimelineCells/Styles/RoomTimelineStyleIdentifier.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastSettings.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/MatrixSDK

View file

@ -82,4 +82,4 @@ targets:
excludes:
- "**/*.md" # excludes all files with the .md extension
- path: ../Riot/Modules/Room/TimelineCells/Styles/RoomTimelineStyleIdentifier.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastSettings.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/MatrixSDK

View file

@ -63,7 +63,7 @@ targets:
- path: ../Riot/Modules/Analytics/AnalyticsScreen.swift
- path: ../Riot/Modules/LocationSharing/LocationAuthorizationStatus.swift
- path: ../Riot/Modules/QRCode/QRCodeGenerator.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastInfoState.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/MatrixSDK/VoiceBroadcastInfoState.swift
- path: ../Riot/Assets/en.lproj/Untranslated.strings
buildPhase: resources
- path: ../Riot/Assets/Images.xcassets

View file

@ -72,7 +72,7 @@ targets:
- path: ../Riot/Modules/Analytics/AnalyticsScreen.swift
- path: ../Riot/Modules/LocationSharing/LocationAuthorizationStatus.swift
- path: ../Riot/Modules/QRCode/QRCodeGenerator.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastInfoState.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/MatrixSDK/VoiceBroadcastInfoState.swift
- path: ../Riot/Assets/en.lproj/Untranslated.strings
buildPhase: resources
- path: ../Riot/Assets/Images.xcassets

View file

@ -72,4 +72,4 @@ targets:
- path: ../Riot/Modules/Room/TimelineCells/Styles/RoomTimelineStyleIdentifier.swift
- path: ../Riot/Modules/Room/EventMenu/EventMenuBuilder.swift
- path: ../Riot/Modules/Room/EventMenu/EventMenuItemType.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastSettings.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/MatrixSDK/VoiceBroadcastSettings.swift

View file

@ -64,4 +64,4 @@ targets:
excludes:
- "**/*.md" # excludes all files with the .md extension
- path: ../Riot/Modules/Room/TimelineCells/Styles/RoomTimelineStyleIdentifier.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/VoiceBroadcastSettings.swift
- path: ../Riot/Modules/VoiceBroadcast/VoiceBroadcastSDK/MatrixSDK

View file

@ -0,0 +1 @@
Update the room description in the rooms list in case of live broadcast (incoming or outgoing)