Display info dialogs when we prevent the user from starting a new voice broadcast

- Update the existing implementation used to start/stop a voice broadcast in order to handle the different cases where voice broadcast is denied
- Add the optional Voice broadcast action to the new wysiwyg composer
This commit is contained in:
Giom Foret 2022-10-20 00:38:42 +02:00
parent 69aa87067c
commit 080acb3628
5 changed files with 98 additions and 24 deletions

View file

@ -2189,6 +2189,12 @@ Tap the + to start adding people.";
"voice_message_stop_locked_mode_recording" = "Tap on your recording to stop or listen";
"voice_message_lock_screen_placeholder" = "Voice message";
// Mark: - Voice broadcast
"voice_broadcast_unauthorized_title" = "Can't start a new voice broadcast";
"voice_broadcast_permission_denied_message" = "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.";
"voice_broadcast_blocked_by_someone_else_message" = "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.";
"voice_broadcast_already_in_progress_message" = "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.";
// Mark: - Version check
"version_check_banner_title_supported" = "Were ending support for iOS %@";
@ -2503,6 +2509,7 @@ To enable access, tap Settings> Location and select Always";
"wysiwyg_composer_start_action_location" = "Location";
"wysiwyg_composer_start_action_camera" = "Camera";
"wysiwyg_composer_start_action_text_formatting" = "Text Formatting";
"wysiwyg_composer_start_action_voice_broadcast" = "Voice broadcast";
// Formatting Actions
"wysiwyg_composer_format_action_bold" = "Apply bold format";

View file

