diff --git a/Clocker/AppDelegate.swift b/Clocker/AppDelegate.swift index cfcac83..a2d76ec 100644 --- a/Clocker/AppDelegate.swift +++ b/Clocker/AppDelegate.swift @@ -16,7 +16,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate { panelObserver?.invalidate() } - open override func observeValue(forKeyPath keyPath: String?, of object: Any?, change _: [NSKeyValueChangeKey: Any]?, context _: UnsafeMutableRawPointer?) { + override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change _: [NSKeyValueChangeKey: Any]?, context _: UnsafeMutableRawPointer?) { if let path = keyPath, path == PreferencesConstants.hotKeyPathIdentifier { let hotKeyCenter = PTHotKeyCenter.shared() diff --git a/Clocker/ClockerUnitTests/ClockerUnitTests.swift b/Clocker/ClockerUnitTests/ClockerUnitTests.swift index 13cf265..48e8b5d 100644 --- a/Clocker/ClockerUnitTests/ClockerUnitTests.swift +++ b/Clocker/ClockerUnitTests/ClockerUnitTests.swift @@ -105,31 +105,31 @@ class ClockerUnitTests: XCTestCase { XCTAssert(newDefaults.isEmpty == false) XCTAssert(newDefaults.count == oldCount + 1) } - + func testDecoding() { let timezone1 = TimezoneData.customObject(from: nil) XCTAssertNotNil(timezone1) - + let data = Data() let timezone2 = TimezoneData.customObject(from: data) XCTAssertNil(timezone2) } - + func testDescription() { let timezoneData = TimezoneData(with: california) XCTAssertFalse(timezoneData.description.isEmpty) XCTAssertFalse(timezoneData.debugDescription.isEmpty) } - + func testHashing() { let timezoneData = TimezoneData(with: california) XCTAssert(timezoneData.hash != -1) - + timezoneData.placeID = nil timezoneData.timezoneID = nil XCTAssert(timezoneData.hash == -1) } - + func testBadInputDictionaryForInitialization() { let badInput: [String: Any] = ["customLabel": "", "latitude": "41.2565369", @@ -234,7 +234,7 @@ class ClockerUnitTests: XCTestCase { dataObject.setShouldOverrideGlobalTimeFormat(11) // 12-hour with preceding zero and seconds XCTAssertTrue(dataObject.timezoneFormat(DataStore.shared().timezoneFormat()) == "hh:mm:ss") - + // Wrong input dataObject.setShouldOverrideGlobalTimeFormat(0) // 12-hour with preceding zero and seconds XCTAssertTrue(dataObject.timezoneFormat(88) == "h:mm a") @@ -274,47 +274,47 @@ class ClockerUnitTests: XCTestCase { dataObject.setShouldOverrideGlobalTimeFormat(11) // 12-hour with preceding zero and seconds XCTAssertTrue(dataObject.timezoneFormat(DataStore.shared().timezoneFormat()) == "hh:mm:ss") - + dataObject.setShouldOverrideGlobalTimeFormat(12) // 12-hour with preceding zero and seconds XCTAssertTrue(dataObject.timezoneFormat(DataStore.shared().timezoneFormat()) == "epoch") } - + func testSecondsDisplayForOverridenTimezone() { let dataObject = TimezoneData(with: california) UserDefaults.standard.set(NSNumber(value: 1), forKey: CLSelectedTimeZoneFormatKey) // Set to 24-Hour Format // Test default behaviour - let timezoneWithSecondsKeys = [4,5,8,11] + let timezoneWithSecondsKeys = [4, 5, 8, 11] for timezoneKey in timezoneWithSecondsKeys { dataObject.setShouldOverrideGlobalTimeFormat(timezoneKey) XCTAssertTrue(dataObject.shouldShowSeconds(DataStore.shared().timezoneFormat())) } - - let timezoneWithoutSecondsKeys = [1,2,7,10] + + let timezoneWithoutSecondsKeys = [1, 2, 7, 10] for timezoneKey in timezoneWithoutSecondsKeys { dataObject.setShouldOverrideGlobalTimeFormat(timezoneKey) XCTAssertFalse(dataObject.shouldShowSeconds(DataStore.shared().timezoneFormat())) } - + // Test wrong override timezone key let wrongTimezoneKey = 88 dataObject.setShouldOverrideGlobalTimeFormat(wrongTimezoneKey) XCTAssertFalse(dataObject.shouldShowSeconds(DataStore.shared().timezoneFormat())) - + // Test wrong global preference key dataObject.setShouldOverrideGlobalTimeFormat(0) XCTAssertFalse(dataObject.shouldShowSeconds(88)) } - + func testTimezoneRetrieval() { let dataObject = TimezoneData(with: mumbai) let autoupdatingTimezone = TimeZone.autoupdatingCurrent.identifier XCTAssertEqual(dataObject.timezone(), "Asia/Calcutta") - + // Unlikely dataObject.timezoneID = nil XCTAssertEqual(dataObject.timezone(), autoupdatingTimezone) - + dataObject.isSystemTimezone = true XCTAssertEqual(dataObject.timezone(), autoupdatingTimezone) } @@ -328,15 +328,15 @@ class ClockerUnitTests: XCTestCase { dataObject.formattedAddress = nil XCTAssertTrue(dataObject.formattedTimezoneLabel() == "Asia", "Incorrect custom label returned by model \(dataObject.formattedTimezoneLabel())") - + dataObject.setLabel("Jogeshwari") XCTAssertTrue(dataObject.formattedTimezoneLabel() == "Jogeshwari", "Incorrect custom label returned by model \(dataObject.formattedTimezoneLabel())") - + // Unlikely scenario dataObject.setLabel("") dataObject.timezoneID = "GMT" XCTAssertTrue(dataObject.formattedTimezoneLabel() == "GMT", "Incorrect custom label returned by model \(dataObject.formattedTimezoneLabel())") - + // Another unlikely scenario dataObject.setLabel("") dataObject.timezoneID = nil diff --git a/Clocker/ClockerUnitTests/ThemerTests.swift b/Clocker/ClockerUnitTests/ThemerTests.swift index a269a72..cf23798 100644 --- a/Clocker/ClockerUnitTests/ThemerTests.swift +++ b/Clocker/ClockerUnitTests/ThemerTests.swift @@ -5,16 +5,15 @@ import XCTest @testable import Clocker class ThemerTests: XCTestCase { - @available(macOS 10.14, *) func testSettingTheme() { // Set to some random number should set to 0 let subject = Themer(index: 124) XCTAssertEqual(NSAppearance(named: .aqua), NSAppearance(named: .aqua)) - + // Set the same theme; this should return early subject.set(theme: 0) - + // Set the theme to dark theme subject.set(theme: 1) let expectedApperance = NSAppearance(named: .darkAqua) @@ -28,8 +27,7 @@ class ThemerTests: XCTestCase { let expectedBackgroundColor = NSColor.white let expectedTextColor = NSColor.black let expectedTextBackgroundColor = NSColor(deviceRed: 241.0 / 255.0, green: 241.0 / 255.0, blue: 241.0 / 255.0, alpha: 1.0) - - + let expectedShutdownImageName = "ellipsis.circle" let expectedPreferenceImageName = "plus" let expectedPinImageName = "macwindow.on.rectangle" @@ -54,14 +52,13 @@ class ThemerTests: XCTestCase { let expectedBackwardsImage = "gobackward.15" let expectedForwardsImage = "goforward.15" let expectedResetSliderImage = "xmark.circle.fill" - XCTAssertEqual(subject.sliderKnobColor(), expectedSliderKnobColor) XCTAssertEqual(subject.sliderRightColor(), expectedSliderRightColor) XCTAssertEqual(subject.mainBackgroundColor(), expectedBackgroundColor) XCTAssertEqual(subject.mainTextColor(), expectedTextColor) XCTAssertEqual(subject.textBackgroundColor(), expectedTextBackgroundColor) - + XCTAssertEqual(subject.shutdownImage().accessibilityDescription, expectedShutdownImageName) XCTAssertEqual(subject.preferenceImage().accessibilityDescription, expectedPreferenceImageName) XCTAssertEqual(subject.pinImage().accessibilityDescription, expectedPinImageName) @@ -74,7 +71,7 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.sharingImage().accessibilityDescription, expectedSharingImage) XCTAssertEqual(subject.currentLocationImage().accessibilityDescription, expectedCurrentLocationImage) XCTAssertEqual(subject.popoverAppearance(), expectedPopoverApperarance) - + XCTAssertEqual(subject.addImage().accessibilityDescription, expectedAddImage) XCTAssertEqual(subject.addImageHighlighted().name(), expectedAddImageHighlighted) XCTAssertEqual(subject.privacyTabImage().accessibilityDescription, expectedPrivacyTabImage) @@ -88,7 +85,7 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.goForwardsImage()?.accessibilityDescription, expectedForwardsImage) XCTAssertEqual(subject.resetModernSliderImage()?.accessibilityDescription, expectedResetSliderImage) } - + func testDarkTheme() throws { let subject = Themer(index: 1) // 1 is for dark theme let expectedSliderKnobColor = NSColor(deviceRed: 0.0, green: 0.0, blue: 0, alpha: 0.9) @@ -96,8 +93,7 @@ class ThemerTests: XCTestCase { let expectedBackgroundColor = NSColor(deviceRed: 42.0 / 255.0, green: 42.0 / 255.0, blue: 42.0 / 255.0, alpha: 1.0) let expectedTextColor = NSColor.white let expectedTextBackgroundColor = NSColor(deviceRed: 42.0 / 255.0, green: 55.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0) - - + let expectedShutdownImageName = "ellipsis.circle" let expectedPreferenceImageName = "plus" let expectedPinImageName = "macwindow.on.rectangle" @@ -122,7 +118,6 @@ class ThemerTests: XCTestCase { let expectedBackwardsImage = "gobackward.15" let expectedForwardsImage = "goforward.15" let expectedResetSliderImage = "xmark.circle.fill" - XCTAssertEqual(subject.sliderKnobColor(), expectedSliderKnobColor) XCTAssertEqual(subject.sliderRightColor(), expectedSliderRightColor) @@ -155,18 +150,17 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.resetModernSliderImage()?.accessibilityDescription, expectedResetSliderImage) XCTAssertEqual(subject.description, "Current Theme is \(Themer.Theme.dark)") } - + func testSystemTheme() throws { let currentSystemTheme = - UserDefaults.standard.string(forKey: "AppleUserInterfaceStyle")?.lowercased().contains("dark") ?? false ? Themer.Theme.dark : Themer.Theme.light + UserDefaults.standard.string(forKey: "AppleUserInterfaceStyle")?.lowercased().contains("dark") ?? false ? Themer.Theme.dark : Themer.Theme.light let subject = Themer(index: 2) // 2 is for system theme let expectedSliderKnobColor = currentSystemTheme == .light ? NSColor(deviceRed: 255.0, green: 255.0, blue: 255, alpha: 0.9) : NSColor(deviceRed: 0.0, green: 0.0, blue: 0, alpha: 0.9) let expectedSliderRightColor = currentSystemTheme == .dark ? NSColor.white : NSColor.gray let expectedBackgroundColor = currentSystemTheme == .dark ? NSColor(deviceRed: 42.0 / 255.0, green: 42.0 / 255.0, blue: 42.0 / 255.0, alpha: 1.0) : NSColor.white let expectedTextColor = NSColor.textColor let expectedTextBackgroundColor = currentSystemTheme == .dark ? NSColor(deviceRed: 42.0 / 255.0, green: 55.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0) : NSColor(deviceRed: 241.0 / 255.0, green: 241.0 / 255.0, blue: 241.0 / 255.0, alpha: 1.0) - - + let expectedShutdownImageName = "ellipsis.circle" let expectedPreferenceImageName = "plus" let expectedPinImageName = "macwindow.on.rectangle" @@ -191,7 +185,6 @@ class ThemerTests: XCTestCase { let expectedBackwardsImage = "gobackward.15" let expectedForwardsImage = "goforward.15" let expectedResetSliderImage = "xmark.circle.fill" - XCTAssertEqual(subject.sliderKnobColor(), expectedSliderKnobColor) XCTAssertEqual(subject.sliderRightColor(), expectedSliderRightColor) @@ -224,7 +217,7 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.resetModernSliderImage()?.accessibilityDescription, expectedResetSliderImage) XCTAssertEqual(subject.description, "System Theme is \(currentSystemTheme == .dark ? Themer.Theme.dark : Themer.Theme.light)") } - + func testSolarizedLightTheme() throws { let subject = Themer(index: 3) // 3 is for solarized light theme let expectedSliderKnobColor = NSColor(deviceRed: 0.0, green: 0.0, blue: 0, alpha: 0.9) @@ -232,8 +225,7 @@ class ThemerTests: XCTestCase { let expectedBackgroundColor = NSColor(deviceRed: 253.0 / 255.0, green: 246.0 / 255.0, blue: 227.0 / 255.0, alpha: 1.0) let expectedTextColor = NSColor.black let expectedTextBackgroundColor = NSColor(deviceRed: 238.0 / 255.0, green: 232.0 / 255.0, blue: 213.0 / 255.0, alpha: 1.0) - - + let expectedShutdownImageName = "ellipsis.circle" let expectedPreferenceImageName = "plus" let expectedPinImageName = "macwindow.on.rectangle" @@ -258,14 +250,13 @@ class ThemerTests: XCTestCase { let expectedBackwardsImage = "gobackward.15" let expectedForwardsImage = "goforward.15" let expectedResetSliderImage = "xmark.circle.fill" - XCTAssertEqual(subject.sliderKnobColor(), expectedSliderKnobColor) XCTAssertEqual(subject.sliderRightColor(), expectedSliderRightColor) XCTAssertEqual(subject.mainBackgroundColor(), expectedBackgroundColor) XCTAssertEqual(subject.mainTextColor(), expectedTextColor) XCTAssertEqual(subject.textBackgroundColor(), expectedTextBackgroundColor) - + XCTAssertEqual(subject.shutdownImage().accessibilityDescription, expectedShutdownImageName) XCTAssertEqual(subject.preferenceImage().accessibilityDescription, expectedPreferenceImageName) XCTAssertEqual(subject.pinImage().accessibilityDescription, expectedPinImageName) @@ -278,7 +269,7 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.sharingImage().accessibilityDescription, expectedSharingImage) XCTAssertEqual(subject.currentLocationImage().accessibilityDescription, expectedCurrentLocationImage) XCTAssertEqual(subject.popoverAppearance(), expectedPopoverApperarance) - + XCTAssertEqual(subject.addImage().accessibilityDescription, expectedAddImage) XCTAssertEqual(subject.addImageHighlighted().name(), expectedAddImageHighlighted) XCTAssertEqual(subject.privacyTabImage().accessibilityDescription, expectedPrivacyTabImage) @@ -292,7 +283,7 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.goForwardsImage()?.accessibilityDescription, expectedForwardsImage) XCTAssertEqual(subject.resetModernSliderImage()?.accessibilityDescription, expectedResetSliderImage) } - + func testSolarizedDarkTheme() throws { let subject = Themer(index: 4) // 4 is for solarized dark theme let expectedSliderKnobColor = NSColor(deviceRed: 0.0, green: 0.0, blue: 0, alpha: 0.9) @@ -300,8 +291,7 @@ class ThemerTests: XCTestCase { let expectedBackgroundColor = NSColor(deviceRed: 7.0 / 255.0, green: 54.0 / 255.0, blue: 66.0 / 255.0, alpha: 1.0) let expectedTextColor = NSColor.white let expectedTextBackgroundColor = NSColor(deviceRed: 88.0 / 255.0, green: 110.0 / 255.0, blue: 117.0 / 255.0, alpha: 1.0) - - + let expectedShutdownImageName = "ellipsis.circle" let expectedPreferenceImageName = "plus" let expectedPinImageName = "macwindow.on.rectangle" @@ -326,7 +316,6 @@ class ThemerTests: XCTestCase { let expectedBackwardsImage = "gobackward.15" let expectedForwardsImage = "goforward.15" let expectedResetSliderImage = "xmark.circle.fill" - XCTAssertEqual(subject.sliderKnobColor(), expectedSliderKnobColor) XCTAssertEqual(subject.sliderRightColor(), expectedSliderRightColor) @@ -358,5 +347,4 @@ class ThemerTests: XCTestCase { XCTAssertEqual(subject.goForwardsImage()?.accessibilityDescription, expectedForwardsImage) XCTAssertEqual(subject.resetModernSliderImage()?.accessibilityDescription, expectedResetSliderImage) } - } diff --git a/Clocker/CoreModelKit/Sources/CoreModelKit/SearchResults.swift b/Clocker/CoreModelKit/Sources/CoreModelKit/SearchResults.swift index 64341d1..84f8719 100644 --- a/Clocker/CoreModelKit/Sources/CoreModelKit/SearchResults.swift +++ b/Clocker/CoreModelKit/Sources/CoreModelKit/SearchResults.swift @@ -2,7 +2,7 @@ import Cocoa -public struct ResultStatus { +public enum ResultStatus { public static let okay = "OK" public static let zeroResults = "ZERO_RESULTS" public static let requestDenied = "REQUEST_DENIED" @@ -12,7 +12,7 @@ public struct SearchResult: Codable { public let results: [Result] public let status: String public let errorMessage: String? - + public struct Result: Codable { public let addressComponents: [AddressComponent] public let formattedAddress: String @@ -55,10 +55,10 @@ public struct SearchResult: Codable { case types } } - + private enum CodingKeys: String, CodingKey { - case results = "results" - case status = "status" + case results + case status case errorMessage = "error_message" } } diff --git a/Clocker/CoreModelKit/Sources/CoreModelKit/TimezoneData.swift b/Clocker/CoreModelKit/Sources/CoreModelKit/TimezoneData.swift index 0c0d6bf..ec66b4c 100644 --- a/Clocker/CoreModelKit/Sources/CoreModelKit/TimezoneData.swift +++ b/Clocker/CoreModelKit/Sources/CoreModelKit/TimezoneData.swift @@ -85,7 +85,7 @@ public class TimezoneData: NSObject, NSCoding { public var isSystemTimezone = false public var overrideFormat: TimezoneOverride = .globalFormat - public override init() { + override public init() { selectionType = .timezone isFavourite = 0 note = ModelConstants.emptyString @@ -268,7 +268,7 @@ public class TimezoneData: NSObject, NSCoding { return formatInString.contains("ss") } - public override var hash: Int { + override public var hash: Int { guard let placeIdentifier = placeID, let timezone = timezoneID else { return -1 } @@ -276,7 +276,7 @@ public class TimezoneData: NSObject, NSCoding { return placeIdentifier.hashValue ^ timezone.hashValue } - public override func isEqual(_ object: Any?) -> Bool { + override public func isEqual(_ object: Any?) -> Bool { guard let compared = object as? TimezoneData else { return false } diff --git a/Clocker/Dependencies/Date Additions/TimePeriodChain.swift b/Clocker/Dependencies/Date Additions/TimePeriodChain.swift index f0c691c..52a8be8 100755 --- a/Clocker/Dependencies/Date Additions/TimePeriodChain.swift +++ b/Clocker/Dependencies/Date Additions/TimePeriodChain.swift @@ -138,15 +138,15 @@ open class TimePeriodChain: TimePeriodGroup { _end = _end?.addingTimeInterval(duration) } - public override func map(_ transform: (TimePeriodProtocol) throws -> T) rethrows -> [T] { + override public func map(_ transform: (TimePeriodProtocol) throws -> T) rethrows -> [T] { return try periods.map(transform) } - public override func filter(_ isIncluded: (TimePeriodProtocol) throws -> Bool) rethrows -> [TimePeriodProtocol] { + override public func filter(_ isIncluded: (TimePeriodProtocol) throws -> Bool) rethrows -> [TimePeriodProtocol] { return try periods.filter(isIncluded) } - internal override func reduce(_ initialResult: Result, _ nextPartialResult: (Result, TimePeriodProtocol) throws -> Result) rethrows -> Result { + override internal func reduce(_ initialResult: Result, _ nextPartialResult: (Result, TimePeriodProtocol) throws -> Result) rethrows -> Result { return try periods.reduce(initialResult, nextPartialResult) } diff --git a/Clocker/Events and Reminders/CalendarHandler.swift b/Clocker/Events and Reminders/CalendarHandler.swift index 7620eb1..ec789b2 100644 --- a/Clocker/Events and Reminders/CalendarHandler.swift +++ b/Clocker/Events and Reminders/CalendarHandler.swift @@ -391,7 +391,8 @@ extension EventCenter { // Check for Zoom links if actualLink.contains("zoom.us/j/") || actualLink.contains("zoom.us/s/") - || actualLink.contains("zoom.us/w/") { + || actualLink.contains("zoom.us/w/") + { // Create a Zoom App link let workspace = NSWorkspace.shared if workspace.urlForApplication(toOpen: URL(string: "zoommtg://")!) != nil { @@ -417,7 +418,8 @@ extension EventCenter { || actualLink.contains("public.senfcall.de") || actualLink.contains("youcanbook.me/zoom/") || actualLink.contains("workplace.com/groupcall") - || actualLink.contains("bluejeans.com/") { + || actualLink.contains("bluejeans.com/") + { if let meetingLink = result.url { return meetingLink } diff --git a/Clocker/Events and Reminders/RemindersHandler.swift b/Clocker/Events and Reminders/RemindersHandler.swift index 7546c81..9b93518 100644 --- a/Clocker/Events and Reminders/RemindersHandler.swift +++ b/Clocker/Events and Reminders/RemindersHandler.swift @@ -51,7 +51,8 @@ extension EventCenter { timezone: String, alertIndex: Int, reminderDate: Date, - additionalNotes: String?) -> Bool { + additionalNotes: String?) -> Bool + { initializeStoreIfNeccesary() if reminderAccessNotDetermined() || reminderAccessDenied() { diff --git a/Clocker/Menu Bar/StatusContainerView.swift b/Clocker/Menu Bar/StatusContainerView.swift index 536707c..c266f5f 100644 --- a/Clocker/Menu Bar/StatusContainerView.swift +++ b/Clocker/Menu Bar/StatusContainerView.swift @@ -31,10 +31,12 @@ func compactWidth(for timezone: TimezoneData) -> Int { if timeFormat == DateFormat.twelveHour || timeFormat == DateFormat.twelveHourWithSeconds || timeFormat == DateFormat.twelveHourWithZero - || timeFormat == DateFormat.twelveHourWithSeconds { + || timeFormat == DateFormat.twelveHourWithSeconds + { totalWidth += 20 } else if timeFormat == DateFormat.twentyFourHour - || timeFormat == DateFormat.twentyFourHourWithSeconds { + || timeFormat == DateFormat.twentyFourHourWithSeconds + { totalWidth += 0 } diff --git a/Clocker/Menu Bar/StatusItemHandler.swift b/Clocker/Menu Bar/StatusItemHandler.swift index fb719d4..669a664 100644 --- a/Clocker/Menu Bar/StatusItemHandler.swift +++ b/Clocker/Menu Bar/StatusItemHandler.swift @@ -112,7 +112,8 @@ class StatusItemHandler: NSObject { userNotificationsDidChangeNotif = center.addObserver(forName: UserDefaults.didChangeNotification, object: self, - queue: mainQueue) { _ in + queue: mainQueue) + { _ in self.setupStatusItem() } } @@ -185,7 +186,7 @@ class StatusItemHandler: NSObject { if let strongSelf = self { strongSelf.performTimerWork() } - }) + }) // Tolerance, even a small amount, has a positive imapct on the power usage. As a rule, we set it to 10% of the interval menubarTimer?.tolerance = shouldDisplaySeconds ? 0.5 : 20 diff --git a/Clocker/Onboarding/FinalOnboardingViewController.swift b/Clocker/Onboarding/FinalOnboardingViewController.swift index 6ef7c1a..db81236 100644 --- a/Clocker/Onboarding/FinalOnboardingViewController.swift +++ b/Clocker/Onboarding/FinalOnboardingViewController.swift @@ -53,7 +53,7 @@ class FinalOnboardingViewController: NSViewController { @IBAction func localizationAction(_: Any) { guard let localizationURL = URL(string: AboutUsConstants.TwitterFollowIntentLink), - let languageCode = Locale.preferredLanguages.first else { return } + let languageCode = Locale.preferredLanguages.first else { return } NSWorkspace.shared.open(localizationURL) diff --git a/Clocker/Onboarding/OnboardingSearchController.swift b/Clocker/Onboarding/OnboardingSearchController.swift index 6ea7a72..2c2607a 100644 --- a/Clocker/Onboarding/OnboardingSearchController.swift +++ b/Clocker/Onboarding/OnboardingSearchController.swift @@ -27,8 +27,8 @@ class OnboardingSearchController: NSViewController { private var geocodingKey: String = { guard let path = Bundle.main.path(forResource: "Keys", ofType: "plist"), - let dictionary = NSDictionary(contentsOfFile: path), - let apiKey = dictionary["GeocodingKey"] as? String + let dictionary = NSDictionary(contentsOfFile: path), + let apiKey = dictionary["GeocodingKey"] as? String else { assertionFailure("Unable to find the API key") return "" @@ -135,7 +135,8 @@ class OnboardingSearchController: NSViewController { private func setupLabelHidingTimer() { Timer.scheduledTimer(withTimeInterval: 5, - repeats: false) { _ in + repeats: false) + { _ in OperationQueue.main.addOperation { self.setInfoLabel(CLEmptyString) } @@ -375,7 +376,7 @@ class OnboardingSearchController: NSViewController { self.findLocalSearchResultsForTimezones() self.prepareUIForPresentingResults() } - }) + }) } private func presentErrorMessage(_ errorMessage: String) { diff --git a/Clocker/Overall App/DataStore.swift b/Clocker/Overall App/DataStore.swift index 7faa663..d9f1f5f 100644 --- a/Clocker/Overall App/DataStore.swift +++ b/Clocker/Overall App/DataStore.swift @@ -50,14 +50,14 @@ class DataStore: NSObject { if let cloudPreferences = ubiquitousStore.object(forKey: CLDefaultPreferenceKey) as? [Data] { return cloudPreferences } - + guard let preferences = userDefaults.object(forKey: CLDefaultPreferenceKey) as? [Data] else { return [] } return preferences } - + func setTimezones(_ timezones: [Data]?) { userDefaults.set(timezones, forKey: CLDefaultPreferenceKey) // iCloud sync @@ -164,9 +164,9 @@ class DataStore: NSObject { return value == 0 } } - - //MARK: Private - + + // MARK: Private + private func shouldDisplayHelper(_ key: String) -> Bool { guard let value = retrieve(key: key) as? NSNumber else { return false diff --git a/Clocker/Overall App/NetworkManager.swift b/Clocker/Overall App/NetworkManager.swift index 08974f0..fcfe866 100644 --- a/Clocker/Overall App/NetworkManager.swift +++ b/Clocker/Overall App/NetworkManager.swift @@ -41,7 +41,7 @@ extension NetworkManager { let session = URLSession(configuration: configuration) guard let encodedPath = path.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), - let url = URL(string: encodedPath) + let url = URL(string: encodedPath) else { completionHandler(nil, unableToGenerateURL) return nil diff --git a/Clocker/Overall App/Themer.swift b/Clocker/Overall App/Themer.swift index a985c9f..7d53e3b 100644 --- a/Clocker/Overall App/Themer.swift +++ b/Clocker/Overall App/Themer.swift @@ -15,6 +15,7 @@ class Themer: NSObject { case solarizedLight case solarizedDark } + private static var sharedInstance = Themer(index: UserDefaults.standard.integer(forKey: CLThemeKey)) private var effectiveApperanceObserver: NSKeyValueObservation? private var themeIndex: Theme { @@ -47,9 +48,9 @@ class Themer: NSObject { selector: #selector(respondToInterfaceStyle), name: .interfaceStyleDidChange, object: nil) - + if #available(macOS 10.14, *) { - effectiveApperanceObserver = NSApp.observe(\.effectiveAppearance) { [weak self] (app, _) in + effectiveApperanceObserver = NSApp.observe(\.effectiveAppearance) { [weak self] _, _ in if let sSelf = self { sSelf.setAppAppearance() NotificationCenter.default.post(name: .themeDidChangeNotification, object: nil) @@ -92,12 +93,13 @@ extension Themer { self.setAppAppearance() } } - - //MARK: Color + + // MARK: Color + func sliderKnobColor() -> NSColor { switch themeIndex { case .light: - return NSColor(deviceRed: 255.0, green: 255.0, blue: 255, alpha: 0.9) + return NSColor(deviceRed: 255.0, green: 255.0, blue: 255, alpha: 0.9) case .system: return retrieveCurrentSystem() == .light ? NSColor(deviceRed: 255.0, green: 255.0, blue: 255, alpha: 0.9) : NSColor(deviceRed: 0.0, green: 0.0, blue: 0, alpha: 0.9) default: @@ -108,7 +110,7 @@ extension Themer { func sliderRightColor() -> NSColor { switch themeIndex { case .dark: - return NSColor.white + return NSColor.white default: return NSColor.gray } @@ -132,7 +134,7 @@ extension Themer { return themeIndex == .light ? NSColor.white : NSColor(deviceRed: 55.0 / 255.0, green: 71.0 / 255.0, blue: 79.0 / 255.0, alpha: 1.0) } - + func textBackgroundColor() -> NSColor { if #available(macOS 10.14, *) { switch themeIndex { @@ -172,8 +174,9 @@ extension Themer { return themeIndex == .light ? NSColor.black : NSColor.white } - - //MARK: Images + + // MARK: Images + func shutdownImage() -> NSImage { if let symbolImageForShutdown = symbolImage(for: "ellipsis.circle") { return symbolImageForShutdown @@ -190,7 +193,7 @@ extension Themer { if let symbolImageForPreference = symbolImage(for: "plus") { return symbolImageForPreference } - + return fallbackImageProvider(NSImage(named: NSImage.Name("Settings"))!, NSImage(named: NSImage.Name("Settings-White"))!, NSImage(named: NSImage.actionTemplateName)!, @@ -202,7 +205,7 @@ extension Themer { if let pinImage = symbolImage(for: "macwindow.on.rectangle") { return pinImage } - + return fallbackImageProvider(NSImage(named: NSImage.Name("Float"))!, NSImage(named: NSImage.Name("Float-White"))!, NSImage(named: NSImage.Name("Pin"))!, @@ -225,7 +228,7 @@ extension Themer { if let symbolImage = symbolImage(for: "sunset.fill") { return symbolImage } - + return fallbackImageProvider(NSImage(named: NSImage.Name("Sunset"))!, NSImage(named: NSImage.Name("WhiteSunset"))!, NSImage(named: NSImage.Name("Sunset Dynamic"))!, @@ -237,7 +240,7 @@ extension Themer { if let symbolImage = symbolImage(for: "xmark") { return symbolImage } - + return fallbackImageProvider(NSImage(named: NSImage.Name("Remove"))!, NSImage(named: NSImage.Name("WhiteRemove"))!, NSImage(named: NSImage.Name("Remove Dynamic"))!, @@ -317,7 +320,7 @@ extension Themer { if let symbolImageForPreference = symbolImage(for: "plus") { return symbolImageForPreference } - + return fallbackImageProvider(NSImage(named: NSImage.Name("Add Icon"))!, NSImage(named: NSImage.Name("Add White"))!, NSImage(named: .addDynamicIcon)!, @@ -402,21 +405,21 @@ extension Themer { return removeImage() } - - //MARK: Debug Description - + + // MARK: Debug Description + override var debugDescription: String { if themeIndex == .system { return "System Theme is \(retrieveCurrentSystem())" } return "Current Theme is \(themeIndex)" } - + override var description: String { return debugDescription } - - //MARK: Private + + // MARK: Private private func symbolImage(for name: String) -> NSImage? { assert(name.isEmpty == false) @@ -428,7 +431,7 @@ extension Themer { return nil } - + private func retrieveCurrentSystem() -> Theme { if #available(OSX 10.14, *) { if let appleInterfaceStyle = UserDefaults.standard.object(forKey: "AppleInterfaceStyle") as? String { @@ -439,7 +442,7 @@ extension Themer { } return .light } - + private func setAppAppearance() { if #available(OSX 10.14, *) { var appAppearance = NSAppearance(named: .aqua) @@ -452,12 +455,13 @@ extension Themer { NSApp.appearance = appAppearance } } - + private func fallbackImageProvider(_ lightImage: NSImage, _ darkImage: NSImage, _ systemImage: NSImage, _ solarizedLightImage: NSImage, - _ solarizedDarkImage: NSImage) -> NSImage { + _ solarizedDarkImage: NSImage) -> NSImage + { if #available(macOS 10.14, *) { switch themeIndex { case .light: @@ -474,7 +478,5 @@ extension Themer { } return themeIndex == .light ? lightImage : darkImage - } - } diff --git a/Clocker/Overall App/Timer.swift b/Clocker/Overall App/Timer.swift index 0cbed8a..3201cac 100644 --- a/Clocker/Overall App/Timer.swift +++ b/Clocker/Overall App/Timer.swift @@ -118,7 +118,7 @@ open class Repeater: Equatable { } /// Handler typealias - public typealias Observer = ((Repeater) -> Void) + public typealias Observer = (Repeater) -> Void /// Token assigned to the observer public typealias ObserverToken = UInt64 diff --git a/Clocker/Overall App/VersionUpdateHandler.swift b/Clocker/Overall App/VersionUpdateHandler.swift index 88a4600..4d562f0 100644 --- a/Clocker/Overall App/VersionUpdateHandler.swift +++ b/Clocker/Overall App/VersionUpdateHandler.swift @@ -172,7 +172,7 @@ class VersionUpdateHandler: NSObject { lastVersionCopy = "0" } var newVersionFound = false - var details: String = "" + var details = "" let versions = dict.keys.sorted() diff --git a/Clocker/Panel/Data Layer/TimezoneDataOperations.swift b/Clocker/Panel/Data Layer/TimezoneDataOperations.swift index f3d6c5f..9be80f8 100644 --- a/Clocker/Panel/Data Layer/TimezoneDataOperations.swift +++ b/Clocker/Panel/Data Layer/TimezoneDataOperations.swift @@ -368,7 +368,7 @@ extension TimezoneDataOperations { to: Date()) guard let lat = dataObject.latitude, - let long = dataObject.longitude + let long = dataObject.longitude else { assertionFailure("Data was unexpectedly nil.") return diff --git a/Clocker/Panel/Notes Popover/NotesPopover.swift b/Clocker/Panel/Notes Popover/NotesPopover.swift index d26e44e..f140883 100644 --- a/Clocker/Panel/Notes Popover/NotesPopover.swift +++ b/Clocker/Panel/Notes Popover/NotesPopover.swift @@ -224,7 +224,7 @@ class NotesPopover: NSViewController { } completionHandler(completedDate) - }) + }) } catch { assertionFailure("Failed to successfully initialize DataDetector") completionHandler(nil) @@ -322,7 +322,8 @@ class NotesPopover: NSViewController { } private func updateTimezoneInDefaultPreferences(with override: Int, - _: OverrideType) { + _: OverrideType) + { let timezones = DataStore.shared().timezones() var timezoneObjects: [TimezoneData] = [] @@ -391,7 +392,8 @@ class NotesPopover: NSViewController { timezone: model.timezone(), alertIndex: alertIndex, reminderDate: reminderPicker.dateValue, - additionalNotes: model.note) { + additionalNotes: model.note) + { showSuccessMessage() } } diff --git a/Clocker/Panel/PanelController.swift b/Clocker/Panel/PanelController.swift index af798f7..310ee03 100644 --- a/Clocker/Panel/PanelController.swift +++ b/Clocker/Panel/PanelController.swift @@ -154,7 +154,8 @@ class PanelController: ParentPanelController { } if let statusWindow = statusBackgroundWindow, - let statusButton = statusView { + let statusButton = statusView + { var statusItemFrame = statusWindow.convertToScreen(statusButton.frame) var statusItemScreen = NSScreen.main var testPoint = statusItemFrame.origin @@ -186,16 +187,16 @@ class PanelController: ParentPanelController { let preferences = DataStore.shared().timezones() guard let theme = DataStore.shared().retrieve(key: CLThemeKey) as? NSNumber, - let displayFutureSliderKey = DataStore.shared().retrieve(key: CLThemeKey) as? NSNumber, - let showAppInForeground = DataStore.shared().retrieve(key: CLShowAppInForeground) as? NSNumber, - let relativeDateKey = DataStore.shared().retrieve(key: CLRelativeDateKey) as? NSNumber, - let fontSize = DataStore.shared().retrieve(key: CLUserFontSizePreference) as? NSNumber, - let sunriseTime = DataStore.shared().retrieve(key: CLSunriseSunsetTime) as? NSNumber, - let showDayInMenu = DataStore.shared().retrieve(key: CLShowDayInMenu) as? NSNumber, - let showDateInMenu = DataStore.shared().retrieve(key: CLShowDateInMenu) as? NSNumber, - let showPlaceInMenu = DataStore.shared().retrieve(key: CLShowPlaceInMenu) as? NSNumber, - let showUpcomingEventView = DataStore.shared().retrieve(key: CLShowUpcomingEventView) as? String, - let country = Locale.autoupdatingCurrent.regionCode + let displayFutureSliderKey = DataStore.shared().retrieve(key: CLThemeKey) as? NSNumber, + let showAppInForeground = DataStore.shared().retrieve(key: CLShowAppInForeground) as? NSNumber, + let relativeDateKey = DataStore.shared().retrieve(key: CLRelativeDateKey) as? NSNumber, + let fontSize = DataStore.shared().retrieve(key: CLUserFontSizePreference) as? NSNumber, + let sunriseTime = DataStore.shared().retrieve(key: CLSunriseSunsetTime) as? NSNumber, + let showDayInMenu = DataStore.shared().retrieve(key: CLShowDayInMenu) as? NSNumber, + let showDateInMenu = DataStore.shared().retrieve(key: CLShowDateInMenu) as? NSNumber, + let showPlaceInMenu = DataStore.shared().retrieve(key: CLShowPlaceInMenu) as? NSNumber, + let showUpcomingEventView = DataStore.shared().retrieve(key: CLShowUpcomingEventView) as? String, + let country = Locale.autoupdatingCurrent.regionCode else { return } diff --git a/Clocker/Panel/ParentPanelController+ModernSlider.swift b/Clocker/Panel/ParentPanelController+ModernSlider.swift index 7d2d75e..d3f799c 100644 --- a/Clocker/Panel/ParentPanelController+ModernSlider.swift +++ b/Clocker/Panel/ParentPanelController+ModernSlider.swift @@ -127,7 +127,7 @@ extension ParentPanelController { } public func setDefaultDateLabel(_ index: Int) -> Int { - let futureSliderDayPreference = DataStore.shared().retrieve(key: CLFutureSliderRange) as? NSNumber ?? 5 + let futureSliderDayPreference = DataStore.shared().retrieve(key: CLFutureSliderRange) as? NSNumber ?? 5 let futureSliderDayRange = (futureSliderDayPreference.intValue + 1) let totalCount = (PanelConstants.modernSliderPointsInADay * futureSliderDayRange * 2) + 1 let centerPoint = Int(ceil(Double(totalCount / 2))) diff --git a/Clocker/Panel/ParentPanelController.swift b/Clocker/Panel/ParentPanelController.swift index 2583d4c..aa24974 100644 --- a/Clocker/Panel/ParentPanelController.swift +++ b/Clocker/Panel/ParentPanelController.swift @@ -188,7 +188,8 @@ class ParentPanelController: NSWindowController { object: nil) NotificationCenter.default.addObserver(forName: NSUbiquitousKeyValueStore.didChangeExternallyNotification, object: self, - queue: OperationQueue.main) { [weak self] _ in + queue: OperationQueue.main) + { [weak self] _ in if let sSelf = self { sSelf.mainTableView.reloadData() sSelf.setScrollViewConstraint() @@ -250,7 +251,7 @@ class ParentPanelController: NSWindowController { coordinates: nil) } } - + private func updateHomeObject(with customLabel: String, coordinates: CLLocationCoordinate2D?) { let timezones = DataStore.shared().timezones() @@ -415,8 +416,9 @@ class ParentPanelController: NSWindowController { if let note = object?.note, note.isEmpty == false { newHeight += 20 } else if DataStore.shared().shouldDisplay(.dstTransitionInfo), - let obj = object, - TimezoneDataOperations(with: obj).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) != nil { + let obj = object, + TimezoneDataOperations(with: obj).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) != nil + { newHeight += 20 } } @@ -603,8 +605,9 @@ class ParentPanelController: NSWindowController { let current = preferences[$0] if $0 < mainTableView.numberOfRows, - let cellView = mainTableView.view(atColumn: 0, row: $0, makeIfNecessary: false) as? TimezoneCellView, - let model = TimezoneData.customObject(from: current) { + let cellView = mainTableView.view(atColumn: 0, row: $0, makeIfNecessary: false) as? TimezoneCellView, + let model = TimezoneData.customObject(from: current) + { if let futureSliderCell = futureSlider.cell as? CustomSliderCell, futureSliderCell.tracking == true { return } @@ -624,7 +627,8 @@ class ParentPanelController: NSWindowController { if let note = model.note, !note.isEmpty { cellView.noteLabel.stringValue = note } else if DataStore.shared().shouldDisplay(.dstTransitionInfo), - let value = TimezoneDataOperations(with: model).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) { + let value = TimezoneDataOperations(with: model).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) + { cellView.noteLabel.stringValue = value } else { cellView.noteLabel.stringValue = CLEmptyString @@ -724,7 +728,8 @@ class ParentPanelController: NSWindowController { @IBAction func calendarButtonAction(_ sender: NSButton) { if sender.title == NSLocalizedString("Click here to start.", - comment: "Button Title for no Calendar access") { + comment: "Button Title for no Calendar access") + { showPermissionsWindow() } else { retrieveCalendarEvents() @@ -815,7 +820,8 @@ class ParentPanelController: NSWindowController { if let events = eventCenter.eventsForDate[NSCalendar.autoupdatingCurrent.startOfDay(for: now)], events.isEmpty == false { OperationQueue.main.addOperation { if self.upcomingEventCollectionView != nil, - let upcomingEvents = eventCenter.upcomingEventsForDay(events) { + let upcomingEvents = eventCenter.upcomingEventsForDay(events) + { self.upcomingEventsDataSource.updateEventsDataSource(upcomingEvents) self.upcomingEventCollectionView.reloadData() return @@ -982,7 +988,7 @@ class ParentPanelController: NSWindowController { @objc func openCrowdin() { guard let localizationURL = URL(string: AboutUsConstants.CrowdInLocalizationLink), - let languageCode = Locale.preferredLanguages.first else { return } + let languageCode = Locale.preferredLanguages.first else { return } NSWorkspace.shared.open(localizationURL) @@ -996,7 +1002,7 @@ class ParentPanelController: NSWindowController { NSWorkspace.shared.open(sourceURL) } - + @objc func openFAQs() { guard let sourceURL = URL(string: AboutUsConstants.FAQsLink) else { return } @@ -1077,19 +1083,19 @@ extension ParentPanelController: NSSharingServicePickerDelegate { /// London - 01:17:01 private func retrieveAllTimes() -> String { var clipboardCopy = String() - + // Get all timezones let timezones = DataStore.shared().timezones() - + if timezones.isEmpty { return clipboardCopy } - + // Sort them in ascending order let sortedByTime = timezones.sorted { obj1, obj2 -> Bool in let system = NSTimeZone.system guard let object1 = TimezoneData.customObject(from: obj1), - let object2 = TimezoneData.customObject(from: obj2) + let object2 = TimezoneData.customObject(from: obj2) else { assertionFailure("Data was unexpectedly nil") return false @@ -1103,19 +1109,20 @@ extension ParentPanelController: NSSharingServicePickerDelegate { return difference1 > difference2 } - + // Grab date in first place and store it as local variable guard let earliestTimezone = TimezoneData.customObject(from: sortedByTime.first) else { return clipboardCopy } - + let timezoneOperations = TimezoneDataOperations(with: earliestTimezone) var sectionTitle = timezoneOperations.todaysDate(with: 0) // TODO: Take slider value into consideration clipboardCopy.append("\(sectionTitle)\n") - + stride(from: 0, to: sortedByTime.count, by: 1).forEach { if $0 < sortedByTime.count, - let dataModel = TimezoneData.customObject(from: sortedByTime[$0]) { + let dataModel = TimezoneData.customObject(from: sortedByTime[$0]) + { let dataOperations = TimezoneDataOperations(with: dataModel) let date = dataOperations.todaysDate(with: 0) let time = dataOperations.time(with: 0) diff --git a/Clocker/Panel/Rate Controller/ReviewController.swift b/Clocker/Panel/Rate Controller/ReviewController.swift index b72d20d..fdfa2d4 100644 --- a/Clocker/Panel/Rate Controller/ReviewController.swift +++ b/Clocker/Panel/Rate Controller/ReviewController.swift @@ -42,12 +42,12 @@ final class ReviewController { // Check if the app has been installed for atleast 7 days guard let install = storage.object(forKey: Keys.install) as? Date, - install.timeIntervalSinceNow < minInstall + install.timeIntervalSinceNow < minInstall else { return false } // If we have never been prompted before, go ahead and prompt guard let lastPrompt = storage.object(forKey: Keys.lastPrompt) as? Date, - let lastVersion = storage.object(forKey: Keys.lastVersion) as? String + let lastVersion = storage.object(forKey: Keys.lastVersion) as? String else { return true } // Minimum interval between two versions should be 3 months diff --git a/Clocker/Panel/UI/TimezoneCellView.swift b/Clocker/Panel/UI/TimezoneCellView.swift index b5977a7..7e042ea 100644 --- a/Clocker/Panel/UI/TimezoneCellView.swift +++ b/Clocker/Panel/UI/TimezoneCellView.swift @@ -39,7 +39,7 @@ class TimezoneCellView: NSTableCellView { func setupLayout() { guard let relativeFont = relativeDate.font, - let sunriseFont = sunriseSetTime.font + let sunriseFont = sunriseSetTime.font else { assertionFailure("Unable to convert to NSString") return @@ -128,7 +128,7 @@ class TimezoneCellView: NSTableCellView { } guard let customFont = customName.font, - let timeFont = time.font + let timeFont = time.font else { assertionFailure("User Font Size is in unexpectedly nil") return @@ -165,7 +165,7 @@ class TimezoneCellView: NSTableCellView { } guard let panelTableView = searchView as? PanelTableView, - let enclosingScroller = panelTableView.enclosingScrollView + let enclosingScroller = panelTableView.enclosingScrollView else { // We might be coming from the preview tableview! return diff --git a/Clocker/Panel/UI/TimezoneDataSource.swift b/Clocker/Panel/UI/TimezoneDataSource.swift index 76de67c..6e0aebb 100644 --- a/Clocker/Panel/UI/TimezoneDataSource.swift +++ b/Clocker/Panel/UI/TimezoneDataSource.swift @@ -144,7 +144,7 @@ extension TimezoneDataSource: NSTableViewDataSource, NSTableViewDelegate { panelController.deleteTimezone(at: row) } - }) + }) if #available(OSX 11.0, *) { swipeToDelete.image = Themer.shared().filledTrashImage() diff --git a/Clocker/Panel/Upcoming Events/UpcomingEventViewItem.swift b/Clocker/Panel/Upcoming Events/UpcomingEventViewItem.swift index effe786..19810f6 100644 --- a/Clocker/Panel/Upcoming Events/UpcomingEventViewItem.swift +++ b/Clocker/Panel/Upcoming Events/UpcomingEventViewItem.swift @@ -40,7 +40,8 @@ class UpcomingEventViewItem: NSCollectionViewItem { _ color: NSColor, _ link: URL?, _ delegate: UpcomingEventPanelDelegate?, - _ isCancelled: Bool) { + _ isCancelled: Bool) + { if leadingConstraint.constant != UpcomingEventViewItem.EventLeadingConstraint / 2 { leadingConstraint.animator().constant = UpcomingEventViewItem.EventLeadingConstraint / 2 } diff --git a/Clocker/Preferences/About/AboutViewController.swift b/Clocker/Preferences/About/AboutViewController.swift index 81be4ed..1d6f696 100644 --- a/Clocker/Preferences/About/AboutViewController.swift +++ b/Clocker/Preferences/About/AboutViewController.swift @@ -99,7 +99,7 @@ class AboutViewController: ParentViewController { @IBAction func openMyTwitter(_: Any) { guard let twitterURL = URL(string: AboutUsConstants.TwitterLink), - let countryCode = Locale.autoupdatingCurrent.regionCode else { return } + let countryCode = Locale.autoupdatingCurrent.regionCode else { return } NSWorkspace.shared.open(twitterURL) @@ -110,7 +110,7 @@ class AboutViewController: ParentViewController { @IBAction func viewSource(_: Any) { guard let sourceURL = URL(string: AboutUsConstants.AppStoreLink), - let countryCode = Locale.autoupdatingCurrent.regionCode else { return } + let countryCode = Locale.autoupdatingCurrent.regionCode else { return } NSWorkspace.shared.open(sourceURL) @@ -132,7 +132,7 @@ class AboutViewController: ParentViewController { @IBAction func openGitHub(_: Any) { guard let localizationURL = URL(string: AboutUsConstants.CrowdInLocalizationLink), - let languageCode = Locale.preferredLanguages.first else { return } + let languageCode = Locale.preferredLanguages.first else { return } NSWorkspace.shared.open(localizationURL) diff --git a/Clocker/Preferences/App Feedback/AppFeedbackWindowController.swift b/Clocker/Preferences/App Feedback/AppFeedbackWindowController.swift index ea12d94..0cce1b5 100644 --- a/Clocker/Preferences/App Feedback/AppFeedbackWindowController.swift +++ b/Clocker/Preferences/App Feedback/AppFeedbackWindowController.swift @@ -80,7 +80,8 @@ class AppFeedbackWindowController: NSWindowController { themeDidChangeNotification = NotificationCenter.default.addObserver(forName: .themeDidChangeNotification, object: nil, - queue: OperationQueue.main) { _ in + queue: OperationQueue.main) + { _ in self.window?.backgroundColor = Themer.shared().mainBackgroundColor() self.setup() } @@ -139,9 +140,9 @@ class AppFeedbackWindowController: NSWindowController { let preferences = DataStore.shared().timezones() guard let theme = DataStore.shared().retrieve(key: CLThemeKey) as? NSNumber, - let displayFutureSliderKey = DataStore.shared().retrieve(key: CLThemeKey) as? NSNumber, - let relativeDateKey = DataStore.shared().retrieve(key: CLRelativeDateKey) as? NSNumber, - let country = Locale.autoupdatingCurrent.regionCode + let displayFutureSliderKey = DataStore.shared().retrieve(key: CLThemeKey) as? NSNumber, + let relativeDateKey = DataStore.shared().retrieve(key: CLRelativeDateKey) as? NSNumber, + let country = Locale.autoupdatingCurrent.regionCode else { return "Error" } @@ -182,7 +183,7 @@ class AppFeedbackWindowController: NSWindowController { private func retrieveDataForSending() -> [String: String] { guard let shortVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String, - let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String + let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as? String else { return [:] } @@ -285,7 +286,7 @@ class AppFeedbackWindowController: NSWindowController { @IBAction func navigateToSupportTwitter(_: Any) { guard let twitterURL = URL(string: AboutUsConstants.TwitterLink), - let countryCode = Locale.autoupdatingCurrent.regionCode else { return } + let countryCode = Locale.autoupdatingCurrent.regionCode else { return } NSWorkspace.shared.open(twitterURL) @@ -311,7 +312,7 @@ extension AppFeedbackWindowController: NSWindowDelegate { func bringPreferencesWindowToFront() { let windows = NSApplication.shared.windows let prefWindow = windows.first(where: { window in - return window.identifier == NSUserInterfaceItemIdentifier("Preferences") + window.identifier == NSUserInterfaceItemIdentifier("Preferences") }) if let prefW = prefWindow { prefW.makeKeyAndOrderFront(self) diff --git a/Clocker/Preferences/Appearance/AppearanceViewController.swift b/Clocker/Preferences/Appearance/AppearanceViewController.swift index 8294fe1..79558af 100644 --- a/Clocker/Preferences/Appearance/AppearanceViewController.swift +++ b/Clocker/Preferences/Appearance/AppearanceViewController.swift @@ -188,7 +188,8 @@ class AppearanceViewController: ParentViewController { refresh(panel: true, floating: true) if let selectedFormat = sender.selectedItem?.title, - selectedFormat.contains("ss") { + selectedFormat.contains("ss") + { Logger.info("Selected format contains timezone format") guard let panelController = PanelController.panel() else { return } panelController.pauseTimer() diff --git a/Clocker/Preferences/Calendar/CalendarViewController.swift b/Clocker/Preferences/Calendar/CalendarViewController.swift index d817478..fd17568 100644 --- a/Clocker/Preferences/Calendar/CalendarViewController.swift +++ b/Clocker/Preferences/Calendar/CalendarViewController.swift @@ -243,13 +243,15 @@ extension CalendarViewController: NSTableViewDelegate { func tableView(_ tableView: NSTableView, viewFor _: NSTableColumn?, row: Int) -> NSView? { if let currentSource = calendars[row] as? String, - let message = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "sourceCellView"), owner: self) as? SourceTableViewCell { + let message = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "sourceCellView"), owner: self) as? SourceTableViewCell + { message.sourceName.stringValue = currentSource return message } if let currentSource = calendars[row] as? CalendarInfo, - let calendarCell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "calendarCellView"), owner: self) as? CalendarTableViewCell { + let calendarCell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "calendarCellView"), owner: self) as? CalendarTableViewCell + { calendarCell.calendarName.stringValue = currentSource.calendar.title calendarCell.calendarSelected.state = currentSource.selected ? NSControl.StateValue.on : NSControl.StateValue.off calendarCell.calendarSelected.target = self diff --git a/Clocker/Preferences/General/PreferencesDataSource.swift b/Clocker/Preferences/General/PreferencesDataSource.swift index 27527ba..63d464d 100644 --- a/Clocker/Preferences/General/PreferencesDataSource.swift +++ b/Clocker/Preferences/General/PreferencesDataSource.swift @@ -104,7 +104,8 @@ extension PreferencesDataSource: NSTableViewDataSource { var selectedDataSource: TimezoneData? if selectedTimezones.count > row, - let model = TimezoneData.customObject(from: selectedTimezones[row]) { + let model = TimezoneData.customObject(from: selectedTimezones[row]) + { selectedDataSource = model } @@ -163,7 +164,7 @@ extension PreferencesDataSource: NSTableViewDataSource { "Old Label": dataObject.customLabel ?? "Error", "New Label": formattedValue, ], - for: "Custom Label Changed") + for: "Custom Label Changed") dataObject.setLabel(formattedValue) @@ -176,7 +177,7 @@ extension PreferencesDataSource: NSTableViewDataSource { "Selected Timezone Count": selectedTimezones.count, "Current Row": row, ], - for: "Error in selected row count") + for: "Error in selected row count") } } diff --git a/Clocker/Preferences/General/PreferencesViewController.swift b/Clocker/Preferences/General/PreferencesViewController.swift index e2a30a0..df14bfe 100644 --- a/Clocker/Preferences/General/PreferencesViewController.swift +++ b/Clocker/Preferences/General/PreferencesViewController.swift @@ -19,7 +19,6 @@ struct PreferencesConstants { } class PreferencesViewController: ParentViewController { - @IBOutlet private var placeholderLabel: NSTextField! @IBOutlet private var timezoneTableView: NSTableView! @IBOutlet private var availableTimezoneTableView: NSTableView! @@ -43,14 +42,14 @@ class PreferencesViewController: ParentViewController { @IBOutlet var startAtLoginLabel: NSTextField! @IBOutlet var startupCheckbox: NSButton! - + // Sorting private var arePlacesSortedInAscendingOrder = false private var arePlacesSortedInAscendingTimezoneOrder = false private var isTimezoneSortOptionSelected = false private var isTimezoneNameSortOptionSelected = false private var isLabelOptionSelected = false - + private var isActivityInProgress = false { didSet { OperationQueue.main.addOperation { @@ -73,14 +72,12 @@ class PreferencesViewController: ParentViewController { private lazy var startupManager = StartupManager() private var dataTask: URLSessionDataTask? = .none - private lazy var notimezoneView: NoTimezoneView? = { - NoTimezoneView(frame: tableview.frame) - }() + private lazy var notimezoneView: NoTimezoneView? = NoTimezoneView(frame: tableview.frame) private var geocodingKey: String = { guard let path = Bundle.main.path(forResource: "Keys", ofType: "plist"), - let dictionary = NSDictionary(contentsOfFile: path), - let apiKey = dictionary["GeocodingKey"] as? String + let dictionary = NSDictionary(contentsOfFile: path), + let apiKey = dictionary["GeocodingKey"] as? String else { assertionFailure("Unable to find the API key") return "" @@ -88,8 +85,6 @@ class PreferencesViewController: ParentViewController { return apiKey }() - - override func viewDidLoad() { super.viewDidLoad() @@ -97,10 +92,11 @@ class PreferencesViewController: ParentViewController { selector: #selector(refreshTimezoneTableView), name: NSNotification.Name.customLabelChanged, object: nil) - + NotificationCenter.default.addObserver(forName: NSUbiquitousKeyValueStore.didChangeExternallyNotification, object: self, - queue: OperationQueue.main) { [weak self] _ in + queue: OperationQueue.main) + { [weak self] _ in if let sSelf = self { sSelf.refreshTimezoneTableView() } @@ -347,9 +343,10 @@ extension PreferencesViewController: NSTableViewDataSource, NSTableViewDelegate for: "favouriteRemoved") if let appDelegate = NSApplication.shared.delegate as? AppDelegate, - let menubarFavourites = DataStore.shared().menubarTimezones(), - menubarFavourites.isEmpty, - DataStore.shared().shouldDisplay(.showMeetingInMenubar) == false { + let menubarFavourites = DataStore.shared().menubarTimezones(), + menubarFavourites.isEmpty, + DataStore.shared().shouldDisplay(.showMeetingInMenubar) == false + { appDelegate.invalidateMenubarTimer(true) } @@ -475,7 +472,7 @@ extension PreferencesViewController { self.prepareUIForPresentingResults() } - }) + }) } } @@ -893,7 +890,7 @@ extension PreferencesViewController { let system = NSTimeZone.system guard let object1 = TimezoneData.customObject(from: obj1), - let object2 = TimezoneData.customObject(from: obj2) + let object2 = TimezoneData.customObject(from: obj2) else { assertionFailure("Data was unexpectedly nil") return false @@ -921,7 +918,7 @@ extension PreferencesViewController { let sortedLabels = selectedTimeZones.sorted { obj1, obj2 -> Bool in guard let object1 = TimezoneData.customObject(from: obj1), - let object2 = TimezoneData.customObject(from: obj2) + let object2 = TimezoneData.customObject(from: obj2) else { assertionFailure("Data was unexpectedly nil") return false @@ -945,7 +942,7 @@ extension PreferencesViewController { let sortedByAddress = selectedTimeZones.sorted { obj1, obj2 -> Bool in guard let object1 = TimezoneData.customObject(from: obj1), - let object2 = TimezoneData.customObject(from: obj2) + let object2 = TimezoneData.customObject(from: obj2) else { assertionFailure("Data was unexpectedly nil") return false @@ -1012,7 +1009,7 @@ extension PreferencesViewController: PreferenceSelectionUpdates { let sortedTimezones = selectedTimeZones.sorted { obj1, obj2 -> Bool in guard let object1 = TimezoneData.customObject(from: obj1), - let object2 = TimezoneData.customObject(from: obj2) + let object2 = TimezoneData.customObject(from: obj2) else { assertionFailure("Data was unexpectedly nil") return false diff --git a/Clocker/Preferences/Menu Bar/StatusContainerView.swift b/Clocker/Preferences/Menu Bar/StatusContainerView.swift index 66808f0..282d598 100644 --- a/Clocker/Preferences/Menu Bar/StatusContainerView.swift +++ b/Clocker/Preferences/Menu Bar/StatusContainerView.swift @@ -33,10 +33,12 @@ func compactWidth(for timezone: TimezoneData) -> Int { if timeFormat == DateFormat.twelveHour || timeFormat == DateFormat.twelveHourWithSeconds || timeFormat == DateFormat.twelveHourWithZero - || timeFormat == DateFormat.twelveHourWithSeconds { + || timeFormat == DateFormat.twelveHourWithSeconds + { totalWidth += 20 } else if timeFormat == DateFormat.twentyFourHour - || timeFormat == DateFormat.twentyFourHourWithSeconds { + || timeFormat == DateFormat.twentyFourHourWithSeconds + { totalWidth += 0 } diff --git a/Clocker/Preferences/Menu Bar/StatusItemHandler.swift b/Clocker/Preferences/Menu Bar/StatusItemHandler.swift index dcdcc70..f5b3a79 100644 --- a/Clocker/Preferences/Menu Bar/StatusItemHandler.swift +++ b/Clocker/Preferences/Menu Bar/StatusItemHandler.swift @@ -115,15 +115,16 @@ class StatusItemHandler: NSObject { userNotificationsDidChangeNotif = center.addObserver(forName: UserDefaults.didChangeNotification, object: self, - queue: mainQueue) { _ in + queue: mainQueue) + { _ in self.setupStatusItem() } - - NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.willSleepNotification, object: nil, queue: OperationQueue.main) { notification in + + NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.willSleepNotification, object: nil, queue: OperationQueue.main) { _ in self.menubarTimer?.invalidate() } - - NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: OperationQueue.main) { notification in + + NSWorkspace.shared.notificationCenter.addObserver(forName: NSWorkspace.didWakeNotification, object: nil, queue: OperationQueue.main) { _ in self.setupStatusItem() } } @@ -183,7 +184,7 @@ class StatusItemHandler: NSObject { if let strongSelf = self { strongSelf.refresh() } - }) + }) // Tolerance, even a small amount, has a positive imapct on the power usage. As a rule, we set it to 10% of the interval menubarTimer?.tolerance = shouldDisplaySeconds ? 0.5 : 20 diff --git a/Clocker/Preferences/Menu Bar/UpcomingEventStatusItemView.swift b/Clocker/Preferences/Menu Bar/UpcomingEventStatusItemView.swift index ea1b014..6f6818b 100644 --- a/Clocker/Preferences/Menu Bar/UpcomingEventStatusItemView.swift +++ b/Clocker/Preferences/Menu Bar/UpcomingEventStatusItemView.swift @@ -65,6 +65,7 @@ class UpcomingEventStatusItemView: NSView { ]) } + @available(*, unavailable) required init?(coder _: NSCoder) { fatalError("init(coder:) has not been implemented") } diff --git a/Clocker/Preferences/OneWindowController.swift b/Clocker/Preferences/OneWindowController.swift index ebc08c5..87a2abe 100644 --- a/Clocker/Preferences/OneWindowController.swift +++ b/Clocker/Preferences/OneWindowController.swift @@ -50,7 +50,7 @@ class OneWindowController: NSWindowController { window?.backgroundColor = Themer.shared().mainBackgroundColor() window?.identifier = NSUserInterfaceItemIdentifier("Preferences") } - + private func setupToolbarImages() { guard let tabViewController = contentViewController as? CenteredTabViewController else { return @@ -78,18 +78,18 @@ class OneWindowController: NSWindowController { } // MARK: Public - + func openPermissionsPane() { openPreferenceTab(at: 3) NSApp.activate(ignoringOtherApps: true) } - + // Action mapped to the + button in the PanelController. We should always open the General Pane when the + button is clicked. func openGeneralPane() { openPreferenceTab(at: 0) NSApp.activate(ignoringOtherApps: true) } - + private func openPreferenceTab(at index: Int) { guard let window = window else { return