feat: add a11y for server category picker

This commit is contained in:
CMK 2021-05-07 20:02:28 +08:00
parent 8409331dd8
commit b63ae6800b
7 changed files with 111 additions and 5 deletions

View File

@ -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"
}
}
}
}

View File

@ -12,7 +12,7 @@
<key>CoreDataStack.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>15</integer>
<integer>14</integer>
</dict>
<key>Mastodon - RTL.xcscheme_^#shared#^_</key>
<dict>
@ -32,7 +32,7 @@
<key>NotificationService.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>14</integer>
<integer>15</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>

View File

@ -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 {

View File

@ -42,6 +42,10 @@ extension CategoryPickerSection {
}
}
.store(in: &cell.observations)
cell.isAccessibilityElement = true
cell.accessibilityLabel = item.accessibilityDescription
return cell
}
}

View File

@ -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 {

View File

@ -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.";

View File

@ -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
}
}