diff --git a/Config/BuildSettings.swift b/Config/BuildSettings.swift index 6427878ef..440ba9598 100644 --- a/Config/BuildSettings.swift +++ b/Config/BuildSettings.swift @@ -240,7 +240,7 @@ final class BuildSettings: NSObject { static let settingsScreenShowThreepidExplanatory: Bool = true static let settingsScreenShowDiscoverySettings: Bool = true static let settingsScreenAllowIdentityServerConfig: Bool = true - static let settingsScreenShowConfirmImageSize: Bool = true + static let settingsScreenShowConfirmMediaSize: Bool = true static let settingsScreenShowAdvancedSettings: Bool = true static let settingsScreenShowLabSettings: Bool = true static let settingsScreenAllowChangingRageshakeSettings: Bool = true diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index cd594ffeb..aeb1143e0 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -491,6 +491,7 @@ Tap the + to start adding people."; "settings_three_pids_management_information_part3" = "."; "settings_confirm_image_size" = "Confirm image size before sending"; +"settings_confirm_video_size" = "Confirm video size before sending"; "settings_security" = "SECURITY"; diff --git a/Riot/Generated/Strings.swift b/Riot/Generated/Strings.swift index 8687defa5..97c536dec 100644 --- a/Riot/Generated/Strings.swift +++ b/Riot/Generated/Strings.swift @@ -4082,6 +4082,10 @@ internal enum VectorL10n { internal static var settingsConfirmPassword: String { return VectorL10n.tr("Vector", "settings_confirm_password") } + /// Confirm video size before sending + internal static var settingsConfirmVideoSize: String { + return VectorL10n.tr("Vector", "settings_confirm_video_size") + } /// LOCAL CONTACTS internal static var settingsContacts: String { return VectorL10n.tr("Vector", "settings_contacts") diff --git a/Riot/Managers/Settings/RiotSettings.swift b/Riot/Managers/Settings/RiotSettings.swift index e30e7a422..046948544 100644 --- a/Riot/Managers/Settings/RiotSettings.swift +++ b/Riot/Managers/Settings/RiotSettings.swift @@ -47,12 +47,13 @@ final class RiotSettings: NSObject { static let settingsSecurityScreenShowCryptographyInfo = "settingsSecurityScreenShowCryptographyInfo" static let settingsSecurityScreenShowCryptographyExport = "settingsSecurityScreenShowCryptographyExport" static let settingsSecurityScreenShowAdvancedUnverifiedDevices = "settingsSecurityScreenShowAdvancedBlacklistUnverifiedDevices" - static let roomInputToolbarCompressionMode = "roomInputToolbarCompressionMode" static let roomCreationScreenAllowEncryptionConfiguration = "roomCreationScreenAllowEncryptionConfiguration" static let roomCreationScreenRoomIsEncrypted = "roomCreationScreenRoomIsEncrypted" static let roomCreationScreenAllowRoomTypeConfiguration = "roomCreationScreenAllowRoomTypeConfiguration" static let roomCreationScreenRoomIsPublic = "roomCreationScreenRoomIsPublic" static let allowInviteExernalUsers = "allowInviteExernalUsers" + static let roomInputToolbarCompressionMode = "roomInputToolbarCompressionMode" + static let promptForVideoConversionPreset = "promptForVideoConversionPreset" static let enableRingingForGroupCalls = "enableRingingForGroupCalls" static let roomSettingsScreenShowLowPriorityOption = "roomSettingsScreenShowLowPriorityOption" static let roomSettingsScreenShowDirectChatOption = "roomSettingsScreenShowDirectChatOption" @@ -98,7 +99,8 @@ final class RiotSettings: NSObject { private override init() { super.init() defaults.register(defaults: [ - UserDefaultsKeys.roomInputToolbarCompressionMode: BuildSettings.roomInputToolbarCompressionMode.rawValue + UserDefaultsKeys.roomInputToolbarCompressionMode: BuildSettings.roomInputToolbarCompressionMode.rawValue, + UserDefaultsKeys.promptForVideoConversionPreset: false ]) } @@ -399,16 +401,6 @@ final class RiotSettings: NSObject { defaults.set(newValue, forKey: UserDefaultsKeys.roomMemberScreenShowIgnore) } } - - // MARK: - Room Input Toolbar - var roomInputToolbarCompressionMode: MXKRoomInputToolbarCompressionMode { - get { - MXKRoomInputToolbarCompressionMode(UInt(defaults.integer(forKey: UserDefaultsKeys.roomInputToolbarCompressionMode))) - } set { - defaults.set(newValue.rawValue, forKey: UserDefaultsKeys.roomInputToolbarCompressionMode) - } - } - // MARK: - Room Creation Screen var roomCreationScreenAllowEncryptionConfiguration: Bool { @@ -465,6 +457,23 @@ final class RiotSettings: NSObject { } } + var roomInputToolbarCompressionMode: MXKRoomInputToolbarCompressionMode { + get { + MXKRoomInputToolbarCompressionMode(UInt(defaults.integer(forKey: UserDefaultsKeys.roomInputToolbarCompressionMode))) + } set { + defaults.set(newValue.rawValue, forKey: UserDefaultsKeys.roomInputToolbarCompressionMode) + } + } + + var promptForVideoConversionPreset: Bool { + get { + defaults.bool(forKey: UserDefaultsKeys.promptForVideoConversionPreset) + } set { + defaults.set(newValue, forKey: UserDefaultsKeys.promptForVideoConversionPreset) + } + } + + // MARK: - Main Tabs var homeScreenShowFavouritesTab: Bool { diff --git a/Riot/Modules/Camera/CameraPresenter.swift b/Riot/Modules/Camera/CameraPresenter.swift index a39bda7c0..12373bee9 100644 --- a/Riot/Modules/Camera/CameraPresenter.swift +++ b/Riot/Modules/Camera/CameraPresenter.swift @@ -118,6 +118,7 @@ import AVFoundation imagePickerController.delegate = self imagePickerController.sourceType = UIImagePickerController.SourceType.camera imagePickerController.mediaTypes = mediaTypes + imagePickerController.videoQuality = .typeHigh imagePickerController.allowsEditing = false return imagePickerController diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 106e210c4..815ef9df5 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -126,6 +126,8 @@ #import "TypingUserInfo.h" +#import "MXSDKOptions.h" + #import "Riot-Swift.h" NSNotificationName const RoomCallTileTappedNotification = @"RoomCallTileTappedNotification"; @@ -2004,6 +2006,46 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05; self.documentPickerPresenter = documentPickerPresenter; } +/** + Send a video asset via the room input toolbar prompting the user for the conversion preset to use + if the `promptForVideoConversionPreset` setting has been enabled. + @param videoAsset The video asset to send + @param isPhotoLibraryAsset Whether the asset was picked from the user's photo library. + */ +- (void)sendVideoAsset:(AVAsset *)videoAsset isPhotoLibraryAsset:(BOOL)isPhotoLibraryAsset +{ + RoomInputToolbarView *roomInputToolbarView = [self inputToolbarViewAsRoomInputToolbarView]; + if (!roomInputToolbarView) + { + return; + } + + if (RiotSettings.shared.promptForVideoConversionPreset) + { + // Show the video conversion prompt for the user to select what size video they would like to send. + UIAlertController *compressionPrompt = [MXKTools videoConversionPromptForVideoAsset:videoAsset + withCompletion:^(NSString *presetName) { + // When the preset name is missing, the user cancelled. + if (!presetName) + { + return; + } + + // Set the chosen preset and send the video (conversion takes place in the SDK). + [MXSDKOptions sharedInstance].videoConversionPresetName = presetName; + [roomInputToolbarView sendSelectedVideoAsset:videoAsset isPhotoLibraryAsset:isPhotoLibraryAsset]; + }]; + + [self presentViewController:compressionPrompt animated:YES completion:nil]; + } + else + { + // Otherwise default to 1080p and send the video. + [MXSDKOptions sharedInstance].videoConversionPresetName = AVAssetExportPreset1920x1080; + [roomInputToolbarView sendSelectedVideoAsset:videoAsset isPhotoLibraryAsset:isPhotoLibraryAsset]; + } +} + #pragma mark - Dialpad - (void)openDialpad @@ -6075,12 +6117,8 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05; [cameraPresenter dismissWithAnimated:YES completion:nil]; self.cameraPresenter = nil; - RoomInputToolbarView *roomInputToolbarView = [self inputToolbarViewAsRoomInputToolbarView]; - if (roomInputToolbarView) - { - AVURLAsset *selectedVideo = [AVURLAsset assetWithURL:url]; - [roomInputToolbarView sendSelectedVideoAsset:selectedVideo isPhotoLibraryAsset:NO]; - } + AVURLAsset *selectedVideo = [AVURLAsset assetWithURL:url]; + [self sendVideoAsset:selectedVideo isPhotoLibraryAsset:NO]; } #pragma mark - MediaPickerCoordinatorBridgePresenterDelegate @@ -6108,11 +6146,7 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05; [coordinatorBridgePresenter dismissWithAnimated:YES completion:nil]; self.mediaPickerPresenter = nil; - RoomInputToolbarView *roomInputToolbarView = [self inputToolbarViewAsRoomInputToolbarView]; - if (roomInputToolbarView) - { - [roomInputToolbarView sendSelectedVideoAsset:videoAsset isPhotoLibraryAsset:YES]; - } + [self sendVideoAsset:videoAsset isPhotoLibraryAsset:YES]; } - (void)mediaPickerCoordinatorBridgePresenter:(MediaPickerCoordinatorBridgePresenter *)coordinatorBridgePresenter didSelectAssets:(NSArray *)assets @@ -6123,6 +6157,9 @@ const NSTimeInterval kResizeComposerAnimationDuration = .05; RoomInputToolbarView *roomInputToolbarView = [self inputToolbarViewAsRoomInputToolbarView]; if (roomInputToolbarView) { + // Set a 1080p video conversion preset as compression mode only has an effect on the images. + [MXSDKOptions sharedInstance].videoConversionPresetName = AVAssetExportPreset1920x1080; + [roomInputToolbarView sendSelectedAssets:assets withCompressionMode:RiotSettings.shared.roomInputToolbarCompressionMode]; } } diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 489bdef21..b7a9473bc 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -89,7 +89,8 @@ enum enum { - MEDIA_SETTINGS_CONFIRM_IMAGE_SIZE = 0 + MEDIA_SETTINGS_CONFIRM_IMAGE_SIZE = 0, + MEDIA_SETTINGS_CONFIRM_VIDEO_SIZE }; enum @@ -355,10 +356,11 @@ TableViewSectionsDelegate> sectionUserSettings.headerTitle = NSLocalizedStringFromTable(@"settings_user_settings", @"Vector", nil); [tmpSections addObject:sectionUserSettings]; - if (BuildSettings.settingsScreenShowConfirmImageSize) + if (BuildSettings.settingsScreenShowConfirmMediaSize) { Section *sectionMedia = [Section sectionWithTag:SECTION_TAG_MEDIA]; [sectionMedia addRowWithTag:MEDIA_SETTINGS_CONFIRM_IMAGE_SIZE]; + [sectionMedia addRowWithTag:MEDIA_SETTINGS_CONFIRM_VIDEO_SIZE]; sectionMedia.headerTitle = NSLocalizedStringFromTable(@"settings_media", @"Vector", nil); [tmpSections addObject:sectionMedia]; } @@ -1833,6 +1835,18 @@ TableViewSectionsDelegate> labelAndSwitchCell.mxkSwitch.enabled = YES; [labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleConfirmImageSize:) forControlEvents:UIControlEventTouchUpInside]; + cell = labelAndSwitchCell; + } + else if (row == MEDIA_SETTINGS_CONFIRM_VIDEO_SIZE) + { + MXKTableViewCellWithLabelAndSwitch* labelAndSwitchCell = [self getLabelAndSwitchCell:tableView forIndexPath:indexPath]; + + labelAndSwitchCell.mxkLabel.text = NSLocalizedStringFromTable(@"settings_confirm_video_size", @"Vector", nil); + labelAndSwitchCell.mxkSwitch.on = RiotSettings.shared.promptForVideoConversionPreset; + labelAndSwitchCell.mxkSwitch.onTintColor = ThemeService.shared.theme.tintColor; + labelAndSwitchCell.mxkSwitch.enabled = YES; + [labelAndSwitchCell.mxkSwitch addTarget:self action:@selector(toggleConfirmVideoSize:) forControlEvents:UIControlEventTouchUpInside]; + cell = labelAndSwitchCell; } } @@ -2877,6 +2891,11 @@ TableViewSectionsDelegate> RiotSettings.shared.roomInputToolbarCompressionMode = sender.on ? MXKRoomInputToolbarCompressionModePrompt : MXKRoomInputToolbarCompressionModeNone; } +- (void)toggleConfirmVideoSize:(UISwitch *)sender +{ + RiotSettings.shared.promptForVideoConversionPreset = sender.on; +} + - (void)togglePushNotifications:(UISwitch *)sender { // Check first whether the user allow notification from system settings