Skip to content
Merged
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
3 changes: 0 additions & 3 deletions Sources/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2558,9 +2558,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
)
self.newMachineSheetPresenter = newMachineSheetPresenter
self.computerUseRuntimeService = computerUseRuntimeService
(settingsRuntime.hostActions as? HostSettingsActions)?.setRunComputerUseOnboardingAction { [weak self] startingPoint in
self?.computerUseUXCoordinator.presentOnboardingFromSettings(startingAt: startingPoint)
}
let cloudUploader = CloudTelemetryUploader(
auth: auth.coordinator, baseURL: CloudTelemetryUploader.telemetryBaseURL, client: .current()
)
Expand Down
15 changes: 6 additions & 9 deletions Sources/HostSettingsActions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ final class HostSettingsActions: SettingsHostActions {
let computersActions: ComputersSettingsActions
private let configFileURL: URL
private let computerUseRuntimeService: ComputerUseRuntimeService
private var runComputerUseOnboardingAction:
@MainActor (ComputerUseOnboardingWindowController.StartingPoint) -> Void = { _ in }
private let runComputerUseOnboardingAction:
@MainActor (ComputerUseOnboardingWindowController.StartingPoint) -> Void

/// Serializes font-size config writes so rapid slider saves persist in order.
private let fontConfigWriter = FontConfigWriter()
Expand Down Expand Up @@ -56,11 +56,14 @@ final class HostSettingsActions: SettingsHostActions {
init(
configFileURL: URL,
computerUseRuntimeService: ComputerUseRuntimeService,
computersActions: ComputersSettingsActions? = nil
computersActions: ComputersSettingsActions? = nil,
runComputerUseOnboardingAction:
@escaping @MainActor (ComputerUseOnboardingWindowController.StartingPoint) -> Void
) {
self.computersActions = computersActions ?? ComputersSettingsActions()
self.configFileURL = configFileURL
self.computerUseRuntimeService = computerUseRuntimeService
self.runComputerUseOnboardingAction = runComputerUseOnboardingAction
startObservingAppIconMode()
}

Expand Down Expand Up @@ -217,12 +220,6 @@ final class HostSettingsActions: SettingsHostActions {
runComputerUseOnboardingAction(.screenRecording)
}

func setRunComputerUseOnboardingAction(
_ action: @escaping @MainActor (ComputerUseOnboardingWindowController.StartingPoint) -> Void
) {
runComputerUseOnboardingAction = action
}

func openConfigInExternalEditor() {
// Honor the user's configured editor (`preferredEditorCommand`),
// falling back to the OS default. Opening the config file directly
Expand Down
7 changes: 6 additions & 1 deletion Sources/cmuxApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,12 @@ struct cmuxApp: App {
hostActions: HostSettingsActions(
configFileURL: configFileURL,
computerUseRuntimeService: computerUseRuntimeService,
computersActions: devices.settingsActions
computersActions: devices.settingsActions,
runComputerUseOnboardingAction: { startingPoint in
AppDelegate.shared?.computerUseUXCoordinator.presentOnboardingFromSettings(
startingAt: startingPoint
)
}
),
shortcutDefaultResolver: Self.makeShortcutDefaultResolver()
)
Expand Down
26 changes: 22 additions & 4 deletions cmuxTests/ComputerUseUXTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,24 @@ struct ComputerUseUXTests {
directCaptureReady: true))
}

@Test @MainActor
func settingsHostActionsRoutePermissionRequestsToRequiredOnboardingAction() {
var presentations: [ComputerUseOnboardingWindowController.StartingPoint] = []
let actions = HostSettingsActions(
configFileURL: FileManager.default.temporaryDirectory
.appendingPathComponent("cmux-settings-\(UUID().uuidString).json"),
computerUseRuntimeService: ComputerUseRuntimeService(),
runComputerUseOnboardingAction: { startingPoint in
presentations.append(startingPoint)
}
)

actions.requestComputerUseAccessibility()
actions.requestComputerUseScreenRecording()

#expect(presentations == [.accessibility, .screenRecording])
}

@Test(.timeLimit(.minutes(1))) @MainActor
func grantedPermissionsResumeIncompleteSetupFromSettingsRefresh() async throws {
let root = FileManager.default.temporaryDirectory
Expand Down Expand Up @@ -284,11 +302,11 @@ struct ComputerUseUXTests {
] = []
let actions = HostSettingsActions(
configFileURL: root.appendingPathComponent("cmux.json"),
computerUseRuntimeService: runtime
computerUseRuntimeService: runtime,
runComputerUseOnboardingAction: { startingPoint in
presentations.append(startingPoint)
}
)
actions.setRunComputerUseOnboardingAction { startingPoint in
presentations.append(startingPoint)
}

await actions.refreshComputerUsePermissions()

Expand Down
3 changes: 2 additions & 1 deletion cmuxTests/HostSettingsShortcutNotificationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ struct HostSettingsShortcutNotificationTests {
try updatedContents.write(to: settingsFileURL, atomically: true, encoding: .utf8)
HostSettingsActions(
configFileURL: settingsFileURL,
computerUseRuntimeService: ComputerUseRuntimeService()
computerUseRuntimeService: ComputerUseRuntimeService(),
runComputerUseOnboardingAction: { _ in }
).notifyShortcutSettingsDidChange()

#expect(counter.value == expectedNotificationCount)
Expand Down
Loading