Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions Apps/iOS/Accessibility/CellTunnelAccessibilityIdentifier.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// CellTunnelAccessibilityIdentifier.swift
// CellTunnelPhone
//
// Created by Alexander Goodkind <alex@goodkind.io> on 2026-07-22.
// Copyright © 2026, all rights reserved.
//

import SwiftUI

// MARK: - CellTunnelAccessibilityIdentifier

enum CellTunnelAccessibilityIdentifier: String {
case configActions = "cell-tunnel.config-actions"
case configEditor = "cell-tunnel.config-editor"
case deleteConfig = "cell-tunnel.delete-config"
case editConfig = "cell-tunnel.edit-config"
case importConfig = "cell-tunnel.import-config"
case macStatusScroll = "cell-tunnel.mac-status-scroll"
case newConfig = "cell-tunnel.new-config"
case renameConfig = "cell-tunnel.rename-config"
case routeTraffic = "cell-tunnel.route-traffic"
case vpnApproval = "cell-tunnel.vpn-approval"
}

// MARK: - View

extension View {
func cellTunnelAccessibilityIdentifier(
_ identifier: CellTunnelAccessibilityIdentifier
) -> some View {
accessibilityIdentifier(identifier.rawValue)
}
}
1 change: 1 addition & 0 deletions Apps/iOS/Views/ConfigEditorView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
}
}
.frame(minWidth: configEditorMinWidth, minHeight: configEditorMinHeight)
.cellTunnelAccessibilityIdentifier(.configEditor)
}

// MARK: - Content
Expand Down
8 changes: 8 additions & 0 deletions Apps/iOS/Views/ConfigLibraryView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,13 +130,16 @@
Button(configLibraryEditTitle) {
presentation.presentEdit(config)
}
.cellTunnelAccessibilityIdentifier(.editConfig)
Button(configLibraryRenameTitle) {
startRename(config)
}
.cellTunnelAccessibilityIdentifier(.renameConfig)
Divider()
Button(configLibraryDeleteTitle, role: .destructive) {
controller.deleteConfig(id: config.id)
}
.cellTunnelAccessibilityIdentifier(.deleteConfig)
} label: {
Image(systemName: configLibraryActionsSymbol)
.font(.title3)
Expand All @@ -146,6 +149,9 @@
.buttonStyle(.plain)
.tint(.secondary)
.accessibilityLabel(configLibraryActionsAccessibilityLabel)
.accessibilityIdentifier(
"\(CellTunnelAccessibilityIdentifier.configActions.rawValue)-\(config.id.uuidString)"
)
}

// MARK: - Actions
Expand All @@ -160,6 +166,7 @@
}
.buttonStyle(.bordered)
.disabled(activeImportRequestID != nil)
.cellTunnelAccessibilityIdentifier(.importConfig)
.fileImporter(
isPresented: importPresentationBinding,
allowedContentTypes: configLibraryContentTypes,
Expand All @@ -171,6 +178,7 @@
presentation.presentCreate()
}
.buttonStyle(.bordered)
.cellTunnelAccessibilityIdentifier(.newConfig)
}
}

Expand Down
1 change: 1 addition & 0 deletions Apps/iOS/Views/EnableTunnelScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ struct EnableTunnelScreen: View {
.buttonStyle(.borderedProminent)
.controlSize(.large)
.frame(minWidth: buttonMinWidth)
.cellTunnelAccessibilityIdentifier(.vpnApproval)
}
}

Expand Down
2 changes: 2 additions & 0 deletions Apps/iOS/Views/MacStatusScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
.padding(contentPadding)
.frame(maxWidth: .infinity, alignment: .leading)
}
.cellTunnelAccessibilityIdentifier(.macStatusScroll)
.animation(.default, value: model.status)
}

Expand Down Expand Up @@ -127,6 +128,7 @@
Toggle(routeToggleTitle, isOn: model.routeTrafficBinding)
.toggleStyle(.switch)
.fixedSize()
.cellTunnelAccessibilityIdentifier(.routeTraffic)
}

// MARK: - Masonry
Expand Down
1 change: 1 addition & 0 deletions Apps/iOS/Views/RelayStatusScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ struct RelayStatusScreen: View {
Toggle(routeTrafficLabel, isOn: model.routeTrafficBinding)
.labelsHidden()
.disabled(!isEnabled)
.cellTunnelAccessibilityIdentifier(.routeTraffic)
}
}

Expand Down