diff --git a/Signal/ConversationView/Loading/CVItemViewState.swift b/Signal/ConversationView/Loading/CVItemViewState.swift index 5830f8cfad..3f79ddc54c 100644 --- a/Signal/ConversationView/Loading/CVItemViewState.swift +++ b/Signal/ConversationView/Loading/CVItemViewState.swift @@ -426,6 +426,10 @@ struct CVItemModelBuilder: CVItemBuilding { memberLabel = memberLabel? .components(separatedBy: .whitespaces) .joined(separator: SignalSymbol.LeadingCharacter.nonBreakingSpace.rawValue) + + if let memberLabel { + itemViewState.accessibilityAuthorName = authorName + "," + memberLabel + } } if shouldShowSenderName { diff --git a/Signal/src/ViewControllers/ThreadSettings/ConversationHeaderBuilder.swift b/Signal/src/ViewControllers/ThreadSettings/ConversationHeaderBuilder.swift index 19112fd0bb..c4963c83df 100644 --- a/Signal/src/ViewControllers/ThreadSettings/ConversationHeaderBuilder.swift +++ b/Signal/src/ViewControllers/ThreadSettings/ConversationHeaderBuilder.swift @@ -532,6 +532,10 @@ struct ConversationHeaderBuilder { memberLabelLabel.numberOfLines = 0 memberLabelLabel.highlightRange = NSRange(location: 0, length: (label as NSString).length) memberLabelLabel.highlightFont = .dynamicTypeSubheadlineClamped + memberLabelLabel.axLabelPrefix = OWSLocalizedString( + "MEMBER_LABEL_AX_PREFIX", + comment: "Accessibility prefix for member labels.", + ) subviews.append(memberLabelLabel) hasSubtitleLabel = true diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index 5db0668030..982cc5b743 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -4996,6 +4996,9 @@ /* Label for an action to add a member label */ "MEMBER_LABEL_ADD" = "Add a Member Label"; +/* Accessibility prefix for member labels. */ +"MEMBER_LABEL_AX_PREFIX" = "Member label: "; + /* Heading shown above the preview of a message bubble with the edited member label. */ "MEMBER_LABEL_PREVIEW_HEADING" = "Preview"; diff --git a/SignalUI/ConversationView/CVCapsuleLabel.swift b/SignalUI/ConversationView/CVCapsuleLabel.swift index 4bbf75eb98..4638a000cc 100644 --- a/SignalUI/ConversationView/CVCapsuleLabel.swift +++ b/SignalUI/ConversationView/CVCapsuleLabel.swift @@ -13,6 +13,7 @@ import SignalServiceKit public class CVCapsuleLabel: UILabel { public var highlightRange: NSRange? public var highlightFont: UIFont? + public var axLabelPrefix: String? private static let horizontalInset: CGFloat = 6 private static let verticalInset: CGFloat = 1 @@ -94,4 +95,14 @@ public class CVCapsuleLabel: UILabel { height: size.height + Self.verticalInset * 2, ) } + + override public var accessibilityLabel: String? { + get { + if let axLabelPrefix, let text = self.text { + return axLabelPrefix + text + } + return super.accessibilityLabel + } + set { super.accessibilityLabel = newValue } + } } diff --git a/SignalUI/RecipientPickers/ContactCellView.swift b/SignalUI/RecipientPickers/ContactCellView.swift index 2ccbeb69fc..5f9e84c2b8 100644 --- a/SignalUI/RecipientPickers/ContactCellView.swift +++ b/SignalUI/RecipientPickers/ContactCellView.swift @@ -240,6 +240,10 @@ public class ContactCellView: ManualStackView { memberLabelLabel.numberOfLines = 0 memberLabelLabel.highlightRange = NSRange(location: 0, length: (memberLabel.label as NSString).length) memberLabelLabel.highlightFont = .dynamicTypeCaption1Clamped + memberLabelLabel.axLabelPrefix = OWSLocalizedString( + "MEMBER_LABEL_AX_PREFIX", + comment: "Accessibility prefix for member labels.", + ) textStackSubviews.append(memberLabelLabel) let memberLabelSize = memberLabelLabel.highlightLabelSize() diff --git a/SignalUI/ViewControllers/InteractiveSheetViewController.swift b/SignalUI/ViewControllers/InteractiveSheetViewController.swift index 2332f68ca7..1191f2a8ef 100644 --- a/SignalUI/ViewControllers/InteractiveSheetViewController.swift +++ b/SignalUI/ViewControllers/InteractiveSheetViewController.swift @@ -765,6 +765,14 @@ open class InteractiveSheetViewController: OWSViewController { isInInteractiveTransition = false panningScrollView?.showsVerticalScrollIndicator = true } + + override public func accessibilityPerformEscape() -> Bool { + if presentingViewController != nil { + dismiss(animated: true) + return true + } + return super.accessibilityPerformEscape() + } } // MARK: - diff --git a/SignalUI/Views/ProfileDetailLabel.swift b/SignalUI/Views/ProfileDetailLabel.swift index bd871c6d26..fb75ba0376 100644 --- a/SignalUI/Views/ProfileDetailLabel.swift +++ b/SignalUI/Views/ProfileDetailLabel.swift @@ -182,7 +182,7 @@ public extension ProfileDetailLabel { }, ) } - return ProfileDetailLabel( + let detailLabelView = ProfileDetailLabel( title: label, icon: .memberLabel, font: .dynamicTypeBody, @@ -191,6 +191,13 @@ public extension ProfileDetailLabel { tapAction() }, ) + detailLabelView.isAccessibilityElement = true + detailLabelView.accessibilityLabel = OWSLocalizedString( + "MEMBER_LABEL_AX_PREFIX", + comment: "Accessibility prefix for member labels.", + ) + label + + return detailLabelView } static func verified(