From 68f143460a4693db593e10b092e7303d47ca12db Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 17:37:08 +0100 Subject: [PATCH 1/8] Add missing accessibility label to the settings buttons --- Shared/Coordinators/MainCoordinator/tvOSMainTabCoordinator.swift | 1 + Swiftfin/Views/HomeView.swift | 1 + Swiftfin/Views/ServerListView.swift | 1 + 3 files changed, 3 insertions(+) diff --git a/Shared/Coordinators/MainCoordinator/tvOSMainTabCoordinator.swift b/Shared/Coordinators/MainCoordinator/tvOSMainTabCoordinator.swift index ade0eb88..122cc829 100644 --- a/Shared/Coordinators/MainCoordinator/tvOSMainTabCoordinator.swift +++ b/Shared/Coordinators/MainCoordinator/tvOSMainTabCoordinator.swift @@ -85,5 +85,6 @@ final class MainTabCoordinator: TabCoordinatable { @ViewBuilder func makeSettingsTab(isActive: Bool) -> some View { Image(systemName: "gearshape.fill") + .accessibilityLabel(L10n.settings) } } diff --git a/Swiftfin/Views/HomeView.swift b/Swiftfin/Views/HomeView.swift index e6e8f764..792f0851 100644 --- a/Swiftfin/Views/HomeView.swift +++ b/Swiftfin/Views/HomeView.swift @@ -127,6 +127,7 @@ struct HomeView: View { homeRouter.route(to: \.settings) } label: { Image(systemName: "gearshape.fill") + .accessibilityLabel(L10n.settings) } } } diff --git a/Swiftfin/Views/ServerListView.swift b/Swiftfin/Views/ServerListView.swift index 79725c0f..e561acd4 100644 --- a/Swiftfin/Views/ServerListView.swift +++ b/Swiftfin/Views/ServerListView.swift @@ -104,6 +104,7 @@ struct ServerListView: View { serverListRouter.route(to: \.basicAppSettings) } label: { Image(systemName: "gearshape.fill") + .accessibilityLabel(L10n.settings) } } From fa026298a997e4434c4263c625d6750c25be16dd Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 20:06:48 +0100 Subject: [PATCH 2/8] Add missing accessibility traits for the Headers in the Home and Item views --- Swiftfin/Components/EpisodesRowView/EpisodesRowView.swift | 1 + Swiftfin/Components/PillHStackView.swift | 1 + Swiftfin/Views/HomeView.swift | 5 ++++- Swiftfin/Views/ItemView/ItemViewBody.swift | 4 ++++ .../Views/ItemView/Landscape/ItemLandscapeTopBarView.swift | 1 + 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Swiftfin/Components/EpisodesRowView/EpisodesRowView.swift b/Swiftfin/Components/EpisodesRowView/EpisodesRowView.swift index 10c5f2ff..3bcac987 100644 --- a/Swiftfin/Components/EpisodesRowView/EpisodesRowView.swift +++ b/Swiftfin/Components/EpisodesRowView/EpisodesRowView.swift @@ -25,6 +25,7 @@ struct EpisodesRowView: View where RowManager: EpisodesRowManager { if onlyCurrentSeason { if let currentSeason = Array(viewModel.seasonsEpisodes.keys).first(where: { $0.id == viewModel.item.id }) { Text(currentSeason.name ?? L10n.noTitle) + .accessibility(addTraits: [.isHeader]) } } else { Menu { diff --git a/Swiftfin/Components/PillHStackView.swift b/Swiftfin/Components/PillHStackView.swift index 9b066663..f519c855 100644 --- a/Swiftfin/Components/PillHStackView.swift +++ b/Swiftfin/Components/PillHStackView.swift @@ -21,6 +21,7 @@ struct PillHStackView: View { .fontWeight(.semibold) .padding(.top, 3) .padding(.leading, 16) + .accessibility(addTraits: [.isHeader]) ScrollView(.horizontal, showsIndicators: false) { HStack { diff --git a/Swiftfin/Views/HomeView.swift b/Swiftfin/Views/HomeView.swift index 792f0851..5e70b18a 100644 --- a/Swiftfin/Views/HomeView.swift +++ b/Swiftfin/Views/HomeView.swift @@ -62,6 +62,7 @@ struct HomeView: View { .font(.title2) .fontWeight(.bold) .padding() + .accessibility(addTraits: [.isHeader]) } selectedAction: { item in homeRouter.route(to: \.item, item) } @@ -73,6 +74,7 @@ struct HomeView: View { .font(.title2) .fontWeight(.bold) .padding() + .accessibility(addTraits: [.isHeader]) } selectedAction: { item in homeRouter.route(to: \.item, item) } @@ -85,7 +87,8 @@ struct HomeView: View { Text(L10n.latestWithString(library.name ?? "")) .font(.title2) .fontWeight(.bold) - + .accessibility(addTraits: [.isHeader]) + Spacer() Button { diff --git a/Swiftfin/Views/ItemView/ItemViewBody.swift b/Swiftfin/Views/ItemView/ItemViewBody.swift index c7926c3b..55dfc8a5 100644 --- a/Swiftfin/Views/ItemView/ItemViewBody.swift +++ b/Swiftfin/Views/ItemView/ItemViewBody.swift @@ -55,6 +55,7 @@ struct ItemViewBody: View { L10n.seasons.text .fontWeight(.semibold) .padding() + .accessibility(addTraits: [.isHeader]) }, selectedAction: { season in itemRouter.route(to: \.item, season) }) @@ -113,6 +114,7 @@ struct ItemViewBody: View { .fontWeight(.semibold) .padding(.bottom) .padding(.horizontal) + .accessibility(addTraits: [.isHeader]) } selectedAction: { collectionItem in itemRouter.route(to: \.item, collectionItem) } @@ -128,6 +130,7 @@ struct ItemViewBody: View { .fontWeight(.semibold) .padding(.bottom) .padding(.horizontal) + .accessibility(addTraits: [.isHeader]) }, selectedAction: { person in itemRouter.route(to: \.library, (viewModel: .init(person: person), title: person.title)) @@ -144,6 +147,7 @@ struct ItemViewBody: View { .fontWeight(.semibold) .padding(.bottom) .padding(.horizontal) + .accessibility(addTraits: [.isHeader]) }, selectedAction: { item in itemRouter.route(to: \.item, item) diff --git a/Swiftfin/Views/ItemView/Landscape/ItemLandscapeTopBarView.swift b/Swiftfin/Views/ItemView/Landscape/ItemLandscapeTopBarView.swift index 7a58de68..6ee32c2a 100644 --- a/Swiftfin/Views/ItemView/Landscape/ItemLandscapeTopBarView.swift +++ b/Swiftfin/Views/ItemView/Landscape/ItemLandscapeTopBarView.swift @@ -25,6 +25,7 @@ struct ItemLandscapeTopBarView: View { .foregroundColor(.primary) .padding(.leading, 16) .padding(.bottom, 10) + .accessibility(addTraits: [.isHeader]) // MARK: Details From e069c69d13aa282ec6af8856df329d4b2dcb69f5 Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 20:23:06 +0100 Subject: [PATCH 3/8] Hide title with initial for voice over --- Shared/Views/ImageView.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Shared/Views/ImageView.swift b/Shared/Views/ImageView.swift index 911e932b..49a32be0 100644 --- a/Shared/Views/ImageView.swift +++ b/Shared/Views/ImageView.swift @@ -37,6 +37,7 @@ struct ImageView: View { Text(failureInitials) .font(.largeTitle) .foregroundColor(.secondary) + .accessibilityHidden(true) } } From be0e3c50972adbf079a12b11458bf9217e9fc9de Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 20:54:58 +0100 Subject: [PATCH 4/8] Avoid inverting the colors of movies and series posters when using Smart Invert --- Swiftfin/Components/EpisodesRowView/EpisodeRowCard.swift | 1 + Swiftfin/Components/PortraitHStackView.swift | 1 + Swiftfin/Components/PortraitItemButton.swift | 1 + Swiftfin/Views/ContinueWatchingView.swift | 1 + Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift | 2 ++ .../Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift | 1 + Swiftfin/Views/ItemView/Portrait/ItemPortraitMainView.swift | 1 + Swiftfin/Views/LibraryListView.swift | 1 + 8 files changed, 9 insertions(+) diff --git a/Swiftfin/Components/EpisodesRowView/EpisodeRowCard.swift b/Swiftfin/Components/EpisodesRowView/EpisodeRowCard.swift index 412eee34..ef5de88f 100644 --- a/Swiftfin/Components/EpisodesRowView/EpisodeRowCard.swift +++ b/Swiftfin/Components/EpisodesRowView/EpisodeRowCard.swift @@ -34,6 +34,7 @@ struct EpisodeRowCard: View { } } .padding(.top) + .accessibilityIgnoresInvertColors() VStack(alignment: .leading) { Text(episode.getEpisodeLocator() ?? "S-:E-") diff --git a/Swiftfin/Components/PortraitHStackView.swift b/Swiftfin/Components/PortraitHStackView.swift index 06276d2c..edd67dcc 100644 --- a/Swiftfin/Components/PortraitHStackView.swift +++ b/Swiftfin/Components/PortraitHStackView.swift @@ -48,6 +48,7 @@ struct PortraitImageHStackView: View { failureInitials: item.failureInitials) .portraitPoster(width: maxWidth) .shadow(radius: 4, y: 2) + .accessibilityIgnoresInvertColors() if item.showTitle { Text(item.title) diff --git a/Swiftfin/Views/ContinueWatchingView.swift b/Swiftfin/Views/ContinueWatchingView.swift index 8c5c04c2..cd32af82 100644 --- a/Swiftfin/Views/ContinueWatchingView.swift +++ b/Swiftfin/Views/ContinueWatchingView.swift @@ -29,6 +29,7 @@ struct ContinueWatchingView: View { ZStack { ImageView(src: item.getBackdropImage(maxWidth: 320), bh: item.getBackdropImageBlurHash()) .frame(width: 320, height: 180) + .accessibilityIgnoresInvertColors() HStack { VStack { diff --git a/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift b/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift index c4290d05..8ef58c0e 100644 --- a/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift +++ b/Swiftfin/Views/ItemView/Landscape/ItemLandscapeMainView.swift @@ -28,6 +28,7 @@ struct ItemLandscapeMainView: View { bh: viewModel.item.getPrimaryImageBlurHash()) .frame(width: 130, height: 195) .cornerRadius(10) + .accessibilityIgnoresInvertColors() Spacer().frame(height: 15) @@ -100,6 +101,7 @@ struct ItemLandscapeMainView: View { .edgesIgnoringSafeArea(.all) .blur(radius: 8) .layoutPriority(-1) + .accessibilityIgnoresInvertColors() // iPadOS is making the view go all the way to the edge. // We have to accomodate this here diff --git a/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift b/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift index 2ae40695..db91e1c6 100644 --- a/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift +++ b/Swiftfin/Views/ItemView/Portrait/ItemPortraitHeaderOverlayView.swift @@ -26,6 +26,7 @@ struct PortraitHeaderOverlayView: View { ImageView(src: viewModel.item.portraitHeaderViewURL(maxWidth: 130)) .portraitPoster(width: 130) + .accessibilityIgnoresInvertColors() VStack(alignment: .leading, spacing: 1) { Spacer() diff --git a/Swiftfin/Views/ItemView/Portrait/ItemPortraitMainView.swift b/Swiftfin/Views/ItemView/Portrait/ItemPortraitMainView.swift index 0c6403b1..fbb4692b 100644 --- a/Swiftfin/Views/ItemView/Portrait/ItemPortraitMainView.swift +++ b/Swiftfin/Views/ItemView/Portrait/ItemPortraitMainView.swift @@ -23,6 +23,7 @@ struct ItemPortraitMainView: View { bh: viewModel.item.getBackdropImageBlurHash()) .opacity(0.4) .blur(radius: 2.0) + .accessibilityIgnoresInvertColors() } // MARK: portraitStaticOverlayView diff --git a/Swiftfin/Views/LibraryListView.swift b/Swiftfin/Views/LibraryListView.swift index 2438e35c..26c25fb6 100644 --- a/Swiftfin/Views/LibraryListView.swift +++ b/Swiftfin/Views/LibraryListView.swift @@ -82,6 +82,7 @@ struct LibraryListView: View { ZStack { ImageView(src: library.getPrimaryImage(maxWidth: 500), bh: library.getPrimaryImageBlurHash()) .opacity(0.4) + .accessibilityIgnoresInvertColors() HStack { Spacer() VStack { From a6b77ddf0eb37078d46ea0e72dacda0284c8a955 Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 20:55:15 +0100 Subject: [PATCH 5/8] Avoid inverting the colors in the video player when using smart Invert --- Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift b/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift index ca36f1df..233285c1 100644 --- a/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift +++ b/Swiftfin/Views/VideoPlayer/VLCPlayerViewController.swift @@ -97,6 +97,7 @@ class VLCPlayerViewController: UIViewController { setupConstraints() view.backgroundColor = .black + view.accessibilityIgnoresInvertColors = true setupMediaPlayer(newViewModel: viewModel) From d08365da205d5288e6f78ec84789fb8c37113341 Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 21:00:03 +0100 Subject: [PATCH 6/8] Add missing accessibility traits for Headers in ItemViewDetails View --- Swiftfin/Views/ItemView/ItemViewDetailsView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Swiftfin/Views/ItemView/ItemViewDetailsView.swift b/Swiftfin/Views/ItemView/ItemViewDetailsView.swift index d82df68a..56bec5f9 100644 --- a/Swiftfin/Views/ItemView/ItemViewDetailsView.swift +++ b/Swiftfin/Views/ItemView/ItemViewDetailsView.swift @@ -22,6 +22,7 @@ struct ItemViewDetailsView: View { L10n.information.text .font(.title3) .fontWeight(.bold) + .accessibility(addTraits: [.isHeader]) ForEach(viewModel.informationItems, id: \.self.title) { informationItem in VStack(alignment: .leading, spacing: 2) { @@ -40,6 +41,7 @@ struct ItemViewDetailsView: View { L10n.media.text .font(.title3) .fontWeight(.bold) + .accessibility(addTraits: [.isHeader]) VStack(alignment: .leading, spacing: 2) { L10n.file.text From 7a188bd922da60ba7e211408241588529371ec22 Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 21:04:01 +0100 Subject: [PATCH 7/8] Ease voice over navigation combining key and values view elements in ItemViewDetails --- Swiftfin/Views/HomeView.swift | 2 +- Swiftfin/Views/ItemView/ItemViewDetailsView.swift | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Swiftfin/Views/HomeView.swift b/Swiftfin/Views/HomeView.swift index 5e70b18a..0d2fafeb 100644 --- a/Swiftfin/Views/HomeView.swift +++ b/Swiftfin/Views/HomeView.swift @@ -88,7 +88,7 @@ struct HomeView: View { .font(.title2) .fontWeight(.bold) .accessibility(addTraits: [.isHeader]) - + Spacer() Button { diff --git a/Swiftfin/Views/ItemView/ItemViewDetailsView.swift b/Swiftfin/Views/ItemView/ItemViewDetailsView.swift index 56bec5f9..a91c2058 100644 --- a/Swiftfin/Views/ItemView/ItemViewDetailsView.swift +++ b/Swiftfin/Views/ItemView/ItemViewDetailsView.swift @@ -32,6 +32,7 @@ struct ItemViewDetailsView: View { .font(.subheadline) .foregroundColor(Color.secondary) } + .accessibilityElement(children: .combine) } } .padding(.bottom, 20) @@ -50,6 +51,7 @@ struct ItemViewDetailsView: View { .font(.subheadline) .foregroundColor(Color.secondary) } + .accessibilityElement(children: .combine) VStack(alignment: .leading, spacing: 2) { L10n.containers.text @@ -58,6 +60,7 @@ struct ItemViewDetailsView: View { .font(.subheadline) .foregroundColor(Color.secondary) } + .accessibilityElement(children: .combine) ForEach(viewModel.selectedVideoPlayerViewModel?.mediaItems ?? [], id: \.self.title) { mediaItem in VStack(alignment: .leading, spacing: 2) { @@ -67,6 +70,7 @@ struct ItemViewDetailsView: View { .font(.subheadline) .foregroundColor(Color.secondary) } + .accessibilityElement(children: .combine) } } } From 5603eb7bcae82c380776581340d094f4457affbf Mon Sep 17 00:00:00 2001 From: David Cordero Date: Sun, 16 Jan 2022 21:43:22 +0100 Subject: [PATCH 8/8] Fix typo --- .../JellyfinAPIExtensions/BaseItemDto+Stackable.swift | 2 +- .../JellyfinAPIExtensions/BaseItemPersonExtensions.swift | 2 +- Shared/Objects/PortraitImageStackable.swift | 2 +- Swiftfin/Components/PortraitHStackView.swift | 2 +- Swiftfin/Components/PortraitItemButton.swift | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+Stackable.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+Stackable.swift index d44f38ec..61d8d2f8 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+Stackable.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+Stackable.swift @@ -17,7 +17,7 @@ extension BaseItemDto: PortraitImageStackable { id ?? "no id" } - public func imageURLContsructor(maxWidth: Int) -> URL { + public func imageURLConstructor(maxWidth: Int) -> URL { switch self.itemType { case .episode: return getSeriesPrimaryImage(maxWidth: maxWidth) diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift index 5b72e8cb..b26fef16 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift @@ -68,7 +68,7 @@ extension BaseItemPerson: PortraitImageStackable { (id ?? "noid") + title + (subtitle ?? "nodescription") + blurHash + failureInitials } - public func imageURLContsructor(maxWidth: Int) -> URL { + public func imageURLConstructor(maxWidth: Int) -> URL { self.getImage(baseURL: SessionManager.main.currentLogin.server.currentURI, maxWidth: maxWidth) } diff --git a/Shared/Objects/PortraitImageStackable.swift b/Shared/Objects/PortraitImageStackable.swift index 07af7bda..9d4c7d30 100644 --- a/Shared/Objects/PortraitImageStackable.swift +++ b/Shared/Objects/PortraitImageStackable.swift @@ -9,7 +9,7 @@ import Foundation public protocol PortraitImageStackable { - func imageURLContsructor(maxWidth: Int) -> URL + func imageURLConstructor(maxWidth: Int) -> URL var title: String { get } var subtitle: String? { get } var blurHash: String { get } diff --git a/Swiftfin/Components/PortraitHStackView.swift b/Swiftfin/Components/PortraitHStackView.swift index edd67dcc..cbfb01f5 100644 --- a/Swiftfin/Components/PortraitHStackView.swift +++ b/Swiftfin/Components/PortraitHStackView.swift @@ -43,7 +43,7 @@ struct PortraitImageHStackView: View { selectedAction(item) } label: { VStack(alignment: horizontalAlignment) { - ImageView(src: item.imageURLContsructor(maxWidth: Int(maxWidth)), + ImageView(src: item.imageURLConstructor(maxWidth: Int(maxWidth)), bh: item.blurHash, failureInitials: item.failureInitials) .portraitPoster(width: maxWidth)