Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
25238ee
Improve VoiceOver navigation and message accessibility
Kostenkov-2021 Jul 22, 2026
6a9b10a
Expand VoiceOver message actions and sharing accessibility
Kostenkov-2021 Jul 24, 2026
452baa3
Improve VoiceOver accessibility for modal interfaces
Kostenkov-2021 Jul 24, 2026
8591801
Improve Dynamic Type support for accessible modals
Kostenkov-2021 Jul 24, 2026
512637e
Improve VoiceOver support for alerts and Voice Control
Kostenkov-2021 Jul 24, 2026
41b9bd3
Improve VoiceOver reply navigation and peer info actions
Kostenkov-2021 Jul 24, 2026
2cff1ba
Improve VoiceOver accessibility for peer info members and header
Kostenkov-2021 Jul 24, 2026
2c9ee56
Improve VoiceOver accessibility for peer info media panes
Kostenkov-2021 Jul 24, 2026
1e328cb
Improve VoiceOver behavior in embedded peer info panes
Kostenkov-2021 Jul 24, 2026
d9f29dd
Improve VoiceOver accessibility in gifts and sharing
Kostenkov-2021 Jul 24, 2026
1864188
Improve VoiceOver accessibility in selection flows
Kostenkov-2021 Jul 24, 2026
047760a
Keep VoiceOver scroll feedback consistently localized
Kostenkov-2021 Jul 25, 2026
ca99e37
Improve VoiceOver selection flows and Share Extension
Kostenkov-2021 Jul 25, 2026
2108986
Improve VoiceOver accessibility for gifts and reply media
Kostenkov-2021 Jul 29, 2026
81e0eb2
Improve VoiceOver focus persistence and modal accessibility
Kostenkov-2021 Jul 29, 2026
e37e5ba
Complete VoiceOver focus persistence and regression gates
Kostenkov-2021 Aug 22, 2026
0f958f6
Expand VoiceOver regression coverage
Kostenkov-2021 Aug 22, 2026
693b4f9
Improve rich text scaling and Voice Control performance coverage
Kostenkov-2021 Aug 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Improve VoiceOver accessibility in selection flows
Add accessible navigation labels to gift, contact, chat, and search selection screens.
Hide the offscreen Add Gifts action panel when no gifts are selected.
Keep VoiceOver scroll status localized when presentation data changes.
  • Loading branch information
Kostenkov-2021 committed Jul 24, 2026
commit 186418800fdfb9461e5fdb354316e39f37ec5c14
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ final class AddGiftsScreenComponent: Component {
if buttonPanelView.superview == nil {
self.addSubview(buttonPanelView)
}
buttonPanelView.accessibilityElementsHidden = giftsListView.selectedItems.isEmpty
transition.setFrame(view: buttonPanelView, frame: CGRect(origin: CGPoint(x: 0.0, y: availableSize.height - bottomPanelSize.height + bottomPanelOffset), size: bottomPanelSize))
}

Expand Down Expand Up @@ -266,7 +267,9 @@ public final class AddGiftsScreen: ViewControllerComponentContainer {
}
self.filterButton.addTarget(self, action: #selector(self.filterPressed), forControlEvents: .touchUpInside)

self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "___close", style: .plain, target: self, action: #selector(self.cancelPressed))
let closeButtonItem = UIBarButtonItem(title: "___close", style: .plain, target: self, action: #selector(self.cancelPressed))
closeButtonItem.accessibilityLabel = presentationData.strings.Common_Close
self.navigationItem.leftBarButtonItem = closeButtonItem
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customDisplayNode: self.filterButton)
}

