Complete accessibility identifier coverage across all 152 project files
Exhaustive file-by-file audit of every Swift file in the project (iOS app, Watch app, Widget extension). Every interactive UI element — buttons, toggles, pickers, links, menus, tap gestures, text editors, color pickers, photo pickers — now has an accessibilityIdentifier for XCUITest automation. 46 files changed across Shared/, Onboarding/, Watch App/, and Widget targets. Added ~100 new ID definitions covering settings debug controls, export/photo views, sharing templates, customization subviews, onboarding flows, tip modals, widget voting buttons, and watch mood buttons.
This commit is contained in:
@@ -538,6 +538,7 @@ struct CelebrationAnimationPickerCompact: View {
|
||||
)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.celebrationAnimationButton(animation.rawValue))
|
||||
}
|
||||
}
|
||||
.padding(.horizontal, 4)
|
||||
@@ -666,6 +667,7 @@ struct CustomWidgetSection: View {
|
||||
CustomWidgetView(customWidgetModel: widget)
|
||||
.frame(width: 60, height: 60)
|
||||
.cornerRadius(12)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.customWidget(UserDefaultsStore.getCustomWidgets().firstIndex(where: { $0.uuid == widget.uuid }) ?? 0))
|
||||
.onTapGesture {
|
||||
AnalyticsManager.shared.track(.widgetViewed)
|
||||
selectedWidget.selectedItem = widget.copy() as? CustomWidgetModel
|
||||
@@ -689,6 +691,7 @@ struct CustomWidgetSection: View {
|
||||
.foregroundColor(.secondary)
|
||||
}
|
||||
}
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.customWidgetAdd)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -701,6 +704,7 @@ struct CustomWidgetSection: View {
|
||||
}
|
||||
.foregroundColor(.accentColor)
|
||||
}
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.widgetHowToLink)
|
||||
}
|
||||
.sheet(isPresented: $selectedWidget.showSheet) {
|
||||
if let selectedItem = selectedWidget.selectedItem {
|
||||
@@ -822,6 +826,7 @@ struct SubscriptionBannerView: View {
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 8)
|
||||
.background(Capsule().fill(Color.green.opacity(0.15)))
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.manageSubscriptionButton)
|
||||
}
|
||||
.padding(16)
|
||||
}
|
||||
@@ -866,6 +871,7 @@ struct SubscriptionBannerView: View {
|
||||
)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.unlockPremiumButton)
|
||||
}
|
||||
|
||||
private func openSubscriptionManagement() async {
|
||||
|
||||
@@ -23,6 +23,7 @@ struct CustomWigetView: View {
|
||||
CustomWidgetView(customWidgetModel: widget)
|
||||
.frame(width: 50, height: 50)
|
||||
.cornerRadius(10)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.customWidget(UserDefaultsStore.getCustomWidgets().firstIndex(where: { $0.uuid == widget.uuid }) ?? 0))
|
||||
.onTapGesture {
|
||||
AnalyticsManager.shared.track(.widgetViewed)
|
||||
selectedWidget.selectedItem = widget.copy() as? CustomWidgetModel
|
||||
@@ -34,6 +35,7 @@ struct CustomWigetView: View {
|
||||
.overlay(
|
||||
Image(systemName: "plus")
|
||||
)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.customWidgetAdd)
|
||||
.onTapGesture {
|
||||
AnalyticsManager.shared.track(.widgetCreateTapped)
|
||||
selectedWidget.selectedItem = CustomWidgetModel.randomWidget
|
||||
@@ -47,6 +49,7 @@ struct CustomWigetView: View {
|
||||
.cornerRadius(10)
|
||||
|
||||
Text("[\(String(localized: "how_to_add_widget"))](https://support.apple.com/guide/iphone/add-widgets-iphb8f1bf206/ios)")
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.widgetHowToLink)
|
||||
.accentColor(textColor)
|
||||
.padding(.bottom)
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ struct DayFilterPickerView: View {
|
||||
.cornerRadius(8)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.dayFilterButton(day))
|
||||
}
|
||||
}
|
||||
Text(String(localized: "day_picker_view_text"))
|
||||
|
||||
@@ -64,6 +64,7 @@ struct IconPickerView: View {
|
||||
})
|
||||
.accessibilityLabel(String(localized: "Default app icon"))
|
||||
.accessibilityHint(String(localized: "Double tap to select"))
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.iconButton("default"))
|
||||
|
||||
|
||||
ForEach(iconSets, id: \.self.0){ iconSet in
|
||||
@@ -80,6 +81,7 @@ struct IconPickerView: View {
|
||||
})
|
||||
.accessibilityLabel(String(localized: "App icon style \(iconSet.1.replacingOccurrences(of: "AppIcon", with: "").replacingOccurrences(of: "Image", with: ""))"))
|
||||
.accessibilityHint(String(localized: "Double tap to select"))
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.iconButton(iconSet.1))
|
||||
}
|
||||
}
|
||||
.padding()
|
||||
|
||||
@@ -41,6 +41,7 @@ struct ImagePackPickerView: View {
|
||||
.fill(imagePack == images ? theme.currentTheme.bgColor : .clear)
|
||||
.padding([.top, .bottom], -3)
|
||||
)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.imagePackOption(String(describing: images)))
|
||||
.onTapGesture {
|
||||
let impactMed = UIImpactFeedbackGenerator(style: .heavy)
|
||||
impactMed.impactOccurred()
|
||||
|
||||
@@ -38,6 +38,7 @@ struct PersonalityPackPickerView: View {
|
||||
.fill(personalityPack == aPack ? theme.currentTheme.bgColor : .clear)
|
||||
.padding(5)
|
||||
)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.personalityPackOption(aPack.title()))
|
||||
.onTapGesture {
|
||||
let impactMed = UIImpactFeedbackGenerator(style: .heavy)
|
||||
impactMed.impactOccurred()
|
||||
|
||||
@@ -31,6 +31,7 @@ struct ShapePickerView: View {
|
||||
.resizable()
|
||||
.frame(width: 20, height: 20, alignment: .trailing)
|
||||
.foregroundColor(Color(UIColor.systemGray))
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.shapeRefresh)
|
||||
.onTapGesture {
|
||||
shapeRefreshToggleThing.toggle()
|
||||
}
|
||||
@@ -43,6 +44,7 @@ struct ShapePickerView: View {
|
||||
bgColor: moodTint.color(forMood: Mood.allValues.randomElement()!), textColor: textColor)
|
||||
.frame(height: 50)
|
||||
.frame(minWidth: 0, maxWidth: .infinity)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.shapeOption(String(describing: ashape)))
|
||||
.onTapGesture {
|
||||
let impactMed = UIImpactFeedbackGenerator(style: .heavy)
|
||||
impactMed.impactOccurred()
|
||||
|
||||
@@ -58,6 +58,7 @@ struct ThemePickerView: View {
|
||||
.fill(selectedTheme == theme ? selectedTheme.currentTheme.bgColor : .clear)
|
||||
.padding(-5)
|
||||
)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.themeButton(theme.title))
|
||||
}
|
||||
|
||||
private func selectTheme(_ theme: Theme) {
|
||||
|
||||
@@ -59,6 +59,7 @@ struct VotingLayoutPickerView: View {
|
||||
)
|
||||
}
|
||||
.buttonStyle(.plain)
|
||||
.accessibilityIdentifier(AccessibilityID.Customize.votingLayoutButton(layout.displayName))
|
||||
}
|
||||
}
|
||||
.padding(.horizontal)
|
||||
|
||||
Reference in New Issue
Block a user