From b63ae6800bfa0d60109655f0f90290db42aedea6 Mon Sep 17 00:00:00 2001 From: CMK Date: Fri, 7 May 2021 20:02:28 +0800 Subject: [PATCH] feat: add a11y for server category picker --- Localization/app.json | 17 +++++++-- .../xcschemes/xcschememanagement.plist | 4 +-- .../Diffiable/Item/CategoryPickerItem.swift | 36 +++++++++++++++++++ .../Section/CategoryPickerSection.swift | 4 +++ Mastodon/Generated/Strings.swift | 26 ++++++++++++++ .../Resources/en.lproj/Localizable.strings | 13 +++++++ .../PickServerCategoriesCell.swift | 16 ++++++++- 7 files changed, 111 insertions(+), 5 deletions(-) diff --git a/Localization/app.json b/Localization/app.json index fbc670da..4e9d15a8 100644 --- a/Localization/app.json +++ b/Localization/app.json @@ -138,7 +138,20 @@ "title": "Pick a Server,\nany server.", "button": { "category": { - "All": "All" + "all": "All", + "all_accessiblity_description": "Category: All", + "academia": "academia", + "activism": "activism", + "food": "food", + "furry": "furry", + "games": "games", + "general": "general", + "journalism": "journalism", + "lgbt": "lgbt", + "regional": "regional", + "art": "art", + "music": "music", + "tech": "tech" }, "see_less": "See Less", "see_more": "See More" @@ -423,4 +436,4 @@ "text_placeholder": "Type or paste additional comments" } } -} +} \ No newline at end of file diff --git a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist index f092f973..32685726 100644 --- a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ CoreDataStack.xcscheme_^#shared#^_ orderHint - 15 + 14 Mastodon - RTL.xcscheme_^#shared#^_ @@ -32,7 +32,7 @@ NotificationService.xcscheme_^#shared#^_ orderHint - 14 + 15 SuppressBuildableAutocreation diff --git a/Mastodon/Diffiable/Item/CategoryPickerItem.swift b/Mastodon/Diffiable/Item/CategoryPickerItem.swift index 52bdaf39..0f2cdcc2 100644 --- a/Mastodon/Diffiable/Item/CategoryPickerItem.swift +++ b/Mastodon/Diffiable/Item/CategoryPickerItem.swift @@ -50,6 +50,42 @@ extension CategoryPickerItem { } } } + + var accessibilityDescription: String { + switch self { + case .all: + return L10n.Scene.ServerPicker.Button.Category.allAccessiblityDescription + case .category(let category): + switch category.category { + case .academia: + return L10n.Scene.ServerPicker.Button.Category.academia + case .activism: + return L10n.Scene.ServerPicker.Button.Category.activism + case .food: + return L10n.Scene.ServerPicker.Button.Category.food + case .furry: + return L10n.Scene.ServerPicker.Button.Category.furry + case .games: + return L10n.Scene.ServerPicker.Button.Category.games + case .general: + return L10n.Scene.ServerPicker.Button.Category.general + case .journalism: + return L10n.Scene.ServerPicker.Button.Category.journalism + case .lgbt: + return L10n.Scene.ServerPicker.Button.Category.lgbt + case .regional: + return L10n.Scene.ServerPicker.Button.Category.regional + case .art: + return L10n.Scene.ServerPicker.Button.Category.art + case .music: + return L10n.Scene.ServerPicker.Button.Category.music + case .tech: + return L10n.Scene.ServerPicker.Button.Category.tech + case ._other: + return "❓" // FIXME: + } + } + } } extension CategoryPickerItem: Equatable { diff --git a/Mastodon/Diffiable/Section/CategoryPickerSection.swift b/Mastodon/Diffiable/Section/CategoryPickerSection.swift index 938683f9..7ab93cc5 100644 --- a/Mastodon/Diffiable/Section/CategoryPickerSection.swift +++ b/Mastodon/Diffiable/Section/CategoryPickerSection.swift @@ -42,6 +42,10 @@ extension CategoryPickerSection { } } .store(in: &cell.observations) + + cell.isAccessibilityElement = true + cell.accessibilityLabel = item.accessibilityDescription + return cell } } diff --git a/Mastodon/Generated/Strings.swift b/Mastodon/Generated/Strings.swift index 4ec5e703..e53f9c08 100644 --- a/Mastodon/Generated/Strings.swift +++ b/Mastodon/Generated/Strings.swift @@ -638,8 +638,34 @@ internal enum L10n { /// See More internal static let seeMore = L10n.tr("Localizable", "Scene.ServerPicker.Button.SeeMore") internal enum Category { + /// academia + internal static let academia = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Academia") + /// activism + internal static let activism = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Activism") /// All internal static let all = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.All") + /// Category: All + internal static let allAccessiblityDescription = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.AllAccessiblityDescription") + /// art + internal static let art = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Art") + /// food + internal static let food = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Food") + /// furry + internal static let furry = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Furry") + /// games + internal static let games = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Games") + /// general + internal static let general = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.General") + /// journalism + internal static let journalism = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Journalism") + /// lgbt + internal static let lgbt = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Lgbt") + /// music + internal static let music = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Music") + /// regional + internal static let regional = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Regional") + /// tech + internal static let tech = L10n.tr("Localizable", "Scene.ServerPicker.Button.Category.Tech") } } internal enum EmptyState { diff --git a/Mastodon/Resources/en.lproj/Localizable.strings b/Mastodon/Resources/en.lproj/Localizable.strings index 59f83a5c..16552b39 100644 --- a/Mastodon/Resources/en.lproj/Localizable.strings +++ b/Mastodon/Resources/en.lproj/Localizable.strings @@ -204,7 +204,20 @@ tap the link to confirm your account."; "Scene.Search.Searching.Segment.All" = "All"; "Scene.Search.Searching.Segment.Hashtags" = "Hashtags"; "Scene.Search.Searching.Segment.People" = "People"; +"Scene.ServerPicker.Button.Category.Academia" = "academia"; +"Scene.ServerPicker.Button.Category.Activism" = "activism"; "Scene.ServerPicker.Button.Category.All" = "All"; +"Scene.ServerPicker.Button.Category.AllAccessiblityDescription" = "Category: All"; +"Scene.ServerPicker.Button.Category.Art" = "art"; +"Scene.ServerPicker.Button.Category.Food" = "food"; +"Scene.ServerPicker.Button.Category.Furry" = "furry"; +"Scene.ServerPicker.Button.Category.Games" = "games"; +"Scene.ServerPicker.Button.Category.General" = "general"; +"Scene.ServerPicker.Button.Category.Journalism" = "journalism"; +"Scene.ServerPicker.Button.Category.Lgbt" = "lgbt"; +"Scene.ServerPicker.Button.Category.Music" = "music"; +"Scene.ServerPicker.Button.Category.Regional" = "regional"; +"Scene.ServerPicker.Button.Category.Tech" = "tech"; "Scene.ServerPicker.Button.SeeLess" = "See Less"; "Scene.ServerPicker.Button.SeeMore" = "See More"; "Scene.ServerPicker.EmptyState.BadNetwork" = "Something went wrong while loading data. Check your internet connection."; diff --git a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCategoriesCell.swift b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCategoriesCell.swift index 84ee6017..373a90dd 100644 --- a/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCategoriesCell.swift +++ b/Mastodon/Scene/Onboarding/PickServer/TableViewCell/PickServerCategoriesCell.swift @@ -9,7 +9,7 @@ import os.log import UIKit import MastodonSDK -protocol PickServerCategoriesCellDelegate: class { +protocol PickServerCategoriesCellDelegate: AnyObject { func pickServerCategoriesCell(_ cell: PickServerCategoriesCell, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) } @@ -110,3 +110,17 @@ extension PickServerCategoriesCell: UICollectionViewDelegateFlowLayout { } } + +extension PickServerCategoriesCell { + + override func accessibilityElementCount() -> Int { + guard let diffableDataSource = diffableDataSource else { return 0 } + return diffableDataSource.snapshot().itemIdentifiers.count + } + + override func accessibilityElement(at index: Int) -> Any? { + guard let item = collectionView.cellForItem(at: IndexPath(item: index, section: 0)) else { return nil } + return item + } + +}