Expand Down Expand Up @@ -426,6 +429,10 @@ private final class FilterHeaderButton: HighlightableButtonNode {

super.init()

self.isAccessibilityElement = true
self.accessibilityLabel = presentationData.strings.Common_More
self.accessibilityTraits = [.button]

self.containerNode.addSubnode(self.referenceNode)
self.addSubnode(self.containerNode)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,11 +200,15 @@ class ChatSearchResultsControllerNode: ViewControllerTracingNode, ASScrollViewDe

self.listNode = ListViewImpl()
self.listNode.verticalScrollIndicatorColor = self.presentationData.theme.list.scrollIndicatorColor
self.listNode.accessibilityPageScrolledString = { row, count in
return presentationData.strings.VoiceOver_ScrollStatus(row, count).string
}

super.init()

self.listNode.accessibilityPageScrolledString = { [weak self] row, count in
guard let self else {
return ""
}
return self.presentationData.strings.VoiceOver_ScrollStatus(row, count).string
}

self.backgroundColor = self.presentationData.theme.chatList.backgroundColor
self.isOpaque = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ final class ChatSearchResultsController: ViewController {
if let strongSelf = self {
strongSelf.presentationData = presentationData
strongSelf.navigationBar?.updatePresentationData(NavigationBarPresentationData(presentationTheme: presentationData.theme, presentationStrings: presentationData.strings), transition: .immediate)
strongSelf.navigationItem.rightBarButtonItem?.accessibilityLabel = presentationData.strings.Common_Done
strongSelf.controllerNode.updatePresentationData(presentationData)
}
})
Expand All @@ -51,7 +52,9 @@ final class ChatSearchResultsController: ViewController {

self.title = searchQuery
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: UIView())
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "___done", style: .done, target: self, action: #selector(donePressed))
let doneButtonItem = UIBarButtonItem(title: "___done", style: .done, target: self, action: #selector(donePressed))
doneButtonItem.accessibilityLabel = self.presentationData.strings.Common_Done
self.navigationItem.rightBarButtonItem = doneButtonItem
}

required init(coder aDecoder: NSCoder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -299,16 +299,22 @@ class ContactMultiselectionControllerImpl: ViewController, ContactMultiselection
self.titleView.title = CounterControllerTitle(title: self.params.title ?? self.presentationData.strings.PrivacyLastSeenSettings_EmpryUsersPlaceholder, counter: "")
if self.rightNavigationButton == nil {
let rightNavigationButton = UIBarButtonItem(title: "___done", style: .done, target: self, action: #selector(self.rightNavigationButtonPressed))
rightNavigationButton.accessibilityLabel = self.presentationData.strings.Common_Done
self.rightNavigationButton = rightNavigationButton
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "___close", style: .plain, target: self, action: #selector(cancelPressed))
let closeButtonItem = UIBarButtonItem(title: "___close", style: .plain, target: self, action: #selector(cancelPressed))
closeButtonItem.accessibilityLabel = self.presentationData.strings.Common_Close
self.navigationItem.leftBarButtonItem = closeButtonItem
self.navigationItem.rightBarButtonItem = self.rightNavigationButton
}
case let .chatSelection(chatSelection):
self.titleView.title = CounterControllerTitle(title: self.params.title ?? chatSelection.title, counter: "")
if self.rightNavigationButton == nil {
let rightNavigationButton = UIBarButtonItem(title: "___done", style: .done, target: self, action: #selector(self.rightNavigationButtonPressed))
rightNavigationButton.accessibilityLabel = self.presentationData.strings.Common_Done
self.rightNavigationButton = rightNavigationButton
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "___close", style: .plain, target: self, action: #selector(cancelPressed))
let closeButtonItem = UIBarButtonItem(title: "___close", style: .plain, target: self, action: #selector(cancelPressed))
closeButtonItem.accessibilityLabel = self.presentationData.strings.Common_Close
self.navigationItem.leftBarButtonItem = closeButtonItem
self.navigationItem.rightBarButtonItem = self.rightNavigationButton
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,11 @@ final class ContactMultiselectionControllerNode: ASDisplayNode {
func updatePresentationData(_ presentationData: PresentationData) {
self.presentationData = presentationData
self.backgroundColor = presentationData.theme.chatList.backgroundColor
if case let .chats(chatListNode) = self.contentNode {
chatListNode.accessibilityPageScrolledString = { row, count in
return presentationData.strings.VoiceOver_ScrollStatus(row, count).string
}
}
}

func scrollToTop() {
Expand Down