From 89275b2a6cb1138a032805173d3643a28e97ba2a Mon Sep 17 00:00:00 2001 From: Mauro <34335419+Velin92@users.noreply.github.com> Date: Tue, 8 Jul 2025 16:37:27 +0200 Subject: [PATCH] Aadded sender name when voiceover focuses a poll title (#4306) * added sender name in poll voiceover * improved the code * code improvement --- .../Sources/Other/Extensions/Section.swift | 1 + .../View/RoomPollsHistoryScreen.swift | 2 +- .../View/StartChatScreen.swift | 1 - .../Timeline/View/Polls/PollView.swift | 33 ++++++++++++++----- .../PollRoomTimelineView.swift | 3 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/ElementX/Sources/Other/Extensions/Section.swift b/ElementX/Sources/Other/Extensions/Section.swift index ed49f8ae8..61e7092d1 100644 --- a/ElementX/Sources/Other/Extensions/Section.swift +++ b/ElementX/Sources/Other/Extensions/Section.swift @@ -15,5 +15,6 @@ extension Section where Parent == Color, Content == EmptyView, Footer == EmptyVi } header: { Color.clear } + .accessibilityHidden(true) } } diff --git a/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift b/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift index ab0e13849..74321ac8b 100644 --- a/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift +++ b/ElementX/Sources/Screens/RoomPollsHistoryScreen/View/RoomPollsHistoryScreen.swift @@ -59,7 +59,7 @@ struct RoomPollsHistoryScreen: View { .font(.compound.bodySM) .foregroundColor(.compound.textSecondary) PollView(poll: pollTimelineItem.item.poll, - state: .full(isEditable: pollTimelineItem.item.isEditable)) { action in + state: .full(isEditable: pollTimelineItem.item.isEditable), sender: pollTimelineItem.item.sender) { action in switch action { case .selectOption(let optionID): guard let pollStartID = pollTimelineItem.item.id.eventID else { return } diff --git a/ElementX/Sources/Screens/StartChatScreen/View/StartChatScreen.swift b/ElementX/Sources/Screens/StartChatScreen/View/StartChatScreen.swift index 12cb4ebdd..8c15e3de3 100644 --- a/ElementX/Sources/Screens/StartChatScreen/View/StartChatScreen.swift +++ b/ElementX/Sources/Screens/StartChatScreen/View/StartChatScreen.swift @@ -128,7 +128,6 @@ struct StartChatScreen: View { } } else { Section.empty - .accessibilityHidden(true) } } diff --git a/ElementX/Sources/Screens/Timeline/View/Polls/PollView.swift b/ElementX/Sources/Screens/Timeline/View/Polls/PollView.swift index 529937e90..48767be87 100644 --- a/ElementX/Sources/Screens/Timeline/View/Polls/PollView.swift +++ b/ElementX/Sources/Screens/Timeline/View/Polls/PollView.swift @@ -42,14 +42,15 @@ struct PollView: View { let poll: Poll let state: PollViewState + let sender: TimelineItemSender let actionHandler: (PollViewAction) -> Void var body: some View { if state.isPreview { - questionView + accessibleQuestionView } else { VStack(alignment: .leading, spacing: 16) { - questionView + accessibleQuestionView optionsView summaryView toolbarView @@ -59,6 +60,20 @@ struct PollView: View { } // MARK: - Private + + private var senderString: String { poll.createdByAccountOwner ? L10n.commonYou : sender.disambiguatedDisplayName ?? sender.id } + + @ViewBuilder + private var accessibleQuestionView: some View { + questionView + .accessibilityRepresentation { + HStack(spacing: 0) { + Text(senderString) + questionView + } + .accessibilityElement(children: .combine) + } + } private var questionView: some View { HStack(alignment: .top, spacing: 12) { @@ -166,31 +181,31 @@ private extension Poll { struct PollView_Previews: PreviewProvider, TestablePreview { static var previews: some View { - PollView(poll: .disclosed(), state: .full(isEditable: false)) { _ in } + PollView(poll: .disclosed(), state: .full(isEditable: false), sender: .test) { _ in } .padding() .previewDisplayName("Disclosed") - PollView(poll: .undisclosed(), state: .full(isEditable: false)) { _ in } + PollView(poll: .undisclosed(), state: .full(isEditable: false), sender: .test) { _ in } .padding() .previewDisplayName("Undisclosed") - PollView(poll: .endedDisclosed, state: .full(isEditable: false)) { _ in } + PollView(poll: .endedDisclosed, state: .full(isEditable: false), sender: .test) { _ in } .padding() .previewDisplayName("Ended, Disclosed") - PollView(poll: .endedUndisclosed, state: .full(isEditable: false)) { _ in } + PollView(poll: .endedUndisclosed, state: .full(isEditable: false), sender: .test) { _ in } .padding() .previewDisplayName("Ended, Undisclosed") - PollView(poll: .disclosed(createdByAccountOwner: true), state: .full(isEditable: true)) { _ in } + PollView(poll: .disclosed(createdByAccountOwner: true), state: .full(isEditable: true), sender: .test) { _ in } .padding() .previewDisplayName("Creator, disclosed") - PollView(poll: .emptyDisclosed, state: .full(isEditable: true)) { _ in } + PollView(poll: .emptyDisclosed, state: .full(isEditable: true), sender: .test) { _ in } .padding() .previewDisplayName("Creator, no votes") - PollView(poll: .emptyDisclosed, state: .preview) { _ in } + PollView(poll: .emptyDisclosed, state: .preview, sender: .test) { _ in } .padding() .previewDisplayName("Preview") } diff --git a/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/PollRoomTimelineView.swift b/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/PollRoomTimelineView.swift index 3f594ba1c..d7784f449 100644 --- a/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/PollRoomTimelineView.swift +++ b/ElementX/Sources/Screens/Timeline/View/TimelineItemViews/PollRoomTimelineView.swift @@ -22,7 +22,8 @@ struct PollRoomTimelineView: View { var body: some View { TimelineStyler(timelineItem: timelineItem) { PollView(poll: poll, - state: state) { action in + state: state, + sender: timelineItem.sender) { action in switch action { case .selectOption(let optionID): guard let eventID, let option = poll.options.first(where: { $0.id == optionID }), !option.isSelected else { return }