diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 31b516b7a..aace2bc3c 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -129,6 +129,7 @@ 7B0EFDF4275490EA00FFAAE7 /* ringing.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 7B0EFDF3275490EA00FFAAE7 /* ringing.mp3 */; }; 7B0EFDF62755CC5400FFAAE7 /* CallMissedTipsModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0EFDF52755CC5400FFAAE7 /* CallMissedTipsModal.swift */; }; 7B13E1E92810F01300BD4F64 /* SessionCallManager+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13E1E82810F01300BD4F64 /* SessionCallManager+Action.swift */; }; + 7B13E1EB2811138200BD4F64 /* PrivacySettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B13E1EA2811138200BD4F64 /* PrivacySettingsTableViewController.swift */; }; 7B1581E2271E743B00848B49 /* OWSSounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1581E1271E743B00848B49 /* OWSSounds.swift */; }; 7B1581E4271FC59D00848B49 /* CallModal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1581E3271FC59C00848B49 /* CallModal.swift */; }; 7B1581E6271FD2A100848B49 /* VideoPreviewVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B1581E5271FD2A100848B49 /* VideoPreviewVC.swift */; }; @@ -1117,6 +1118,7 @@ 7B0EFDF3275490EA00FFAAE7 /* ringing.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = ringing.mp3; sourceTree = ""; }; 7B0EFDF52755CC5400FFAAE7 /* CallMissedTipsModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallMissedTipsModal.swift; sourceTree = ""; }; 7B13E1E82810F01300BD4F64 /* SessionCallManager+Action.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SessionCallManager+Action.swift"; sourceTree = ""; }; + 7B13E1EA2811138200BD4F64 /* PrivacySettingsTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacySettingsTableViewController.swift; sourceTree = ""; }; 7B1581E1271E743B00848B49 /* OWSSounds.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OWSSounds.swift; sourceTree = ""; }; 7B1581E3271FC59C00848B49 /* CallModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CallModal.swift; sourceTree = ""; }; 7B1581E5271FD2A100848B49 /* VideoPreviewVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPreviewVC.swift; sourceTree = ""; }; @@ -2923,6 +2925,7 @@ 340FC883204DAC8C007AEB0F /* OWSSoundSettingsViewController.m */, 340FC88F204DAC8C007AEB0F /* PrivacySettingsTableViewController.h */, 340FC87E204DAC8C007AEB0F /* PrivacySettingsTableViewController.m */, + 7B13E1EA2811138200BD4F64 /* PrivacySettingsTableViewController.swift */, B886B4A62398B23E00211ABE /* QRCodeVC.swift */, B86BD08523399CEF000F5AE3 /* SeedModal.swift */, B8CCF6422397711F0091D419 /* SettingsVC.swift */, @@ -4850,6 +4853,7 @@ 452EC6DF205E9E30000E787C /* MediaGalleryViewController.swift in Sources */, 4C1885D2218F8E1C00B67051 /* PhotoGridViewCell.swift in Sources */, 34D1F0501F7D45A60066283D /* GifPickerCell.swift in Sources */, + 7B13E1EB2811138200BD4F64 /* PrivacySettingsTableViewController.swift in Sources */, C3E5C2FA251DBABB0040DFFC /* EditClosedGroupVC.swift in Sources */, 7BAF54D027ACCEEC003D12F8 /* EmptySearchResultCell.swift in Sources */, B8783E9E23EB948D00404FB8 /* UILabel+Interaction.swift in Sources */, @@ -5177,7 +5181,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 341; + CURRENT_PROJECT_VERSION = 342; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = SUQ8J2PCT7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -5250,7 +5254,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 341; + CURRENT_PROJECT_VERSION = 342; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = SUQ8J2PCT7; ENABLE_NS_ASSERTIONS = NO; @@ -5316,7 +5320,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 341; + CURRENT_PROJECT_VERSION = 342; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = SUQ8J2PCT7; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; @@ -5390,7 +5394,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 341; + CURRENT_PROJECT_VERSION = 342; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = SUQ8J2PCT7; ENABLE_NS_ASSERTIONS = NO; @@ -6326,7 +6330,7 @@ CODE_SIGN_ENTITLEMENTS = Session/Meta/Signal.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 341; + CURRENT_PROJECT_VERSION = 342; DEVELOPMENT_TEAM = SUQ8J2PCT7; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -6399,7 +6403,7 @@ CODE_SIGN_ENTITLEMENTS = Session/Meta/Signal.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 341; + CURRENT_PROJECT_VERSION = 342; DEVELOPMENT_TEAM = SUQ8J2PCT7; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 496e965a6..aab08f2e7 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1021,92 +1021,6 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc } } - // MARK: Requesting Permission - func requestCameraPermissionIfNeeded() -> Bool { - switch AVCaptureDevice.authorizationStatus(for: .video) { - case .authorized: return true - case .denied, .restricted: - let modal = PermissionMissingModal(permission: "camera") { } - modal.modalPresentationStyle = .overFullScreen - modal.modalTransitionStyle = .crossDissolve - present(modal, animated: true, completion: nil) - return false - case .notDetermined: - AVCaptureDevice.requestAccess(for: .video, completionHandler: { _ in }) - return false - default: return false - } - } - - func requestMicrophonePermissionIfNeeded(onNotGranted: @escaping () -> Void) { - switch AVAudioSession.sharedInstance().recordPermission { - case .granted: break - case .denied: - onNotGranted() - let modal = PermissionMissingModal(permission: "microphone") { - onNotGranted() - } - modal.modalPresentationStyle = .overFullScreen - modal.modalTransitionStyle = .crossDissolve - present(modal, animated: true, completion: nil) - case .undetermined: - onNotGranted() - AVAudioSession.sharedInstance().requestRecordPermission { _ in } - default: break - } - } - - func requestLibraryPermissionIfNeeded(onAuthorized: @escaping () -> Void) { - let authorizationStatus: PHAuthorizationStatus - if #available(iOS 14, *) { - authorizationStatus = PHPhotoLibrary.authorizationStatus(for: .readWrite) - if authorizationStatus == .notDetermined { - // When the user chooses to select photos (which is the .limit status), - // the PHPhotoUI will present the picker view on the top of the front view. - // Since we have the ScreenLockUI showing when we request premissions, - // the picker view will be presented on the top of the ScreenLockUI. - // However, the ScreenLockUI will dismiss with the permission request alert view, so - // the picker view then will dismiss, too. The selection process cannot be finished - // this way. So we add a flag (isRequestingPermission) to prevent the ScreenLockUI - // from showing when we request the photo library permission. - Environment.shared.isRequestingPermission = true - let appMode = AppModeManager.shared.currentAppMode - // FIXME: Rather than setting the app mode to light and then to dark again once we're done, - // it'd be better to just customize the appearance of the image picker. There doesn't currently - // appear to be a good way to do so though... - AppModeManager.shared.setCurrentAppMode(to: .light) - PHPhotoLibrary.requestAuthorization(for: .readWrite) { status in - DispatchQueue.main.async { - AppModeManager.shared.setCurrentAppMode(to: appMode) - } - Environment.shared.isRequestingPermission = false - if [ PHAuthorizationStatus.authorized, PHAuthorizationStatus.limited ].contains(status) { - onAuthorized() - } - } - } - } else { - authorizationStatus = PHPhotoLibrary.authorizationStatus() - if authorizationStatus == .notDetermined { - PHPhotoLibrary.requestAuthorization { status in - if status == .authorized { - onAuthorized() - } - } - } - } - switch authorizationStatus { - case .authorized, .limited: - onAuthorized() - case .denied, .restricted: - let modal = PermissionMissingModal(permission: "library") { } - modal.modalPresentationStyle = .overFullScreen - modal.modalTransitionStyle = .crossDissolve - present(modal, animated: true, completion: nil) - default: return - } - } - // MARK: - Convenience func showErrorAlert(for attachment: SignalAttachment, onDismiss: (() -> ())?) { let title = NSLocalizedString("ATTACHMENT_ERROR_ALERT_TITLE", comment: "") diff --git a/Session/Settings/PrivacySettingsTableViewController.m b/Session/Settings/PrivacySettingsTableViewController.m index ac0d2735a..b07fbbf7f 100644 --- a/Session/Settings/PrivacySettingsTableViewController.m +++ b/Session/Settings/PrivacySettingsTableViewController.m @@ -294,6 +294,7 @@ static NSString *const kSealedSenderInfoURL = @"https://signal.org/blog/sealed-s [userDefaults setBool:YES forKey:@"hasSeenCallIPExposureWarning"]; CallModal *modal = [[CallModal alloc] initOnCallEnabled:^{ OWSLogInfo(@"toggled to: %@", (enabled ? @"ON" : @"OFF")); + [self objc_requestMicrophonePermissionIfNeeded]; }]; [self presentViewController:modal animated:YES completion:nil]; } else { diff --git a/Session/Settings/PrivacySettingsTableViewController.swift b/Session/Settings/PrivacySettingsTableViewController.swift new file mode 100644 index 000000000..ff07d8018 --- /dev/null +++ b/Session/Settings/PrivacySettingsTableViewController.swift @@ -0,0 +1,6 @@ +extension PrivacySettingsTableViewController { + + @objc func objc_requestMicrophonePermissionIfNeeded() { + requestMicrophonePermissionIfNeeded { } + } +}