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
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ final class AppDependencies {
let ui: AppUIContainer

var captureController: CaptureController { self.services.captureController }
var permissionsService: any PermissionsService { self.services.permissionsService }
var appSettings: any AppSettingsProtocol { self.settings.appSettings }
var permissionsOnboardingWindowController: PermissionsOnboardingWindowController { self.ui.permissionsOnboardingWindowController }
var aboutWindowController: AboutWindowController { self.ui.aboutWindowController }
Expand Down
13 changes: 13 additions & 0 deletions Apps/Keyty/Sources/Keyty/App/Lifecycle/AppController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class AppController: NSObject {
private let statusItemController: StatusItemController
private let dependencies: AppDependencies
private let updateService: any UpdateService
private var permissionsObservationToken: PermissionObservationToken?

override init() {
self.updateService = UpdateServiceFactory.make()
Expand All @@ -37,6 +38,13 @@ final class AppController: NSObject {
self.dependencies.captureController.onCapturingChanged = { [weak self] isCapturing in
self?.statusItemController.isCapturing = isCapturing
}
self.statusItemController.isAccessibilityGranted =
self.dependencies.permissionsService.status(for: .accessibility) == .granted
self.permissionsObservationToken = self.dependencies.permissionsService.observeChanges { [weak self] in
Task { @MainActor [weak self] in
self?.updateAccessibilityStatus()
}
}
}
}

Expand Down Expand Up @@ -88,6 +96,11 @@ extension AppController: NSApplicationDelegate {

// MARK: - Settings Presentation
private extension AppController {
func updateAccessibilityStatus() {
self.statusItemController.isAccessibilityGranted =
self.dependencies.permissionsService.status(for: .accessibility) == .granted
}

func checkForUpdatesAtLaunchIfNeeded() {
guard self.updateService.automaticallyChecksForUpdates else { return }
self.updateService.checkForUpdatesInBackground()
Expand Down
24 changes: 17 additions & 7 deletions Apps/Keyty/Sources/Keyty/App/Shell/StatusItemController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,36 @@ final class StatusItemController {
private let statusItem: NSStatusItem

private var statusItemImage: NSImage {
let image = self.isCapturing ? NSImage.statusItemEnabled : NSImage.statusItemDisabled
image.isTemplate = true
return image
if !self.isAccessibilityGranted {
return NSImage.statusItemPermissionRequired
}

return self.isCapturing ? NSImage.statusItemEnabled : NSImage.statusItemDisabled
}

init(menu: NSMenu, shortcutItem: NSMenuItem) {
self.menu = menu
self.shortcutItem = shortcutItem
let item = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
item.menu = menu
let image = NSImage.statusItemDisabled
image.isTemplate = true
item.button?.image = image
item.button?.image = NSImage.statusItemDisabled
self.statusItem = item
}

var isCapturing: Bool = false {
didSet {
self.shortcutItem.title = isCapturing ? L10n.General.stopCapturing : L10n.General.startCapturing
self.statusItem.button?.image = self.statusItemImage
self.updateStatusItemImage()
}
}

var isAccessibilityGranted: Bool = false {
didSet {
self.updateStatusItemImage()
}
}

private func updateStatusItemImage() {
self.statusItem.button?.image = self.statusItemImage
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "status_item_permission_required@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Assets/Application/StatusItem/StatusItem.psd
Binary file not shown.
Loading