@ -9051,6 +9051,22 @@ public class VectorL10n: NSObject {
public static var voice: String {
return VectorL10n.tr("Vector", "voice")
}
/// You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.
public static var voiceBroadcastAlreadyInProgressMessage: String {
return VectorL10n.tr("Vector", "voice_broadcast_already_in_progress_message")
}
/// Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.
public static var voiceBroadcastBlockedBySomeoneElseMessage: String {
return VectorL10n.tr("Vector", "voice_broadcast_blocked_by_someone_else_message")
}
/// You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.
public static var voiceBroadcastPermissionDeniedMessage: String {
return VectorL10n.tr("Vector", "voice_broadcast_permission_denied_message")
}
/// Can't start a new voice broadcast
public static var voiceBroadcastUnauthorizedTitle: String {
return VectorL10n.tr("Vector", "voice_broadcast_unauthorized_title")
}
/// Voice message
public static var voiceMessageLockScreenPlaceholder: String {
return VectorL10n.tr("Vector", "voice_message_lock_screen_placeholder")
@ -9207,6 +9223,10 @@ public class VectorL10n: NSObject {
public static var wysiwygComposerStartActionTextFormatting: String {
return VectorL10n.tr("Vector", "wysiwyg_composer_start_action_text_formatting")
}
/// Voice broadcast
public static var wysiwygComposerStartActionVoiceBroadcast: String {
return VectorL10n.tr("Vector", "wysiwyg_composer_start_action_voice_broadcast")
}
/// Yes
public static var yes: String {
return VectorL10n.tr("Vector", "yes")

View file

@ -1775,15 +1775,20 @@ static CGSize kThreadListBarButtonItemImageSize;
|| self.customizedRoomDataSource.jitsiWidget;
}
- (BOOL)canSendStateEventWithType:(MXEventTypeString)eventTypeString
{
MXRoomPowerLevels *powerLevels = [self.roomDataSource.roomState powerLevels];
NSInteger requiredPower = [powerLevels minimumPowerLevelForSendingEventAsStateEvent:eventTypeString];
NSInteger myPower = [powerLevels powerLevelOfUserWithUserID:self.roomDataSource.mxSession.myUserId];
return myPower >= requiredPower;
}
/**
Returns a flag for the current user whether it's privileged to add/remove Jitsi widgets to this room.
*/
- (BOOL)canEditJitsiWidget
{
MXRoomPowerLevels *powerLevels = [self.roomDataSource.roomState powerLevels];
NSInteger requiredPower = [powerLevels minimumPowerLevelForSendingEventAsStateEvent:kWidgetModularEventTypeString];
NSInteger myPower = [powerLevels powerLevelOfUserWithUserID:self.roomDataSource.mxSession.myUserId];
return myPower >= requiredPower;
return [self canSendStateEventWithType:kWidgetModularEventTypeString];
}
- (void)registerURLPreviewNotifications
@ -2327,26 +2332,7 @@ static CGSize kThreadListBarButtonItemImageSize;
if ([self.inputToolbarView isKindOfClass:RoomInputToolbarView.class]) {
((RoomInputToolbarView *) self.inputToolbarView).actionMenuOpened = NO;
}
// TODO: Init and start voice broadcast
MXSession* session = self.roomDataSource.mxSession;
[session getOrCreateVoiceBroadcastServiceFor:self.roomDataSource.room completion:^(VoiceBroadcastService *voiceBroadcastService) {
if (voiceBroadcastService) {
if ([VoiceBroadcastInfo isStoppedFor:[voiceBroadcastService getState]]) {
[session.voiceBroadcastService startVoiceBroadcastWithSuccess:^(NSString * _Nullable success) {
} failure:^(NSError * _Nonnull error) {
}];
} else {
[session.voiceBroadcastService stopVoiceBroadcastWithSuccess:^(NSString * _Nullable success) {
} failure:^(NSError * _Nonnull error) {
}];
}
}
}];
[self roomInputToolbarViewDidTapVoiceBroadcast];
}]];
}
roomInputView.actionsBar.actionItems = actionItems;
@ -2436,6 +2422,48 @@ static CGSize kThreadListBarButtonItemImageSize;
self.documentPickerPresenter = documentPickerPresenter;
}
- (void)roomInputToolbarViewDidTapVoiceBroadcast
{
// Check first the room permission
if (![self canSendStateEventWithType:VoiceBroadcastSettings.eventType])
{
[self showAlertWithTitle:[VectorL10n voiceBroadcastUnauthorizedTitle] message:[VectorL10n voiceBroadcastPermissionDeniedMessage]];
return;
}
MXSession* session = self.roomDataSource.mxSession;
// Check whether the user is not already broadcasting here or in another room
if (session.voiceBroadcastService)
{
[self showAlertWithTitle:[VectorL10n voiceBroadcastUnauthorizedTitle] message:[VectorL10n voiceBroadcastAlreadyInProgressMessage]];
//*** Temporary code - To be removed ***
// We stop here the current voice broadcasting (required until the actual stop button is available)
[session.voiceBroadcastService stopVoiceBroadcastWithSuccess:^(NSString * _Nullable success) {
[session tearDownVoiceBroadcastService];
} failure:^(NSError * _Nonnull error) {
}];
//*** End ***
return;
}
// Request the voice broadcast service to start recording - No service is returned if someone else is already broadcasting in the room
[session getOrCreateVoiceBroadcastServiceFor:self.roomDataSource.room completion:^(VoiceBroadcastService *voiceBroadcastService) {
if (voiceBroadcastService) {
[voiceBroadcastService startVoiceBroadcastWithSuccess:^(NSString * _Nullable success) {
} failure:^(NSError * _Nonnull error) {
}];
}
else
{
[self showAlertWithTitle:[VectorL10n voiceBroadcastUnauthorizedTitle] message:[VectorL10n voiceBroadcastBlockedBySomeoneElseMessage]];
}
}];
}
/**
Send a video asset via the room input toolbar prompting the user for the conversion preset to use
if the `showMediaCompressionPrompt` setting has been enabled.
@ -5070,6 +5098,10 @@ static CGSize kThreadListBarButtonItemImageSize;
{
[actionItems addObject:@(ComposerCreateActionAttachments)];
}
if (RiotSettings.shared.enableVoiceBroadcast && !self.isNewDirectChat)
{
[actionItems addObject:@(ComposerCreateActionVoiceBroadcast)];
}
if (BuildSettings.pollsEnabled && self.displayConfiguration.sendingPollsEnabled && !self.isNewDirectChat)
{
[actionItems addObject:@(ComposerCreateActionPolls)];
@ -8007,6 +8039,9 @@ static CGSize kThreadListBarButtonItemImageSize;
case ComposerCreateActionAttachments:
[self roomInputToolbarViewDidTapFileUpload];
break;
case ComposerCreateActionVoiceBroadcast:
[self roomInputToolbarViewDidTapVoiceBroadcast];
break;
case ComposerCreateActionPolls:
[self.delegate roomViewControllerDidRequestPollCreationFormPresentation:self];
break;

View file

@ -28,4 +28,8 @@ extension MXSession {
@objc public func getOrCreateVoiceBroadcastService(for room: MXRoom, completion: @escaping (VoiceBroadcastService?) -> Void) {
VoiceBroadcastServiceProvider.shared.getOrCreateVoiceBroadcastService(for: room, completion: completion)
}
@objc public func tearDownVoiceBroadcastService() {
VoiceBroadcastServiceProvider.shared.tearDownVoiceBroadcastService()
}
}

View file

@ -42,6 +42,8 @@ struct ComposerCreateActionListViewState: BindableState {
case stickers
/// Upload an attachment
case attachments
/// Voice broadcast
case voiceBroadcast
/// Create a Poll
case polls
/// Add a location
@ -63,6 +65,8 @@ extension ComposerCreateAction {
return VectorL10n.wysiwygComposerStartActionStickers
case .attachments:
return VectorL10n.wysiwygComposerStartActionAttachments
case .voiceBroadcast:
return VectorL10n.wysiwygComposerStartActionVoiceBroadcast
case .polls:
return VectorL10n.wysiwygComposerStartActionPolls
case .location:
@ -80,6 +84,8 @@ extension ComposerCreateAction {
return "stickersAction"
case .attachments:
return "attachmentsAction"
case .voiceBroadcast:
return "voiceBroadcastAction"
case .polls:
return "pollsAction"
case .location:
@ -97,6 +103,8 @@ extension ComposerCreateAction {
return Asset.Images.actionSticker.name
case .attachments:
return Asset.Images.actionFile.name
case .voiceBroadcast:
return Asset.Images.actionLive.name
case .polls:
return Asset.Images.actionPoll.name
case .location: