From 265659c8cb173ca51ea297423022a3cc405cd605 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Wed, 19 Oct 2022 16:13:21 +1100 Subject: [PATCH 1/6] add accessibility labels for automation test --- Session/Calls/CallVC.swift | 1 + Session/Closed Groups/EditClosedGroupVC.swift | 9 ++++++++ .../Context Menu/ContextMenuVC+Action.swift | 12 +++++++--- .../ContextMenuVC+ActionView.swift | 2 +- .../ConversationVC+Interaction.swift | 4 ++++ Session/Conversations/ConversationVC.swift | 12 +++++++--- .../ExpandingAttachmentsButton.swift | 8 +++---- .../Conversations/Input View/InputView.swift | 18 +++++++++++---- .../Input View/MentionSelectionView.swift | 1 + .../Content Views/MediaPlaceholderView.swift | 2 +- .../Message Cells/VisibleMessageCell.swift | 1 + .../Settings/ThreadSettingsViewModel.swift | 16 ++++++++++++- .../ConversationTitleView.swift | 1 + .../Views & Modals/InfoBanner.swift | 7 +++--- Session/Home/HomeVC.swift | 6 ++--- .../New Conversation/NewConversationVC.swift | 15 ++++++++++-- Session/Home/New Conversation/NewDMVC.swift | 2 ++ .../CropScaleImageViewController.swift | 1 + .../SendMediaNavigationController.swift | 1 + Session/Onboarding/DisplayNameVC.swift | 3 ++- Session/Onboarding/LandingVC.swift | 2 ++ Session/Onboarding/LinkDeviceVC.swift | 3 ++- Session/Onboarding/PNModeVC.swift | 1 + Session/Onboarding/RegisterVC.swift | 3 ++- Session/Onboarding/SeedReminderView.swift | 1 + Session/Onboarding/SeedVC.swift | 2 ++ .../Settings/PrivacySettingsViewModel.swift | 2 ++ Session/Settings/SettingsViewModel.swift | 6 +++-- Session/Shared/Types/SessionCell+Info.swift | 23 ++++++++++++++++++- .../Types/SessionTableViewModel+NavItem.swift | 11 +++++++-- Session/Shared/UserSelectionVC.swift | 5 +++- Session/Shared/Views/SessionAvatarCell.swift | 3 +++ .../Views/SessionCell+AccessoryView.swift | 11 ++++++++- Session/Shared/Views/SessionCell.swift | 7 ++++-- .../Components/ConfirmationModal.swift | 23 +++++++++++++++++++ SignalUtilitiesKit/Utilities/UIView+OWS.swift | 20 ++++++++-------- 36 files changed, 197 insertions(+), 48 deletions(-) diff --git a/Session/Calls/CallVC.swift b/Session/Calls/CallVC.swift index 652c87888..b960976ed 100644 --- a/Session/Calls/CallVC.swift +++ b/Session/Calls/CallVC.swift @@ -111,6 +111,7 @@ final class CallVC: UIViewController, VideoPreviewDelegate { private lazy var hangUpButton: UIButton = { let result = UIButton(type: .custom) + result.accessibilityLabel = "End call button" result.setImage( UIImage(named: "EndCall")? .withRenderingMode(.alwaysTemplate), diff --git a/Session/Closed Groups/EditClosedGroupVC.swift b/Session/Closed Groups/EditClosedGroupVC.swift index 42c150a15..3e00e0a26 100644 --- a/Session/Closed Groups/EditClosedGroupVC.swift +++ b/Session/Closed Groups/EditClosedGroupVC.swift @@ -30,6 +30,7 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat private lazy var groupNameLabel: UILabel = { let result: UILabel = UILabel() + result.accessibilityLabel = "Group name" result.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) result.themeTextColor = .textPrimary result.lineBreakMode = .byTruncatingTail @@ -50,6 +51,7 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat private lazy var addMembersButton: SessionButton = { let result: SessionButton = SessionButton(style: .bordered, size: .medium) + result.accessibilityLabel = "Add members" result.setTitle("vc_conversation_settings_invite_button_title".localized(), for: .normal) result.addTarget(self, action: #selector(addMembers), for: UIControl.Event.touchUpInside) result.contentEdgeInsets = UIEdgeInsets(top: 0, leading: Values.mediumSpacing, bottom: 0, trailing: Values.mediumSpacing) @@ -59,6 +61,7 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat @objc private lazy var tableView: UITableView = { let result: UITableView = UITableView() + result.accessibilityLabel = "Contact" result.dataSource = self result.delegate = self result.separatorStyle = .none @@ -264,6 +267,12 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat } let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDoneButtonTapped)) + if isEditingGroupName { + doneButton.accessibilityLabel = "Accept name change" + } + else { + doneButton.accessibilityLabel = "Apply changes" + } doneButton.themeTintColor = .textPrimary navigationItem.rightBarButtonItem = doneButton } diff --git a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift index 282f90ade..b8f19816b 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift @@ -10,6 +10,7 @@ extension ContextMenuVC { let isEmojiAction: Bool let isEmojiPlus: Bool let isDismissAction: Bool + let accessibilityLabel: String? let work: () -> Void // MARK: - Initialization @@ -20,6 +21,7 @@ extension ContextMenuVC { isEmojiAction: Bool = false, isEmojiPlus: Bool = false, isDismissAction: Bool = false, + accessibilityLabel: String? = nil, work: @escaping () -> Void ) { self.icon = icon @@ -27,6 +29,7 @@ extension ContextMenuVC { self.isEmojiAction = isEmojiAction self.isEmojiPlus = isEmojiPlus self.isDismissAction = isDismissAction + self.accessibilityLabel = accessibilityLabel self.work = work } @@ -35,7 +38,8 @@ extension ContextMenuVC { static func reply(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { return Action( icon: UIImage(named: "ic_reply"), - title: "context_menu_reply".localized() + title: "context_menu_reply".localized(), + accessibilityLabel: "Reply to message" ) { delegate?.reply(cellViewModel) } } @@ -56,14 +60,16 @@ extension ContextMenuVC { static func delete(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { return Action( icon: UIImage(named: "ic_trash"), - title: "TXT_DELETE_TITLE".localized() + title: "TXT_DELETE_TITLE".localized(), + accessibilityLabel: "Delete message" ) { delegate?.delete(cellViewModel) } } static func save(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action { return Action( icon: UIImage(named: "ic_download"), - title: "context_menu_save".localized() + title: "context_menu_save".localized(), + accessibilityLabel: "Save attachment" ) { delegate?.save(cellViewModel) } } diff --git a/Session/Conversations/Context Menu/ContextMenuVC+ActionView.swift b/Session/Conversations/Context Menu/ContextMenuVC+ActionView.swift index 07ebbc5ca..ac061dd5d 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+ActionView.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+ActionView.swift @@ -40,7 +40,7 @@ extension ContextMenuVC { self.dismiss = dismiss super.init(frame: CGRect.zero) - + self.accessibilityLabel = action.accessibilityLabel setUpViewHierarchy() } diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index a0fbbfcb8..a79a92fdd 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -69,6 +69,8 @@ extension ConversationVC: title: "modal_call_permission_request_title".localized(), explanation: "modal_call_permission_request_explanation".localized(), confirmTitle: "vc_settings_title".localized(), + confirmAccessibilityLabel: "Settings", + cancelAccessibilityLabel: "Cancel", dismissOnConfirm: false // Custom dismissal logic ) { [weak self] _ in self?.dismiss(animated: true) { @@ -854,6 +856,8 @@ extension ConversationVC: range: (message as NSString).range(of: cellViewModel.authorName) ), confirmTitle: "modal_download_button_title".localized(), + confirmAccessibilityLabel: "Download media", + cancelAccessibilityLabel: "Don't download media", dismissOnConfirm: false // Custom dismissal logic ) { [weak self] _ in self?.viewModel.trustContact() diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index 620a4c4ea..205c08314 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -191,8 +191,10 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl lazy var blockedBanner: InfoBanner = { let result: InfoBanner = InfoBanner( message: self.viewModel.blockedBannerMessage, - backgroundColor: .danger + backgroundColor: .danger, + messageLabelAccessibilityLabel: "Blocked banner text" ) + result.accessibilityLabel = "Blocked banner" let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(unblock)) result.addGestureRecognizer(tapGestureRecognizer) @@ -240,6 +242,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl private lazy var messageRequestAcceptButton: UIButton = { let result: SessionButton = SessionButton(style: .bordered, size: .medium) + result.accessibilityLabel = "Accept message request" result.translatesAutoresizingMaskIntoConstraints = false result.setTitle("TXT_DELETE_ACCEPT".localized(), for: .normal) result.addTarget(self, action: #selector(acceptMessageRequest), for: .touchUpInside) @@ -249,6 +252,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl private lazy var messageRequestDeleteButton: UIButton = { let result: SessionButton = SessionButton(style: .destructive, size: .medium) + result.accessibilityLabel = "Decline message request" result.translatesAutoresizingMaskIntoConstraints = false result.setTitle("TXT_DECLINE_TITLE".localized(), for: .normal) result.addTarget(self, action: #selector(deleteMessageRequest), for: .touchUpInside) @@ -258,6 +262,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl private lazy var messageRequestBlockButton: UIButton = { let result: UIButton = UIButton() + result.accessibilityLabel = "Block message request" result.translatesAutoresizingMaskIntoConstraints = false result.clipsToBounds = true result.titleLabel?.font = UIFont.boldSystemFont(ofSize: 16) @@ -1036,7 +1041,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl profilePictureView.addGestureRecognizer(tapGestureRecognizer) let settingsButtonItem: UIBarButtonItem = UIBarButtonItem(customView: profilePictureView) - settingsButtonItem.accessibilityLabel = "Settings button" + settingsButtonItem.accessibilityLabel = "More options" settingsButtonItem.isAccessibilityElement = true if SessionCall.isEnabled && !threadData.threadIsNoteToSelf { @@ -1046,6 +1051,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl target: self, action: #selector(startCall) ) + callButton.accessibilityLabel = "Call button" navigationItem.rightBarButtonItems = [settingsButtonItem, callButton] } @@ -1055,7 +1061,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl default: let rightBarButtonItem: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "Gear"), style: .plain, target: self, action: #selector(openSettings)) - rightBarButtonItem.accessibilityLabel = "Settings button" + rightBarButtonItem.accessibilityLabel = "More options" rightBarButtonItem.isAccessibilityElement = true navigationItem.rightBarButtonItems = [rightBarButtonItem] diff --git a/Session/Conversations/Input View/ExpandingAttachmentsButton.swift b/Session/Conversations/Input View/ExpandingAttachmentsButton.swift index f2e983a03..cff2fda71 100644 --- a/Session/Conversations/Input View/ExpandingAttachmentsButton.swift +++ b/Session/Conversations/Input View/ExpandingAttachmentsButton.swift @@ -26,28 +26,28 @@ final class ExpandingAttachmentsButton: UIView, InputViewButtonDelegate { // MARK: UI Components lazy var gifButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_gif_black"), delegate: self, hasOpaqueBackground: true) - result.accessibilityLabel = "accessibility_gif_button".localized() + result.accessibilityLabel = "GIF button" return result }() lazy var gifButtonContainer = container(for: gifButton) lazy var documentButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_document_black"), delegate: self, hasOpaqueBackground: true) - result.accessibilityLabel = "accessibility_document_button".localized() + result.accessibilityLabel = "Documents folder" return result }() lazy var documentButtonContainer = container(for: documentButton) lazy var libraryButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_camera_roll_black"), delegate: self, hasOpaqueBackground: true) - result.accessibilityLabel = "accessibility_library_button".localized() + result.accessibilityLabel = "Images folder" return result }() lazy var libraryButtonContainer = container(for: libraryButton) lazy var cameraButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "actionsheet_camera_black"), delegate: self, hasOpaqueBackground: true) - result.accessibilityLabel = "accessibility_camera_button".localized() + result.accessibilityLabel = "Select camera button" return result }() diff --git a/Session/Conversations/Input View/InputView.swift b/Session/Conversations/Input View/InputView.swift index 8fd6d99f6..5139a2379 100644 --- a/Session/Conversations/Input View/InputView.swift +++ b/Session/Conversations/Input View/InputView.swift @@ -50,12 +50,16 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M // MARK: - UI private var bottomStackView: UIStackView? - private lazy var attachmentsButton = ExpandingAttachmentsButton(delegate: delegate) + private lazy var attachmentsButton: ExpandingAttachmentsButton = { + let result = ExpandingAttachmentsButton(delegate: delegate) + result.accessibilityLabel = "Attachments button" + + return result + }() private lazy var voiceMessageButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "Microphone"), delegate: self) - result.accessibilityLabel = "VOICE_MESSAGE_TOO_SHORT_ALERT_TITLE".localized() - result.accessibilityHint = "VOICE_MESSAGE_TOO_SHORT_ALERT_MESSAGE".localized() + result.accessibilityLabel = "New voice message" return result }() @@ -63,7 +67,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M private lazy var sendButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "ArrowUp"), isSendButton: true, delegate: self) result.isHidden = true - result.accessibilityLabel = "ATTACHMENT_APPROVAL_SEND_BUTTON".localized() + result.accessibilityLabel = "Send message button" return result }() @@ -78,6 +82,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M private lazy var mentionsViewContainer: UIView = { let result: UIView = UIView() + result.accessibilityLabel = "Mentions list" result.alpha = 0 let backgroundView = UIView() @@ -107,7 +112,10 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M // setUpViewHierarchy() for why these values are the way they are. let adjustment = (InputViewButton.expandedSize - InputViewButton.size) / 2 let maxWidth = UIScreen.main.bounds.width - 2 * InputViewButton.expandedSize - 2 * Values.smallSpacing - 2 * (Values.mediumSpacing - adjustment) - return InputTextView(delegate: self, maxWidth: maxWidth) + let result = InputTextView(delegate: self, maxWidth: maxWidth) + result.accessibilityLabel = "Message input box" + + return result }() private lazy var disabledInputLabel: UILabel = { diff --git a/Session/Conversations/Input View/MentionSelectionView.swift b/Session/Conversations/Input View/MentionSelectionView.swift index 70ceb6b4f..881059cc3 100644 --- a/Session/Conversations/Input View/MentionSelectionView.swift +++ b/Session/Conversations/Input View/MentionSelectionView.swift @@ -24,6 +24,7 @@ final class MentionSelectionView: UIView, UITableViewDataSource, UITableViewDele private lazy var tableView: UITableView = { let result: UITableView = UITableView() + result.accessibilityLabel = "Contact" result.dataSource = self result.delegate = self result.separatorStyle = .none diff --git a/Session/Conversations/Message Cells/Content Views/MediaPlaceholderView.swift b/Session/Conversations/Message Cells/Content Views/MediaPlaceholderView.swift index 09939731c..754ded084 100644 --- a/Session/Conversations/Message Cells/Content Views/MediaPlaceholderView.swift +++ b/Session/Conversations/Message Cells/Content Views/MediaPlaceholderView.swift @@ -12,7 +12,7 @@ final class MediaPlaceholderView: UIView { init(cellViewModel: MessageViewModel, textColor: ThemeValue) { super.init(frame: CGRect.zero) - + self.accessibilityLabel = "Untrusted attachment message" setUpViewHierarchy(cellViewModel: cellViewModel, textColor: textColor) } diff --git a/Session/Conversations/Message Cells/VisibleMessageCell.swift b/Session/Conversations/Message Cells/VisibleMessageCell.swift index 84e3004ed..a7285d316 100644 --- a/Session/Conversations/Message Cells/VisibleMessageCell.swift +++ b/Session/Conversations/Message Cells/VisibleMessageCell.swift @@ -144,6 +144,7 @@ final class VisibleMessageCell: MessageCell, TappableLabelDelegate { internal lazy var messageStatusImageView: UIImageView = { let result = UIImageView() + result.accessibilityLabel = "Message sent status tick" result.contentMode = .scaleAspectFit result.layer.cornerRadius = VisibleMessageCell.messageStatusImageViewSize / 2 result.layer.masksToBounds = true diff --git a/Session/Conversations/Settings/ThreadSettingsViewModel.swift b/Session/Conversations/Settings/ThreadSettingsViewModel.swift index e771e26fb..178a5ea03 100644 --- a/Session/Conversations/Settings/ThreadSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadSettingsViewModel.swift @@ -151,7 +151,8 @@ class ThreadSettingsViewModel: SessionTableViewModel Void)? @@ -41,6 +44,9 @@ extension SessionCell { isEnabled: Bool = true, shouldHaveBackground: Bool = true, accessibilityIdentifier: String? = nil, + accessibilityLabel: String? = nil, + leftAccessoryAccessibilityLabel: String? = nil, + rightAccessoryAccessibilityLabel: String? = nil, confirmationInfo: ConfirmationModal.Info? = nil, onTap: ((UIView?) -> Void)? ) { @@ -55,6 +61,9 @@ extension SessionCell { self.isEnabled = isEnabled self.shouldHaveBackground = shouldHaveBackground self.accessibilityIdentifier = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel + self.leftAccessoryAccessibilityLabel = leftAccessoryAccessibilityLabel + self.rightAccessoryAccessibilityLabel = rightAccessoryAccessibilityLabel self.confirmationInfo = confirmationInfo self.onTap = onTap } @@ -71,6 +80,9 @@ extension SessionCell { isEnabled: Bool = true, shouldHaveBackground: Bool = true, accessibilityIdentifier: String? = nil, + accessibilityLabel: String? = nil, + leftAccessoryAccessibilityLabel: String? = nil, + rightAccessoryAccessibilityLabel: String? = nil, confirmationInfo: ConfirmationModal.Info? = nil, onTap: (() -> Void)? = nil ) { @@ -85,6 +97,9 @@ extension SessionCell { self.isEnabled = isEnabled self.shouldHaveBackground = shouldHaveBackground self.accessibilityIdentifier = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel + self.leftAccessoryAccessibilityLabel = leftAccessoryAccessibilityLabel + self.rightAccessoryAccessibilityLabel = rightAccessoryAccessibilityLabel self.confirmationInfo = confirmationInfo self.onTap = (onTap != nil ? { _ in onTap?() } : nil) } @@ -104,6 +119,9 @@ extension SessionCell { isEnabled.hash(into: &hasher) shouldHaveBackground.hash(into: &hasher) accessibilityIdentifier.hash(into: &hasher) + accessibilityLabel.hash(into: &hasher) + leftAccessoryAccessibilityLabel.hash(into: &hasher) + rightAccessoryAccessibilityLabel.hash(into: &hasher) confirmationInfo.hash(into: &hasher) } @@ -118,7 +136,10 @@ extension SessionCell { lhs.extraAction == rhs.extraAction && lhs.isEnabled == rhs.isEnabled && lhs.shouldHaveBackground == rhs.shouldHaveBackground && - lhs.accessibilityIdentifier == rhs.accessibilityIdentifier + lhs.accessibilityIdentifier == rhs.accessibilityIdentifier && + lhs.accessibilityLabel == rhs.accessibilityLabel && + lhs.leftAccessoryAccessibilityLabel == rhs.leftAccessoryAccessibilityLabel && + lhs.rightAccessoryAccessibilityLabel == rhs.rightAccessoryAccessibilityLabel ) } } diff --git a/Session/Shared/Types/SessionTableViewModel+NavItem.swift b/Session/Shared/Types/SessionTableViewModel+NavItem.swift index b1eb7714b..17efd8153 100644 --- a/Session/Shared/Types/SessionTableViewModel+NavItem.swift +++ b/Session/Shared/Types/SessionTableViewModel+NavItem.swift @@ -12,6 +12,7 @@ extension SessionTableViewModel { let style: UIBarButtonItem.Style let systemItem: UIBarButtonItem.SystemItem? let accessibilityIdentifier: String + let accessibilityLabel: String? let action: (() -> Void)? // MARK: - Initialization @@ -20,6 +21,7 @@ extension SessionTableViewModel { id: NavItemId, systemItem: UIBarButtonItem.SystemItem?, accessibilityIdentifier: String, + accessibilityLabel: String? = nil, action: (() -> Void)? = nil ) { self.id = id @@ -27,6 +29,7 @@ extension SessionTableViewModel { self.style = .plain self.systemItem = systemItem self.accessibilityIdentifier = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel self.action = action } @@ -35,6 +38,7 @@ extension SessionTableViewModel { image: UIImage?, style: UIBarButtonItem.Style, accessibilityIdentifier: String, + accessibilityLabel: String? = nil, action: (() -> Void)? = nil ) { self.id = id @@ -42,6 +46,7 @@ extension SessionTableViewModel { self.style = style self.systemItem = nil self.accessibilityIdentifier = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel self.action = action } @@ -54,7 +59,8 @@ extension SessionTableViewModel { style: style, target: nil, action: nil, - accessibilityIdentifier: accessibilityIdentifier + accessibilityIdentifier: accessibilityIdentifier, + accessibilityLabel: accessibilityLabel ) } @@ -62,7 +68,8 @@ extension SessionTableViewModel { barButtonSystemItem: systemItem, target: nil, action: nil, - accessibilityIdentifier: accessibilityIdentifier + accessibilityIdentifier: accessibilityIdentifier, + accessibilityLabel: accessibilityLabel ) } diff --git a/Session/Shared/UserSelectionVC.swift b/Session/Shared/UserSelectionVC.swift index 3bbc97ab4..808fb542d 100644 --- a/Session/Shared/UserSelectionVC.swift +++ b/Session/Shared/UserSelectionVC.swift @@ -48,7 +48,10 @@ final class UserSelectionVC: BaseVC, UITableViewDataSource, UITableViewDelegate setNavBarTitle(navBarTitle) - navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDoneButtonTapped)) + let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(handleDoneButtonTapped)) + doneButton.accessibilityLabel = "Done" + navigationItem.rightBarButtonItem = doneButton + view.addSubview(tableView) tableView.pin(to: view) } diff --git a/Session/Shared/Views/SessionAvatarCell.swift b/Session/Shared/Views/SessionAvatarCell.swift index 8016641bb..c6166a0bf 100644 --- a/Session/Shared/Views/SessionAvatarCell.swift +++ b/Session/Shared/Views/SessionAvatarCell.swift @@ -52,6 +52,7 @@ class SessionAvatarCell: UITableViewCell { fileprivate let profilePictureView: ProfilePictureView = { let view: ProfilePictureView = ProfilePictureView() + view.accessibilityLabel = "Profile picture" view.translatesAutoresizingMaskIntoConstraints = false view.size = Values.largeProfilePictureSize @@ -69,6 +70,7 @@ class SessionAvatarCell: UITableViewCell { private lazy var displayNameLabel: UILabel = { let label: UILabel = UILabel() + label.accessibilityLabel = "Username" label.translatesAutoresizingMaskIntoConstraints = false label.font = .ows_mediumFont(withSize: Values.veryLargeFontSize) label.themeTextColor = .textPrimary @@ -98,6 +100,7 @@ class SessionAvatarCell: UITableViewCell { private let descriptionLabel: SRCopyableLabel = { let label: SRCopyableLabel = SRCopyableLabel() + label.accessibilityLabel = "Session ID" label.translatesAutoresizingMaskIntoConstraints = false label.themeTextColor = .textPrimary label.textAlignment = .center diff --git a/Session/Shared/Views/SessionCell+AccessoryView.swift b/Session/Shared/Views/SessionCell+AccessoryView.swift index c904af354..dffda5793 100644 --- a/Session/Shared/Views/SessionCell+AccessoryView.swift +++ b/Session/Shared/Views/SessionCell+AccessoryView.swift @@ -225,7 +225,8 @@ extension SessionCell { public func update( with accessory: Accessory?, tintColor: ThemeValue, - isEnabled: Bool + isEnabled: Bool, + accessibilityLabel: String? ) { guard let accessory: Accessory = accessory else { return } @@ -234,6 +235,7 @@ extension SessionCell { switch accessory { case .icon(let image, let iconSize, let customTint, let shouldFill): + imageView.accessibilityLabel = accessibilityLabel imageView.image = image imageView.themeTintColor = (customTint ?? tintColor) imageView.contentMode = (shouldFill ? .scaleAspectFill : .scaleAspectFit) @@ -256,6 +258,7 @@ extension SessionCell { case .iconAsync(let iconSize, let customTint, let shouldFill, let setter): setter(imageView) + imageView.accessibilityLabel = accessibilityLabel imageView.themeTintColor = (customTint ?? tintColor) imageView.contentMode = (shouldFill ? .scaleAspectFill : .scaleAspectFit) imageView.isHidden = false @@ -276,6 +279,7 @@ extension SessionCell { imageViewConstraints.forEach { $0.isActive = true } case .toggle(let dataSource): + toggleSwitch.accessibilityLabel = accessibilityLabel toggleSwitch.isHidden = false toggleSwitch.isEnabled = isEnabled toggleSwitchConstraints.forEach { $0.isActive = true } @@ -287,6 +291,7 @@ extension SessionCell { } case .dropDown(let dataSource): + dropDownLabel.accessibilityLabel = accessibilityLabel dropDownLabel.text = dataSource.currentStringValue dropDownStackView.isHidden = false dropDownStackViewConstraints.forEach { $0.isActive = true } @@ -302,6 +307,7 @@ extension SessionCell { ) radioBorderView.layer.cornerRadius = (size.borderSize / 2) + radioView.accessibilityLabel = accessibilityLabel radioView.alpha = (wasOldSelection ? 0.3 : 1) radioView.isHidden = (!isSelected && !storedSelection) radioView.themeBackgroundColor = (isSelected || wasOldSelection ? @@ -322,12 +328,14 @@ extension SessionCell { radioBorderViewConstraints.forEach { $0.isActive = true } case .highlightingBackgroundLabel(let title): + highlightingBackgroundLabel.accessibilityLabel = accessibilityLabel highlightingBackgroundLabel.text = title highlightingBackgroundLabel.themeTextColor = tintColor highlightingBackgroundLabel.isHidden = false highlightingBackgroundLabelConstraints.forEach { $0.isActive = true } case .profile(let profileId, let profile): + profilePictureView.accessibilityLabel = accessibilityLabel profilePictureView.update( publicKey: profileId, profile: profile, @@ -338,6 +346,7 @@ extension SessionCell { case .customView(let viewGenerator): let generatedView: UIView = viewGenerator() + generatedView.accessibilityLabel = accessibilityLabel addSubview(generatedView) generatedView.pin(.top, to: .top, of: self) diff --git a/Session/Shared/Views/SessionCell.swift b/Session/Shared/Views/SessionCell.swift index 0cc4c6a4a..3cef4932b 100644 --- a/Session/Shared/Views/SessionCell.swift +++ b/Session/Shared/Views/SessionCell.swift @@ -308,6 +308,7 @@ public class SessionCell: UITableViewCell { self.subtitleExtraView = info.subtitleExtraViewGenerator?() self.onExtraActionTap = info.extraAction?.onTap self.accessibilityIdentifier = info.accessibilityIdentifier + self.accessibilityLabel = info.accessibilityLabel let leftFitToEdge: Bool = (info.leftAccessory?.shouldFitToEdge == true) let rightFitToEdge: Bool = (!leftFitToEdge && info.rightAccessory?.shouldFitToEdge == true) @@ -315,12 +316,14 @@ public class SessionCell: UITableViewCell { leftAccessoryView.update( with: info.leftAccessory, tintColor: info.tintColor, - isEnabled: info.isEnabled + isEnabled: info.isEnabled, + accessibilityLabel: info.leftAccessoryAccessibilityLabel ) rightAccessoryView.update( with: info.rightAccessory, tintColor: info.tintColor, - isEnabled: info.isEnabled + isEnabled: info.isEnabled, + accessibilityLabel: info.rightAccessoryAccessibilityLabel ) rightAccessoryFillConstraint.isActive = rightFitToEdge contentStackView.layoutMargins = UIEdgeInsets( diff --git a/SessionUIKit/Components/ConfirmationModal.swift b/SessionUIKit/Components/ConfirmationModal.swift index 5c75e5851..e588fd361 100644 --- a/SessionUIKit/Components/ConfirmationModal.swift +++ b/SessionUIKit/Components/ConfirmationModal.swift @@ -21,10 +21,13 @@ public class ConfirmationModal: Modal { let title: String let explanation: String? let attributedExplanation: NSAttributedString? + let accessibilityLabel: String? public let stateToShow: State let confirmTitle: String? + let confirmAccessibilityLabel: String? let confirmStyle: ThemeValue let cancelTitle: String + let cancelAccessibilityLabel: String? let cancelStyle: ThemeValue let dismissOnConfirm: Bool let onConfirm: ((UIViewController) -> ())? @@ -36,10 +39,13 @@ public class ConfirmationModal: Modal { title: String, explanation: String? = nil, attributedExplanation: NSAttributedString? = nil, + accessibilityLabel: String? = nil, stateToShow: State = .always, confirmTitle: String? = nil, + confirmAccessibilityLabel: String? = nil, confirmStyle: ThemeValue = .alert_text, cancelTitle: String = "TXT_CANCEL_TITLE".localized(), + cancelAccessibilityLabel: String? = nil, cancelStyle: ThemeValue = .danger, dismissOnConfirm: Bool = true, onConfirm: ((UIViewController) -> ())? = nil, @@ -48,10 +54,13 @@ public class ConfirmationModal: Modal { self.title = title self.explanation = explanation self.attributedExplanation = attributedExplanation + self.accessibilityLabel = accessibilityLabel self.stateToShow = stateToShow self.confirmTitle = confirmTitle + self.confirmAccessibilityLabel = confirmAccessibilityLabel self.confirmStyle = confirmStyle self.cancelTitle = cancelTitle + self.cancelAccessibilityLabel = cancelAccessibilityLabel self.cancelStyle = cancelStyle self.dismissOnConfirm = dismissOnConfirm self.onConfirm = onConfirm @@ -67,10 +76,14 @@ public class ConfirmationModal: Modal { return Info( title: self.title, explanation: self.explanation, + attributedExplanation: self.attributedExplanation, + accessibilityLabel: self.accessibilityLabel, stateToShow: self.stateToShow, confirmTitle: self.confirmTitle, + confirmAccessibilityLabel: self.confirmAccessibilityLabel, confirmStyle: self.confirmStyle, cancelTitle: self.cancelTitle, + cancelAccessibilityLabel: self.cancelAccessibilityLabel, cancelStyle: self.cancelStyle, dismissOnConfirm: self.dismissOnConfirm, onConfirm: (onConfirm ?? self.onConfirm), @@ -85,10 +98,13 @@ public class ConfirmationModal: Modal { lhs.title == rhs.title && lhs.explanation == rhs.explanation && lhs.attributedExplanation == rhs.attributedExplanation && + lhs.accessibilityLabel == rhs.accessibilityLabel && lhs.stateToShow == rhs.stateToShow && lhs.confirmTitle == rhs.confirmTitle && + lhs.confirmAccessibilityLabel == rhs.confirmAccessibilityLabel && lhs.confirmStyle == rhs.confirmStyle && lhs.cancelTitle == rhs.cancelTitle && + lhs.cancelAccessibilityLabel == rhs.cancelAccessibilityLabel && lhs.cancelStyle == rhs.cancelStyle && lhs.dismissOnConfirm == rhs.dismissOnConfirm ) @@ -98,10 +114,13 @@ public class ConfirmationModal: Modal { title.hash(into: &hasher) explanation.hash(into: &hasher) attributedExplanation.hash(into: &hasher) + accessibilityLabel.hash(into: &hasher) stateToShow.hash(into: &hasher) confirmTitle.hash(into: &hasher) + confirmAccessibilityLabel.hash(into: &hasher) confirmStyle.hash(into: &hasher) cancelTitle.hash(into: &hasher) + cancelAccessibilityLabel.hash(into: &hasher) cancelStyle.hash(into: &hasher) dismissOnConfirm.hash(into: &hasher) } @@ -207,11 +226,15 @@ public class ConfirmationModal: Modal { info.explanation == nil && info.attributedExplanation == nil ) + confirmButton.accessibilityLabel = info.confirmAccessibilityLabel confirmButton.setTitle(info.confirmTitle, for: .normal) confirmButton.setThemeTitleColor(info.confirmStyle, for: .normal) confirmButton.isHidden = (info.confirmTitle == nil) + cancelButton.accessibilityLabel = info.cancelAccessibilityLabel cancelButton.setTitle(info.cancelTitle, for: .normal) cancelButton.setThemeTitleColor(info.cancelStyle, for: .normal) + + self.accessibilityLabel = info.accessibilityLabel } required init?(coder: NSCoder) { diff --git a/SignalUtilitiesKit/Utilities/UIView+OWS.swift b/SignalUtilitiesKit/Utilities/UIView+OWS.swift index a2a257324..b3a9978e4 100644 --- a/SignalUtilitiesKit/Utilities/UIView+OWS.swift +++ b/SignalUtilitiesKit/Utilities/UIView+OWS.swift @@ -291,43 +291,43 @@ public extension UIBezierPath { @objc public extension UIBarButtonItem { - convenience init(image: UIImage?, style: UIBarButtonItem.Style, target: Any?, action: Selector?, accessibilityIdentifier: String) { + convenience init(image: UIImage?, style: UIBarButtonItem.Style, target: Any?, action: Selector?, accessibilityIdentifier: String, accessibilityLabel: String? = nil) { self.init(image: image, style: style, target: target, action: action) self.accessibilityIdentifier = accessibilityIdentifier - self.accessibilityLabel = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel == nil ? accessibilityIdentifier : accessibilityLabel self.isAccessibilityElement = true } - convenience init(image: UIImage?, landscapeImagePhone: UIImage?, style: UIBarButtonItem.Style, target: Any?, action: Selector?, accessibilityIdentifier: String) { + convenience init(image: UIImage?, landscapeImagePhone: UIImage?, style: UIBarButtonItem.Style, target: Any?, action: Selector?, accessibilityIdentifier: String, accessibilityLabel: String? = nil) { self.init(image: image, landscapeImagePhone: landscapeImagePhone, style: style, target: target, action: action) self.accessibilityIdentifier = accessibilityIdentifier - self.accessibilityLabel = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel == nil ? accessibilityIdentifier : accessibilityLabel self.isAccessibilityElement = true } - convenience init(title: String?, style: UIBarButtonItem.Style, target: Any?, action: Selector?, accessibilityIdentifier: String) { + convenience init(title: String?, style: UIBarButtonItem.Style, target: Any?, action: Selector?, accessibilityIdentifier: String, accessibilityLabel: String? = nil) { self.init(title: title, style: style, target: target, action: action) self.accessibilityIdentifier = accessibilityIdentifier - self.accessibilityLabel = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel == nil ? accessibilityIdentifier : accessibilityLabel self.isAccessibilityElement = true } - convenience init(barButtonSystemItem systemItem: UIBarButtonItem.SystemItem, target: Any?, action: Selector?, accessibilityIdentifier: String) { + convenience init(barButtonSystemItem systemItem: UIBarButtonItem.SystemItem, target: Any?, action: Selector?, accessibilityIdentifier: String, accessibilityLabel: String? = nil) { self.init(barButtonSystemItem: systemItem, target: target, action: action) self.accessibilityIdentifier = accessibilityIdentifier - self.accessibilityLabel = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel == nil ? accessibilityIdentifier : accessibilityLabel self.isAccessibilityElement = true } - convenience init(customView: UIView, accessibilityIdentifier: String) { + convenience init(customView: UIView, accessibilityIdentifier: String, accessibilityLabel: String? = nil) { self.init(customView: customView) self.accessibilityIdentifier = accessibilityIdentifier - self.accessibilityLabel = accessibilityIdentifier + self.accessibilityLabel = accessibilityLabel == nil ? accessibilityIdentifier : accessibilityLabel self.isAccessibilityElement = true } } From 2159ec149e5a905b7a8713d3fd709c7e60adaa4a Mon Sep 17 00:00:00 2001 From: Emily Date: Mon, 14 Nov 2022 13:54:33 -1000 Subject: [PATCH 2/6] adding accessibility ids and label to extract session id and recovery phrase and adding ids for message requests workflow --- Session/Conversations/ConversationVC.swift | 3 +++ Session/Conversations/Input View/InputView.swift | 5 +++++ Session/Home/HomeVC.swift | 4 ++++ .../Message Requests/MessageRequestsViewController.swift | 2 ++ Session/Home/New Conversation/NewConversationVC.swift | 4 +++- Session/Home/New Conversation/NewDMVC.swift | 4 +++- Session/Onboarding/DisplayNameVC.swift | 1 + Session/Onboarding/RegisterVC.swift | 7 +++++++ Session/Onboarding/SeedReminderView.swift | 1 + Session/Onboarding/SeedVC.swift | 5 ++++- Session/Settings/SettingsViewModel.swift | 3 +++ Session/Shared/Views/SessionAvatarCell.swift | 2 ++ 12 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index 205c08314..57f7b71be 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -195,6 +195,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl messageLabelAccessibilityLabel: "Blocked banner text" ) result.accessibilityLabel = "Blocked banner" + result.isAccessibilityElement = true let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(unblock)) result.addGestureRecognizer(tapGestureRecognizer) @@ -243,6 +244,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl private lazy var messageRequestAcceptButton: UIButton = { let result: SessionButton = SessionButton(style: .bordered, size: .medium) result.accessibilityLabel = "Accept message request" + result.isAccessibilityElement = true result.translatesAutoresizingMaskIntoConstraints = false result.setTitle("TXT_DELETE_ACCEPT".localized(), for: .normal) result.addTarget(self, action: #selector(acceptMessageRequest), for: .touchUpInside) @@ -253,6 +255,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl private lazy var messageRequestDeleteButton: UIButton = { let result: SessionButton = SessionButton(style: .destructive, size: .medium) result.accessibilityLabel = "Decline message request" + result.isAccessibilityElement = true result.translatesAutoresizingMaskIntoConstraints = false result.setTitle("TXT_DECLINE_TITLE".localized(), for: .normal) result.addTarget(self, action: #selector(deleteMessageRequest), for: .touchUpInside) diff --git a/Session/Conversations/Input View/InputView.swift b/Session/Conversations/Input View/InputView.swift index 5139a2379..b1b40c892 100644 --- a/Session/Conversations/Input View/InputView.swift +++ b/Session/Conversations/Input View/InputView.swift @@ -53,6 +53,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M private lazy var attachmentsButton: ExpandingAttachmentsButton = { let result = ExpandingAttachmentsButton(delegate: delegate) result.accessibilityLabel = "Attachments button" + result.isAccessibilityElement = true return result }() @@ -60,6 +61,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M private lazy var voiceMessageButton: InputViewButton = { let result = InputViewButton(icon: #imageLiteral(resourceName: "Microphone"), delegate: self) result.accessibilityLabel = "New voice message" + result.isAccessibilityElement = true return result }() @@ -68,6 +70,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M let result = InputViewButton(icon: #imageLiteral(resourceName: "ArrowUp"), isSendButton: true, delegate: self) result.isHidden = true result.accessibilityLabel = "Send message button" + result.isAccessibilityElement = true return result }() @@ -83,6 +86,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M private lazy var mentionsViewContainer: UIView = { let result: UIView = UIView() result.accessibilityLabel = "Mentions list" + result.isAccessibilityElement = true result.alpha = 0 let backgroundView = UIView() @@ -114,6 +118,7 @@ final class InputView: UIView, InputViewButtonDelegate, InputTextViewDelegate, M let maxWidth = UIScreen.main.bounds.width - 2 * InputViewButton.expandedSize - 2 * Values.smallSpacing - 2 * (Values.mediumSpacing - adjustment) let result = InputTextView(delegate: self, maxWidth: maxWidth) result.accessibilityLabel = "Message input box" + result.isAccessibilityElement = true return result }() diff --git a/Session/Home/HomeVC.swift b/Session/Home/HomeVC.swift index edc7b9817..7675c350d 100644 --- a/Session/Home/HomeVC.swift +++ b/Session/Home/HomeVC.swift @@ -109,6 +109,7 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi let button = UIButton() button.accessibilityLabel = "New conversation button" + button.isAccessibilityElement = true button.clipsToBounds = true button.setImage( UIImage(named: "Plus")? @@ -466,6 +467,7 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi let profilePictureSize = Values.verySmallProfilePictureSize let profilePictureView = ProfilePictureView() profilePictureView.accessibilityLabel = "User settings" + profilePictureView.isAccessibilityElement = true profilePictureView.size = profilePictureSize profilePictureView.update( publicKey: getUserHexEncodedPublicKey(), @@ -521,6 +523,8 @@ final class HomeVC: BaseVC, UITableViewDataSource, UITableViewDelegate, SeedRemi case .messageRequests: let threadViewModel: SessionThreadViewModel = section.elements[indexPath.row] let cell: MessageRequestsCell = tableView.dequeue(type: MessageRequestsCell.self, for: indexPath) + cell.accessibilityIdentifier = "Message requests banner" + cell.isAccessibilityElement = true cell.update(with: Int(threadViewModel.threadUnreadCount ?? 0)) return cell diff --git a/Session/Home/Message Requests/MessageRequestsViewController.swift b/Session/Home/Message Requests/MessageRequestsViewController.swift index b64ccfdc7..4d6bada96 100644 --- a/Session/Home/Message Requests/MessageRequestsViewController.swift +++ b/Session/Home/Message Requests/MessageRequestsViewController.swift @@ -311,6 +311,8 @@ class MessageRequestsViewController: BaseVC, UITableViewDelegate, UITableViewDat case .threads: let threadViewModel: SessionThreadViewModel = section.elements[indexPath.row] let cell: FullConversationCell = tableView.dequeue(type: FullConversationCell.self, for: indexPath) + cell.accessibilityIdentifier = "Message request" + cell.isAccessibilityElement = true cell.update(with: threadViewModel) return cell diff --git a/Session/Home/New Conversation/NewConversationVC.swift b/Session/Home/New Conversation/NewConversationVC.swift index 620f570d5..0e739dbfe 100644 --- a/Session/Home/New Conversation/NewConversationVC.swift +++ b/Session/Home/New Conversation/NewConversationVC.swift @@ -16,7 +16,8 @@ final class NewConversationVC: BaseVC, ThemedNavigation, UITableViewDelegate, UI private lazy var newDMButton: NewConversationButton = { let result = NewConversationButton(icon: #imageLiteral(resourceName: "Message"), title: "vc_create_private_chat_title".localized()) - result.accessibilityLabel = "New direct message" + result.accessibilityIdentifier = "New direct message" + result.isAccessibilityElement = true return result }() @@ -24,6 +25,7 @@ final class NewConversationVC: BaseVC, ThemedNavigation, UITableViewDelegate, UI private lazy var newGroupButton: NewConversationButton = { let result = NewConversationButton(icon: #imageLiteral(resourceName: "Group"), title: "vc_create_closed_group_title".localized()) result.accessibilityLabel = "Create group" + result.isAccessibilityElement = true return result }() diff --git a/Session/Home/New Conversation/NewDMVC.swift b/Session/Home/New Conversation/NewDMVC.swift index 83efc25bd..a98af6d99 100644 --- a/Session/Home/New Conversation/NewDMVC.swift +++ b/Session/Home/New Conversation/NewDMVC.swift @@ -382,13 +382,15 @@ private final class EnterPublicKeyVC: UIViewController { ) result.alpha = (isKeyboardShowing ? 1 : 0) result.isHidden = !isKeyboardShowing - + result.accessibilityLabel = "Next" + result.isAccessibilityElement = true return result }() private lazy var nextButton: SessionButton = { let result = SessionButton(style: .bordered, size: .large) result.accessibilityLabel = "Next" + result.isAccessibilityElement = true result.setTitle("next".localized(), for: .normal) result.isEnabled = false result.addTarget(self, action: #selector(startNewDMIfPossible), for: .touchUpInside) diff --git a/Session/Onboarding/DisplayNameVC.swift b/Session/Onboarding/DisplayNameVC.swift index 8b83d7416..cf0fc7028 100644 --- a/Session/Onboarding/DisplayNameVC.swift +++ b/Session/Onboarding/DisplayNameVC.swift @@ -16,6 +16,7 @@ final class DisplayNameVC: BaseVC { private lazy var displayNameTextField: TextField = { let result = TextField(placeholder: "vc_display_name_text_field_hint".localized()) result.accessibilityLabel = "Enter display name" + result.isAccessibilityElement = true result.themeBorderColor = .textPrimary return result diff --git a/Session/Onboarding/RegisterVC.swift b/Session/Onboarding/RegisterVC.swift index a89fda8f1..e99dc4e2b 100644 --- a/Session/Onboarding/RegisterVC.swift +++ b/Session/Onboarding/RegisterVC.swift @@ -18,6 +18,7 @@ final class RegisterVC : BaseVC { result.font = Fonts.spaceMono(ofSize: isIPhone5OrSmaller ? Values.mediumFontSize : 20) result.themeTextColor = .textPrimary result.accessibilityLabel = "Session ID" + result.isAccessibilityElement = true result.lineBreakMode = .byCharWrapping result.numberOfLines = 0 @@ -26,6 +27,8 @@ final class RegisterVC : BaseVC { private lazy var copyPublicKeyButton: SessionButton = { let result = SessionButton(style: .bordered, size: .large) + result.accessibilityLabel = "Copy" + result.isAccessibilityElement = true result.setTitle("copy".localized(), for: .normal) result.addTarget(self, action: #selector(copyPublicKey), for: .touchUpInside) @@ -168,6 +171,8 @@ final class RegisterVC : BaseVC { private func updatePublicKeyLabel() { let hexEncodedPublicKey = x25519KeyPair.hexEncodedPublicKey + publicKeyLabel.accessibilityLabel = hexEncodedPublicKey + publicKeyLabel.accessibilityIdentifier = "Session ID generated" let characterCount = hexEncodedPublicKey.count var count = 0 let limit = 32 @@ -203,6 +208,8 @@ final class RegisterVC : BaseVC { @objc private func copyPublicKey() { UIPasteboard.general.string = x25519KeyPair.hexEncodedPublicKey copyPublicKeyButton.isUserInteractionEnabled = false + copyPublicKeyButton.accessibilityLabel = "Copy session id" + copyPublicKeyButton.isAccessibilityElement = true UIView.transition(with: copyPublicKeyButton, duration: 0.25, options: .transitionCrossDissolve, animations: { self.copyPublicKeyButton.setTitle("copied".localized(), for: .normal) }, completion: nil) diff --git a/Session/Onboarding/SeedReminderView.swift b/Session/Onboarding/SeedReminderView.swift index ec98036c6..83b0034c0 100644 --- a/Session/Onboarding/SeedReminderView.swift +++ b/Session/Onboarding/SeedReminderView.swift @@ -83,6 +83,7 @@ final class SeedReminderView: UIView { // Set up button let button = SessionButton(style: .bordered, size: .small) button.accessibilityLabel = "Continue" + button.isAccessibilityElement = true button.setTitle("continue_2".localized(), for: UIControl.State.normal) button.set(.width, to: 96) button.addTarget(self, action: #selector(handleContinueButtonTapped), for: UIControl.Event.touchUpInside) diff --git a/Session/Onboarding/SeedVC.swift b/Session/Onboarding/SeedVC.swift index 2ae8616e6..c31a42d43 100644 --- a/Session/Onboarding/SeedVC.swift +++ b/Session/Onboarding/SeedVC.swift @@ -46,7 +46,9 @@ final class SeedVC: BaseVC { private lazy var mnemonicLabel: UILabel = { let result = UILabel() - result.accessibilityLabel = "Recovery Phrase" + result.accessibilityIdentifier = "Recovery Phrase" + result.accessibilityLabel = mnemonic + result.isAccessibilityElement = true result.font = Fonts.spaceMono(ofSize: Values.mediumFontSize) result.themeTextColor = .primary result.textAlignment = .center @@ -74,6 +76,7 @@ final class SeedVC: BaseVC { // Set up navigation bar buttons let closeButton = UIBarButtonItem(image: #imageLiteral(resourceName: "X"), style: .plain, target: self, action: #selector(close)) closeButton.accessibilityLabel = "Navigate up" + closeButton.isAccessibilityElement = true closeButton.themeTintColor = .textPrimary navigationItem.leftBarButtonItem = closeButton diff --git a/Session/Settings/SettingsViewModel.swift b/Session/Settings/SettingsViewModel.swift index 023cb1413..26209c0d2 100644 --- a/Session/Settings/SettingsViewModel.swift +++ b/Session/Settings/SettingsViewModel.swift @@ -214,6 +214,7 @@ class SettingsViewModel: SessionTableViewModel Date: Wed, 16 Nov 2022 12:26:24 -1000 Subject: [PATCH 3/6] adding id for message request workflow and configuration message --- Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme | 2 +- Session/Conversations/Message Cells/InfoMessageCell.swift | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme b/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme index ea85c66b2..ca157a055 100644 --- a/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme +++ b/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme @@ -157,7 +157,7 @@ Date: Mon, 5 Dec 2022 15:27:27 +1100 Subject: [PATCH 4/6] Adding accessibility ids for closed group testing, messaging tests, onboarding tests and linked device testing --- Session/Closed Groups/EditClosedGroupVC.swift | 12 +++++++++++- Session/Closed Groups/NewClosedGroupVC.swift | 12 ++++++++++-- .../ConversationVC+Interaction.swift | 2 ++ .../Message Cells/VisibleMessageCell.swift | 4 +++- .../Settings/ThreadSettingsViewModel.swift | 16 +++++++++------- .../Views & Modals/ConversationTitleView.swift | 4 +++- Session/Home/HomeVC.swift | 3 +++ Session/Onboarding/RegisterVC.swift | 1 + Session/Settings/SettingsViewModel.swift | 2 +- Session/Shared/UserSelectionVC.swift | 3 ++- Session/Shared/Views/SessionAvatarCell.swift | 7 ++++--- Session/Shared/Views/SessionCell.swift | 1 + .../Settings/ThreadSettingsViewModelSpec.swift | 6 +++--- SessionUIKit/Components/ConfirmationModal.swift | 8 ++++++++ 14 files changed, 61 insertions(+), 20 deletions(-) diff --git a/Session/Closed Groups/EditClosedGroupVC.swift b/Session/Closed Groups/EditClosedGroupVC.swift index 3e00e0a26..f689a0c51 100644 --- a/Session/Closed Groups/EditClosedGroupVC.swift +++ b/Session/Closed Groups/EditClosedGroupVC.swift @@ -13,6 +13,8 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat let profileId: String let role: GroupMember.Role let profile: Profile? + let accessibilityLabel: String? + let accessibilityId: String? } private let threadId: String @@ -31,6 +33,7 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat private lazy var groupNameLabel: UILabel = { let result: UILabel = UILabel() result.accessibilityLabel = "Group name" + result.isAccessibilityElement = true result.font = .boldSystemFont(ofSize: Values.veryLargeFontSize) result.themeTextColor = .textPrimary result.lineBreakMode = .byTruncatingTail @@ -45,6 +48,8 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat usesDefaultHeight: false ) result.textAlignment = .center + result.isAccessibilityElement = true + result.accessibilityIdentifier = "Group name text field" return result }() @@ -52,6 +57,7 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat private lazy var addMembersButton: SessionButton = { let result: SessionButton = SessionButton(style: .bordered, size: .medium) result.accessibilityLabel = "Add members" + result.isAccessibilityElement = true result.setTitle("vc_conversation_settings_invite_button_title".localized(), for: .normal) result.addTarget(self, action: #selector(addMembers), for: UIControl.Event.touchUpInside) result.contentEdgeInsets = UIEdgeInsets(top: 0, leading: Values.mediumSpacing, bottom: 0, trailing: Values.mediumSpacing) @@ -62,6 +68,8 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat @objc private lazy var tableView: UITableView = { let result: UITableView = UITableView() result.accessibilityLabel = "Contact" + result.accessibilityIdentifier = "Contact" + result.isAccessibilityElement = true result.dataSource = self result.delegate = self result.separatorStyle = .none @@ -352,7 +360,9 @@ final class EditClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegat GroupMemberDisplayInfo( profileId: profile.id, role: .standard, - profile: profile + profile: profile, + accessibilityLabel: "Contact", + accessibilityId: "Contact" ) } self?.membersAndZombies = (self?.membersAndZombies ?? []) diff --git a/Session/Closed Groups/NewClosedGroupVC.swift b/Session/Closed Groups/NewClosedGroupVC.swift index 073f3e076..7fb887123 100644 --- a/Session/Closed Groups/NewClosedGroupVC.swift +++ b/Session/Closed Groups/NewClosedGroupVC.swift @@ -48,6 +48,8 @@ final class NewClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegate result.themeBorderColor = .borderSeparator result.layer.cornerRadius = 13 result.delegate = self + result.accessibilityIdentifier = "Group name input" + result.isAccessibilityElement = true return result }() @@ -133,6 +135,8 @@ final class NewClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegate result.translatesAutoresizingMaskIntoConstraints = false result.setTitle("CREATE_GROUP_BUTTON_TITLE".localized(), for: .normal) result.addTarget(self, action: #selector(createClosedGroup), for: .touchUpInside) + result.accessibilityIdentifier = "Create group" + result.isAccessibilityElement = true result.set(.width, to: 160) return result @@ -151,6 +155,8 @@ final class NewClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegate let closeButton = UIBarButtonItem(image: #imageLiteral(resourceName: "X"), style: .plain, target: self, action: #selector(close)) closeButton.themeTintColor = .textPrimary navigationItem.rightBarButtonItem = closeButton + navigationItem.leftBarButtonItem?.accessibilityIdentifier = "Cancel" + navigationItem.leftBarButtonItem?.isAccessibilityElement = true // Set up content setUpViewHierarchy() @@ -204,8 +210,9 @@ final class NewClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegate title: profile.displayName(), rightAccessory: .radio(isSelected: { [weak self] in self?.selectedContacts.contains(profile.id) == true - }) - ), + }), + accessibilityIdentifier: "Contact" + ), style: .edgeToEdge, position: Position.with(indexPath.row, count: data[indexPath.section].elements.count) ) @@ -286,6 +293,7 @@ final class NewClosedGroupVC: BaseVC, UITableViewDataSource, UITableViewDelegate explanation: message, cancelTitle: "BUTTON_OK".localized(), cancelStyle: .alert_text + ) ) present(modal, animated: true) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index a79a92fdd..f44ca406c 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -137,6 +137,8 @@ extension ConversationVC: range: (message as NSString).range(of: self.viewModel.threadData.displayName) ), confirmTitle: "modal_blocked_button_title".localized(), + confirmAccessibilityLabel: "Confirm block", + cancelAccessibilityLabel: "Cancel block", dismissOnConfirm: false // Custom dismissal logic ) { [weak self] _ in self?.viewModel.unblockContact() diff --git a/Session/Conversations/Message Cells/VisibleMessageCell.swift b/Session/Conversations/Message Cells/VisibleMessageCell.swift index a7285d316..d18f098de 100644 --- a/Session/Conversations/Message Cells/VisibleMessageCell.swift +++ b/Session/Conversations/Message Cells/VisibleMessageCell.swift @@ -268,7 +268,9 @@ final class VisibleMessageCell: MessageCell, TappableLabelDelegate { lastSearchText: String? ) { self.viewModel = cellViewModel - + self.bubbleView.accessibilityIdentifier = "Message Body" + self.bubbleView.isAccessibilityElement = true + self.bubbleView.accessibilityLabel = cellViewModel.body // We want to add spacing between "clusters" of messages to indicate that time has // passed (even if there wasn't enough time to warrant showing a date header) let shouldAddTopInset: Bool = ( diff --git a/Session/Conversations/Settings/ThreadSettingsViewModel.swift b/Session/Conversations/Settings/ThreadSettingsViewModel.swift index 178a5ea03..91cc38fcc 100644 --- a/Session/Conversations/Settings/ThreadSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadSettingsViewModel.swift @@ -120,7 +120,7 @@ class ThreadSettingsViewModel: SessionTableViewModel [SectionModel] in +.trackingConstantRegion { [weak self, dependencies, threadId = self.threadId, threadVariant = self.threadVariant] db -> [SectionModel] in let userPublicKey: String = getUserHexEncodedPublicKey(db, dependencies: dependencies) let maybeThreadViewModel: SessionThreadViewModel? = try SessionThreadViewModel .conversationSettingsQuery(threadId: threadId, userPublicKey: userPublicKey) @@ -351,7 +352,7 @@ class ThreadSettingsViewModel: SessionTableViewModel Date: Mon, 5 Dec 2022 15:47:05 +1100 Subject: [PATCH 5/6] clean --- Session/Conversations/Settings/ThreadSettingsViewModel.swift | 3 +-- .../Conversations/Views & Modals/ConversationTitleView.swift | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Session/Conversations/Settings/ThreadSettingsViewModel.swift b/Session/Conversations/Settings/ThreadSettingsViewModel.swift index 91cc38fcc..c579c3b99 100644 --- a/Session/Conversations/Settings/ThreadSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadSettingsViewModel.swift @@ -128,7 +128,6 @@ class ThreadSettingsViewModel: SessionTableViewModel [SectionModel] in + .trackingConstantRegion { [weak self, dependencies, threadId = self.threadId, threadVariant = self.threadVariant] db -> [SectionModel] in let userPublicKey: String = getUserHexEncodedPublicKey(db, dependencies: dependencies) let maybeThreadViewModel: SessionThreadViewModel? = try SessionThreadViewModel .conversationSettingsQuery(threadId: threadId, userPublicKey: userPublicKey) diff --git a/Session/Conversations/Views & Modals/ConversationTitleView.swift b/Session/Conversations/Views & Modals/ConversationTitleView.swift index d790e9fff..da7d93e5a 100644 --- a/Session/Conversations/Views & Modals/ConversationTitleView.swift +++ b/Session/Conversations/Views & Modals/ConversationTitleView.swift @@ -22,6 +22,8 @@ final class ConversationTitleView: UIView { private lazy var titleLabel: UILabel = { let result: UILabel = UILabel() + result.accessibilityIdentifier = "Username" + result.isAccessibilityElement = true result.font = .boldSystemFont(ofSize: Values.mediumFontSize) result.themeTextColor = .textPrimary result.lineBreakMode = .byTruncatingTail @@ -124,8 +126,6 @@ final class ConversationTitleView: UIView { ) self.titleLabel.text = name - self.titleLabel.accessibilityIdentifier = "Username" - self.titleLabel.isAccessibilityElement = true self.titleLabel.accessibilityLabel = name self.titleLabel.font = .boldSystemFont( ofSize: (shouldHaveSubtitle ? From b86ea81860ce8ca71f7ad6360d7dd29e72d7ec3e Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Tue, 6 Dec 2022 15:09:22 +1100 Subject: [PATCH 6/6] clean --- Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme b/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme index ca157a055..ea85c66b2 100644 --- a/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme +++ b/Session.xcodeproj/xcshareddata/xcschemes/Session.xcscheme @@ -157,7 +157,7 @@