From 9cba2b7691997c3e017cdde284afded71c5293d2 Mon Sep 17 00:00:00 2001 From: Alan Hamlett Date: Wed, 16 Apr 2025 14:50:01 +0200 Subject: [PATCH] Fix linter and upgrade dependencies --- WakaTime/AppDelegate.swift | 41 ++++++++++++++++++++++++++--- WakaTime/Helpers/Dependencies.swift | 4 ++- WakaTime/WakaTime.entitlements | 6 +++-- WakaTime/WakaTime.swift | 10 ------- project.yml | 2 +- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/WakaTime/AppDelegate.swift b/WakaTime/AppDelegate.swift index 5939b14..ee684fe 100644 --- a/WakaTime/AppDelegate.swift +++ b/WakaTime/AppDelegate.swift @@ -2,7 +2,7 @@ import AppUpdater import Cocoa import UserNotifications -class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { +class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate, UNUserNotificationCenterDelegate { var window: NSWindow! var statusBarItem: NSStatusItem! let menu = NSMenu() @@ -15,6 +15,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { @Atomic var lastTodayTime = 0 @Atomic var lastTodayText = "" + @Atomic var lastBrowserWarningTime = 0 let updater = AppUpdater(owner: "wakatime", repo: "macos-wakatime") @@ -159,7 +160,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { Task.detached(priority: .background) { self.fetchToday() } - statusBarItem.popUpMenu(menu) + // statusBarItem.popUpMenu(menu) + statusBarItem.menu = menu } func a11yStatusChanged(_ hasPermission: Bool) { @@ -175,6 +177,21 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { statusBarA11ySeparator.isHidden = hasPermission } + private func checkBrowserDuplicateTracking() { + // Warn about using both Browser extension and Mac app tracking a browser at same time, once per 12 hrs + let time = Int(NSDate().timeIntervalSince1970) + if time - lastBrowserWarningTime > Dependencies.twelveHours && MonitoringManager.isMonitoringBrowsing { + Task { + if let browser = await Dependencies.recentBrowserExtension() { + lastBrowserWarningTime = time + delegate.toastNotification("Warning: WakaTime \(browser) extension detected. " + + "It’s recommended to only track browsing activity with the \(browser) " + + "extension or Mac Desktop app, but not both.") + } + } + } + } + private func showSettings() { NSApp.activate(ignoringOtherApps: true) settingsWindowController.settingsView.setBrowserVisibility() @@ -189,6 +206,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { internal func toastNotification(_ title: String) { let content = UNMutableNotificationContent() content.title = title + content.body = " " let uuidString = UUID().uuidString let request = UNNotificationRequest( @@ -196,10 +214,24 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { content: content, trigger: nil) let notificationCenter = UNUserNotificationCenter.current() + notificationCenter.delegate = self + notificationCenter.requestAuthorization(options: [.alert, .sound]) { granted, _ in guard granted else { return } - notificationCenter.add(request) + DispatchQueue.main.async { + notificationCenter.add(request) + } + } + } + + func userNotificationCenter(_ center: UNUserNotificationCenter, + willPresent notification: UNNotification, + withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { + if #available(macOS 11.0, *) { + completionHandler([.banner, .sound]) + } else { + completionHandler([.alert, .sound]) // Fallback for older macOS versions } } @@ -248,6 +280,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { try process.execute() } catch { Logging.default.log("Failed to run wakatime-cli fetching Today coding activity: \(error)") + return } let handle = pipe.fileHandleForReading @@ -255,5 +288,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, StatusBarDelegate { let text = (String(data: data, encoding: String.Encoding.utf8) ?? "").trimmingCharacters(in: .whitespacesAndNewlines) lastTodayText = text setText(text) + + checkBrowserDuplicateTracking() } } diff --git a/WakaTime/Helpers/Dependencies.swift b/WakaTime/Helpers/Dependencies.swift index 51e3f71..fb996bb 100644 --- a/WakaTime/Helpers/Dependencies.swift +++ b/WakaTime/Helpers/Dependencies.swift @@ -3,6 +3,8 @@ import Foundation // swiftlint:disable force_unwrapping // swiftlint:disable force_try class Dependencies { + public static var twelveHours = 43200 + public static func installDependencies() { Task { if !(await isCLILatest()) { @@ -57,7 +59,7 @@ class Dependencies { isoDateFormatter.timeZone = TimeZone(secondsFromGMT: 0) isoDateFormatter.formatOptions = [.withInternetDateTime] if let lastSeen = isoDateFormatter.date(from: lastSeenAt) { - if now.timeIntervalSince(lastSeen) > 600 { + if Int(now.timeIntervalSince(lastSeen)) > twelveHours { break } } diff --git a/WakaTime/WakaTime.entitlements b/WakaTime/WakaTime.entitlements index e89b7f3..f3da70d 100644 --- a/WakaTime/WakaTime.entitlements +++ b/WakaTime/WakaTime.entitlements @@ -2,7 +2,9 @@ - com.apple.security.app-sandbox - + com.apple.security.app-sandbox + + com.apple.security.notifications + diff --git a/WakaTime/WakaTime.swift b/WakaTime/WakaTime.swift index 82d04c3..b45a708 100644 --- a/WakaTime/WakaTime.swift +++ b/WakaTime/WakaTime.swift @@ -39,16 +39,6 @@ class WakaTime: HeartbeatEventHandler { } PropertiesManager.hasLaunchedBefore = true } - - if MonitoringManager.isMonitoringBrowsing { - Task { - if let browser = await Dependencies.recentBrowserExtension() { - delegate.toastNotification("Warning: WakaTime \(browser) extension detected. " + - "It’s recommended to only track browsing activity with the \(browser) " + - "extension or Mac Desktop app, but not both.") - } - } - } } private func configureFirebase() { diff --git a/project.yml b/project.yml index 8dcdab2..2f39a65 100644 --- a/project.yml +++ b/project.yml @@ -10,7 +10,7 @@ packages: branch: master Firebase: url: https://github.com/firebase/firebase-ios-sdk - from: 10.0.0 + from: 11.11.0 targets: WakaTime: