From efba5a7d8ba3f97770928ea370e6f1b7bffa3c29 Mon Sep 17 00:00:00 2001 From: Abhishek Banthia <8280282+n0shake@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:59:03 -0400 Subject: [PATCH] Move constants to an enum. --- Clocker/AppDelegate.swift | 18 ++--- .../ClockerUnitTests/AppDelegateTests.swift | 8 +- .../ClockerUnitTests/ClockerUnitTests.swift | 8 +- .../SearchDataSourceTests.swift | 2 +- .../StandardMenubarHandlerTests.swift | 6 +- Clocker/ClockerUnitTests/ThemerTests.swift | 2 +- .../Date Additions/Date+TimeAgo.swift | 2 +- .../CalendarHandler.swift | 14 ++-- .../OnboardingParentViewController.swift | 12 +-- .../OnboardingSearchController.swift | 38 ++++----- Clocker/Overall App/AppDefaults.swift | 40 +++++----- Clocker/Overall App/ConfigExport.swift | 46 +++++------ Clocker/Overall App/DataStore.swift | 52 ++++++------ Clocker/Overall App/Strings.swift | 79 ++++++++++--------- Clocker/Overall App/Themer.swift | 4 +- 15 files changed, 167 insertions(+), 164 deletions(-) diff --git a/Clocker/AppDelegate.swift b/Clocker/AppDelegate.swift index 9bab96d..06bc54b 100644 --- a/Clocker/AppDelegate.swift +++ b/Clocker/AppDelegate.swift @@ -10,7 +10,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate { private lazy var floatingWindow = FloatingWindowController.shared() internal lazy var panelController = PanelController(windowNibName: .panel) private var statusBarHandler: StatusItemHandler! - private let store: VersionUpdateHandler = VersionUpdateHandler(with: DataStore.shared()) + private let versionUpdateHandler: VersionUpdateHandler = VersionUpdateHandler(with: DataStore.shared()) override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change _: [NSKeyValueChangeKey: Any]?, context _: UnsafeMutableRawPointer?) { if let path = keyPath, path == PreferencesConstants.hotKeyPathIdentifier { @@ -82,16 +82,16 @@ open class AppDelegate: NSObject, NSApplicationDelegate { } @objc func hideFromDock() { - UserDefaults.standard.set(0, forKey: CLAppDisplayOptions) + UserDefaults.standard.set(0, forKey: UserDefaultKeys.appDisplayOptions) NSApp.setActivationPolicy(.accessory) } private var controller: OnboardingController? private func showOnboardingFlowIfEligible() { - let isTestInProgress = ProcessInfo.processInfo.arguments.contains(CLOnboardingTestsLaunchArgument) + let isTestInProgress = ProcessInfo.processInfo.arguments.contains(UserDefaultKeys.onboardingTestsLaunchArgument) let shouldLaunchOnboarding = - (DataStore.shared().retrieve(key: CLShowOnboardingFlow) == nil + (DataStore.shared().retrieve(key: UserDefaultKeys.showOnboardingFlow) == nil && DataStore.shared().timezones().isEmpty) || isTestInProgress @@ -116,7 +116,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate { // Install the menubar item! statusBarHandler = StatusItemHandler(with: DataStore.shared()) - if ProcessInfo.processInfo.arguments.contains(CLUITestingLaunchArgument) { + if ProcessInfo.processInfo.arguments.contains(UserDefaultKeys.testingLaunchArgument) { FirebaseApp.configure() ReviewController.setPreviewMode(true) } @@ -130,9 +130,9 @@ open class AppDelegate: NSObject, NSApplicationDelegate { setActivationPolicy() // Set the display mode default as panel! - if let displayMode = defaults.object(forKey: CLShowAppInForeground) as? NSNumber, displayMode.intValue == 1 { + if let displayMode = defaults.object(forKey: UserDefaultKeys.showAppInForeground) as? NSNumber, displayMode.intValue == 1 { showFloatingWindow() - } else if let displayMode = defaults.object(forKey: CLShowAppInForeground) as? Int, displayMode == 1 { + } else if let displayMode = defaults.object(forKey: UserDefaultKeys.showAppInForeground) as? Int, displayMode == 1 { showFloatingWindow() } } @@ -142,7 +142,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate { let defaults = UserDefaults.standard let currentActivationPolicy = NSRunningApplication.current.activationPolicy - let activationPolicy: NSApplication.ActivationPolicy = defaults.integer(forKey: CLAppDisplayOptions) == 0 ? .accessory : .regular + let activationPolicy: NSApplication.ActivationPolicy = defaults.integer(forKey: UserDefaultKeys.appDisplayOptions) == 0 ? .accessory : .regular if currentActivationPolicy != activationPolicy { NSApp.setActivationPolicy(activationPolicy) @@ -234,7 +234,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate { @IBAction open func togglePanel(_ sender: NSButton) { Logger.info("Toggle Panel called with sender state \(sender.state.rawValue)") - let displayMode = UserDefaults.standard.integer(forKey: CLShowAppInForeground) + let displayMode = UserDefaults.standard.integer(forKey: UserDefaultKeys.showAppInForeground) if displayMode == 1 { // No need to call NSApp.activate here since `showFloatingWindow` takes care of this diff --git a/Clocker/ClockerUnitTests/AppDelegateTests.swift b/Clocker/ClockerUnitTests/AppDelegateTests.swift index 494679e..60d84b2 100644 --- a/Clocker/ClockerUnitTests/AppDelegateTests.swift +++ b/Clocker/ClockerUnitTests/AppDelegateTests.swift @@ -71,7 +71,7 @@ class AppDelegateTests: XCTestCase { func testActivationPolicy() { let subject = NSApplication.shared.delegate as? AppDelegate - let previousOption = UserDefaults.standard.integer(forKey: CLAppDisplayOptions) + let previousOption = UserDefaults.standard.integer(forKey: UserDefaultKeys.appDisplayOptions) if previousOption == 0 { XCTAssertEqual(NSApp.activationPolicy(), .accessory) } else { @@ -87,7 +87,7 @@ class AppDelegateTests: XCTestCase { subject?.invalidateMenubarTimer(true) let statusItemHandler = subject?.statusItemForPanel() XCTAssertEqual(statusItemHandler?.statusItem.button?.subviews, []) - XCTAssertEqual(statusItemHandler?.statusItem.button?.title, CLEmptyString) + XCTAssertEqual(statusItemHandler?.statusItem.button?.title, UserDefaultKeys.emptyString) XCTAssertEqual(statusItemHandler?.statusItem.button?.image?.name(), "LightModeIcon") XCTAssertEqual(statusItemHandler?.statusItem.button?.imagePosition, .imageOnly) XCTAssertEqual(statusItemHandler?.statusItem.button?.toolTip, "Clocker") @@ -116,7 +116,7 @@ class AppDelegateTests: XCTestCase { func testStandardModeMenubarSetup() { let olderTimezones = DataStore.shared().timezones() - UserDefaults.standard.set(1, forKey: CLMenubarCompactMode) // Set the menubar mode to standard + UserDefaults.standard.set(1, forKey: UserDefaultKeys.menubarCompactMode) // Set the menubar mode to standard let subject = NSApplication.shared.delegate as? AppDelegate let statusItemHandler = subject?.statusItemForPanel() @@ -142,6 +142,6 @@ class AppDelegateTests: XCTestCase { XCTAssertEqual(subject?.statusItemForPanel().statusItem.button?.subviews.isEmpty, true) // This will be nil for standard mode - UserDefaults.standard.set(0, forKey: CLMenubarCompactMode) // Set the menubar mode back to compact + UserDefaults.standard.set(0, forKey: UserDefaultKeys.menubarCompactMode) // Set the menubar mode back to compact } } diff --git a/Clocker/ClockerUnitTests/ClockerUnitTests.swift b/Clocker/ClockerUnitTests/ClockerUnitTests.swift index e56d6db..c7d16a9 100644 --- a/Clocker/ClockerUnitTests/ClockerUnitTests.swift +++ b/Clocker/ClockerUnitTests/ClockerUnitTests.swift @@ -74,7 +74,7 @@ class ClockerUnitTests: XCTestCase { func testOverridingSecondsComponent_shouldHideSeconds() { let dummyDefaults = UserDefaults.standard - dummyDefaults.set(NSNumber(value: 4), forKey: CLSelectedTimeZoneFormatKey) // 4 is 12 hour with seconds + dummyDefaults.set(NSNumber(value: 4), forKey: UserDefaultKeys.selectedTimeZoneFormatKey) // 4 is 12 hour with seconds let timezoneObjects = [TimezoneData(with: mumbai), TimezoneData(with: auckland), @@ -207,7 +207,7 @@ class ClockerUnitTests: XCTestCase { func testTimezoneFormat() { let dataObject = TimezoneData(with: mumbai) - UserDefaults.standard.set(NSNumber(value: 0), forKey: CLSelectedTimeZoneFormatKey) // Set to 12 hour format + UserDefaults.standard.set(NSNumber(value: 0), forKey: UserDefaultKeys.selectedTimeZoneFormatKey) // Set to 12 hour format dataObject.setShouldOverrideGlobalTimeFormat(0) // Respect Global Preference XCTAssertTrue(dataObject.timezoneFormat(DataStore.shared().timezoneFormat()) == "h:mm a") @@ -246,7 +246,7 @@ class ClockerUnitTests: XCTestCase { func testTimezoneFormatWithDefaultSetAs24HourFormat() { let dataObject = TimezoneData(with: california) - UserDefaults.standard.set(NSNumber(value: 1), forKey: CLSelectedTimeZoneFormatKey) // Set to 24-Hour Format + UserDefaults.standard.set(NSNumber(value: 1), forKey: UserDefaultKeys.selectedTimeZoneFormatKey) // Set to 24-Hour Format dataObject.setShouldOverrideGlobalTimeFormat(0) XCTAssertTrue(dataObject.timezoneFormat(DataStore.shared().timezoneFormat()) == "HH:mm", @@ -285,7 +285,7 @@ class ClockerUnitTests: XCTestCase { func testSecondsDisplayForOverridenTimezone() { let dataObject = TimezoneData(with: california) - UserDefaults.standard.set(NSNumber(value: 1), forKey: CLSelectedTimeZoneFormatKey) // Set to 24-Hour Format + UserDefaults.standard.set(NSNumber(value: 1), forKey: UserDefaultKeys.selectedTimeZoneFormatKey) // Set to 24-Hour Format // Test default behaviour let timezoneWithSecondsKeys = [4, 5, 8, 11] diff --git a/Clocker/ClockerUnitTests/SearchDataSourceTests.swift b/Clocker/ClockerUnitTests/SearchDataSourceTests.swift index 794f567..047906e 100644 --- a/Clocker/ClockerUnitTests/SearchDataSourceTests.swift +++ b/Clocker/ClockerUnitTests/SearchDataSourceTests.swift @@ -113,7 +113,7 @@ class SearchDataSourceTests: XCTestCase { func testRetrieveSelectedTimezoneWithEmptySearchField() { // Setup subject with an empty search field - setupSubject(searchText: CLEmptyString) + setupSubject(searchText: UserDefaultKeys.emptyString) subject.searchTimezones("los") XCTAssertFalse(subject.calculateChangesets()) diff --git a/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift b/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift index 0a5d2de..896eab8 100644 --- a/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift +++ b/Clocker/ClockerUnitTests/StandardMenubarHandlerTests.swift @@ -20,8 +20,8 @@ class StandardMenubarHandlerTests: XCTestCase { private func makeMockStore(with menubarMode: Int = 1) -> DataStore { // Wipe all timezones from UserDefaults let defaults = UserDefaults(suiteName: "com.abhishek.Clocker.StandardMenubarHandlerTests")! - defaults.set(menubarMode, forKey: CLMenubarCompactMode) - defaults.set(0, forKey: CLShowMeetingInMenubar) + defaults.set(menubarMode, forKey: UserDefaultKeys.menubarCompactMode) + defaults.set(0, forKey: UserDefaultKeys.showMeetingInMenubar) XCTAssertNotEqual(defaults, UserDefaults.standard) return DataStore(with: defaults) } @@ -163,7 +163,7 @@ class StandardMenubarHandlerTests: XCTestCase { mockEvent.startDate = Date().add(futureChunk) let menubarHandler = MenubarTitleProvider(with: store, eventStore: EventCenter.sharedCenter()) - XCTAssert(menubarHandler.format(event: mockEvent) == CLEmptyString, + XCTAssert(menubarHandler.format(event: mockEvent) == UserDefaultKeys.emptyString, "Suffix \(menubarHandler.format(event: mockEvent)) doesn't match expectation") } diff --git a/Clocker/ClockerUnitTests/ThemerTests.swift b/Clocker/ClockerUnitTests/ThemerTests.swift index 8f2c2cb..4db9457 100644 --- a/Clocker/ClockerUnitTests/ThemerTests.swift +++ b/Clocker/ClockerUnitTests/ThemerTests.swift @@ -122,7 +122,7 @@ class ThemerTests: XCTestCase { func testSystemTheme() throws { let currentSystemTheme = - UserDefaults.standard.string(forKey: CLAppleInterfaceStyleKey)?.lowercased().contains("dark") ?? false ? Themer.Theme.dark : Themer.Theme.light + UserDefaults.standard.string(forKey: UserDefaultKeys.appleInterfaceStyleKey)?.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 diff --git a/Clocker/Dependencies/Date Additions/Date+TimeAgo.swift b/Clocker/Dependencies/Date Additions/Date+TimeAgo.swift index cf37db0..c4d8dcc 100755 --- a/Clocker/Dependencies/Date Additions/Date+TimeAgo.swift +++ b/Clocker/Dependencies/Date Additions/Date+TimeAgo.swift @@ -131,7 +131,7 @@ public extension Date { // Instead of returning "Just now" or the equivalent localized version; let's return an empty string // Previously, we returned DateToolsLocalizedStrings("Just now") - return CLEmptyString + return UserDefaultKeys.emptyString } } diff --git a/Clocker/Events and Reminders/CalendarHandler.swift b/Clocker/Events and Reminders/CalendarHandler.swift index c5248f3..e19402a 100644 --- a/Clocker/Events and Reminders/CalendarHandler.swift +++ b/Clocker/Events and Reminders/CalendarHandler.swift @@ -36,7 +36,7 @@ extension EventCenter { setOfCalendars = Set(userCalendars) } - var currentSourceTitle = CLEmptyString + var currentSourceTitle = UserDefaultKeys.emptyString for calendar in calendars { if !(calendar.source.title == currentSourceTitle) { @@ -81,12 +81,12 @@ extension EventCenter { Returns a tuple with 0 as the header string and 1 as the subtitle string */ func separateFormat(event: EKEvent) -> (String, String)? { - guard let truncateLength = DataStore.shared().retrieve(key: CLTruncateTextLength) as? NSNumber, let eventTitle = event.title else { + guard let truncateLength = DataStore.shared().retrieve(key: UserDefaultKeys.truncateTextLength) as? NSNumber, let eventTitle = event.title else { return nil } let seconds = event.startDate.timeIntervalSinceNow - var formattedTitle: String = CLEmptyString + var formattedTitle: String = UserDefaultKeys.emptyString if eventTitle.count > truncateLength.intValue { let truncateIndex = eventTitle.index(eventTitle.startIndex, offsetBy: truncateLength.intValue) @@ -98,7 +98,7 @@ extension EventCenter { formattedTitle.append(eventTitle) } - var menubarText: String = CLEmptyString + var menubarText: String = UserDefaultKeys.emptyString let minutes = seconds / 60 if minutes > 2 { @@ -224,7 +224,7 @@ extension EventCenter { let allCalendars = self.retrieveAllCalendarIdentifiers() if !allCalendars.isEmpty { - UserDefaults.standard.set(allCalendars, forKey: CLSelectedCalendars) + UserDefaults.standard.set(allCalendars, forKey: UserDefaultKeys.selectedCalendars) Logger.info("Finished saving all calendar identifiers in default") self.filterEvents() } @@ -485,8 +485,8 @@ struct EventInfo { return "started +\(event.startDate.shortTimeAgoSinceNow)." } else if event.startDate.isToday, timeIntervalSinceNowForMeeting > 0 { let timeSince = Date().timeAgo(since: event.startDate).lowercased() - let withoutAn = timeSince.replacingOccurrences(of: "an", with: CLEmptyString) - var withoutAgo = withoutAn.replacingOccurrences(of: "ago", with: CLEmptyString) + let withoutAn = timeSince.replacingOccurrences(of: "an", with: UserDefaultKeys.emptyString) + var withoutAgo = withoutAn.replacingOccurrences(of: "ago", with: UserDefaultKeys.emptyString) // If the user has not turned on seconds granularity for one of the timezones, // we return "in 12 seconds" which looks weird. diff --git a/Clocker/Onboarding/OnboardingParentViewController.swift b/Clocker/Onboarding/OnboardingParentViewController.swift index b3f2b30..c8b4cf4 100644 --- a/Clocker/Onboarding/OnboardingParentViewController.swift +++ b/Clocker/Onboarding/OnboardingParentViewController.swift @@ -194,9 +194,9 @@ class OnboardingParentViewController: NSViewController { } private func navigateToFinalStage() { - if UserDefaults.standard.object(forKey: CLInstallHomeIndicatorObject) == nil, DataStore.shared().timezones().isEmpty { + if UserDefaults.standard.object(forKey: UserDefaultKeys.installHomeIndicatorObject) == nil, DataStore.shared().timezones().isEmpty { fetchLocalTimezone() - UserDefaults.standard.set(1, forKey: CLInstallHomeIndicatorObject) + UserDefaults.standard.set(1, forKey: UserDefaultKeys.installHomeIndicatorObject) } guard let fromViewController = onboardingSearchVC, let toViewController = finalOnboardingVC else { @@ -220,8 +220,8 @@ class OnboardingParentViewController: NSViewController { view.window?.close() - if ProcessInfo.processInfo.arguments.contains(CLOnboardingTestsLaunchArgument) == false { - UserDefaults.standard.set(true, forKey: CLShowOnboardingFlow) + if ProcessInfo.processInfo.arguments.contains(UserDefaultKeys.onboardingTestsLaunchArgument) == false { + UserDefaults.standard.set(true, forKey: UserDefaultKeys.showOnboardingFlow) } // Install the menubar option! @@ -317,11 +317,11 @@ class OnboardingParentViewController: NSViewController { private func shouldStartAtLogin(_ shouldStart: Bool) { // If tests are going on, we don't want to enable/disable launch at login! - if ProcessInfo.processInfo.arguments.contains(CLOnboardingTestsLaunchArgument) { + if ProcessInfo.processInfo.arguments.contains(UserDefaultKeys.onboardingTestsLaunchArgument) { return } - UserDefaults.standard.set(shouldStart ? 1 : 0, forKey: CLStartAtLogin) + UserDefaults.standard.set(shouldStart ? 1 : 0, forKey: UserDefaultKeys.startAtLogin) startupManager.toggleLogin(shouldStart) shouldStart ? Logger.log(object: nil, for: "Enable Launch at Login while Onboarding") : diff --git a/Clocker/Onboarding/OnboardingSearchController.swift b/Clocker/Onboarding/OnboardingSearchController.swift index 4045c1f..bc0b119 100644 --- a/Clocker/Onboarding/OnboardingSearchController.swift +++ b/Clocker/Onboarding/OnboardingSearchController.swift @@ -100,7 +100,7 @@ class OnboardingSearchController: NSViewController { private func cleanupAfterInstallingTimezone() { let data = TimezoneData() - data.setLabel(CLEmptyString) + data.setLabel(UserDefaultKeys.emptyString) if let currentSelection = searchResultsDataSource?.retrieveSelectedTimezone(resultsTableView.selectedRow) { let metaInfo = metadata(for: currentSelection) @@ -115,7 +115,7 @@ class OnboardingSearchController: NSViewController { searchResultsDataSource?.cleanupFilterArray() searchResultsDataSource?.timezoneFilteredArray = [] searchResultsDataSource?.calculateChangesets() - searchBar.stringValue = CLEmptyString + searchBar.stringValue = UserDefaultKeys.emptyString accessoryLabel.stringValue = "Added \(metaInfo.1.formattedName)." undoButton.isHidden = false @@ -141,7 +141,7 @@ class OnboardingSearchController: NSViewController { repeats: false) { _ in OperationQueue.main.addOperation { - self.setInfoLabel(CLEmptyString) + self.setInfoLabel(UserDefaultKeys.emptyString) } } } @@ -225,13 +225,13 @@ class OnboardingSearchController: NSViewController { } let newTimeZone = [ - CLTimezoneID: response.timeZoneId, - CLTimezoneName: filteredAddress, - CLPlaceIdentifier: dataObject.placeID!, + UserDefaultKeys.timezoneID: response.timeZoneId, + UserDefaultKeys.timezoneName: filteredAddress, + UserDefaultKeys.placeIdentifier: dataObject.placeID!, "latitude": latitude, "longitude": longitude, - "nextUpdate": CLEmptyString, - CLCustomLabel: filteredAddress, + "nextUpdate": UserDefaultKeys.emptyString, + UserDefaultKeys.customLabel: filteredAddress, ] as [String: Any] DataStore.shared().addTimezone(TimezoneData(with: newTimeZone)) @@ -271,7 +271,7 @@ class OnboardingSearchController: NSViewController { private func setup() { appName.stringValue = "Quick Add Locations".localized() onboardingTypeLabel.stringValue = "More search options in Clocker Preferences.".localized() - setInfoLabel(CLEmptyString) + setInfoLabel(UserDefaultKeys.emptyString) searchBar.bezelStyle = .roundedBezel searchBar.placeholderString = "Press Enter to Search!" searchBar.delegate = self @@ -291,7 +291,7 @@ class OnboardingSearchController: NSViewController { if searchString.isEmpty { resetSearchView() - setInfoLabel(CLEmptyString) + setInfoLabel(UserDefaultKeys.emptyString) return } @@ -308,7 +308,7 @@ class OnboardingSearchController: NSViewController { fileprivate func resetIfNeccesary(_ searchString: String) { if searchString.isEmpty { resetSearchView() - setInfoLabel(CLEmptyString) + setInfoLabel(UserDefaultKeys.emptyString) } } @@ -324,7 +324,7 @@ class OnboardingSearchController: NSViewController { let words = searchString.components(separatedBy: CharacterSet.whitespacesAndNewlines) - searchString = words.joined(separator: CLEmptyString) + searchString = words.joined(separator: UserDefaultKeys.emptyString) if searchString.count < 3 { resetIfNeccesary(searchString) @@ -343,7 +343,7 @@ class OnboardingSearchController: NSViewController { let words = currentSearchBarValue.components(separatedBy: CharacterSet.whitespacesAndNewlines) - if words.joined(separator: CLEmptyString) != searchString { + if words.joined(separator: UserDefaultKeys.emptyString) != searchString { return } @@ -397,7 +397,7 @@ class OnboardingSearchController: NSViewController { } private func prepareUIForPresentingResults() { - setInfoLabel(CLEmptyString) + setInfoLabel(UserDefaultKeys.emptyString) if let dataSource = searchResultsDataSource, dataSource.calculateChangesets() { resultsTableView.isHidden = false resultsTableView.reloadData() @@ -414,10 +414,10 @@ class OnboardingSearchController: NSViewController { let totalPackage = [ "latitude": latitude, "longitude": longitude, - CLTimezoneName: formattedAddress, - CLCustomLabel: formattedAddress, - CLTimezoneID: CLEmptyString, - CLPlaceIdentifier: result.placeId, + UserDefaultKeys.timezoneName: formattedAddress, + UserDefaultKeys.customLabel: formattedAddress, + UserDefaultKeys.timezoneID: UserDefaultKeys.emptyString, + UserDefaultKeys.placeIdentifier: result.placeId, ] as [String: Any] return TimezoneData(with: totalPackage) @@ -431,7 +431,7 @@ class OnboardingSearchController: NSViewController { searchResultsDataSource?.timezoneFilteredArray = [] searchResultsDataSource?.calculateChangesets() resultsTableView.reloadData() - searchBar.stringValue = CLEmptyString + searchBar.stringValue = UserDefaultKeys.emptyString searchBar.placeholderString = "Press Enter to Search" } diff --git a/Clocker/Overall App/AppDefaults.swift b/Clocker/Overall App/AppDefaults.swift index f71893d..374790b 100644 --- a/Clocker/Overall App/AppDefaults.swift +++ b/Clocker/Overall App/AppDefaults.swift @@ -16,30 +16,30 @@ class AppDefaults { defaults.register(defaults: defaultsDictionary()) store.setTimezones(timezones) - defaults.set(selectedCalendars, forKey: CLSelectedCalendars) + defaults.set(selectedCalendars, forKey: UserDefaultKeys.selectedCalendars) } private class func defaultsDictionary() -> [String: Any] { let calendars: [String] = [] - return [CLThemeKey: 0, - CLDisplayFutureSliderKey: 0, - CLSelectedTimeZoneFormatKey: 0, // 12-hour format - CLRelativeDateKey: 0, - CLShowDayInMenu: 0, - CLShowDateInMenu: 1, - CLShowPlaceInMenu: 0, - CLStartAtLogin: 0, - CLSunriseSunsetTime: 1, - CLUserFontSizePreference: 4, - CLShowUpcomingEventView: "YES", - CLShowAppInForeground: 0, - CLFutureSliderRange: 0, - CLShowAllDayEventsInUpcomingView: 1, - CLShowMeetingInMenubar: 0, - CLTruncateTextLength: 30, - CLSelectedCalendars: calendars, - CLAppDisplayOptions: 0, - CLMenubarCompactMode: 1] + return [UserDefaultKeys.themeKey: 0, + UserDefaultKeys.displayFutureSliderKey: 0, + UserDefaultKeys.selectedTimeZoneFormatKey: 0, // 12-hour format + UserDefaultKeys.relativeDateKey: 0, + UserDefaultKeys.showDayInMenu: 0, + UserDefaultKeys.showDateInMenu: 1, + UserDefaultKeys.showPlaceInMenu: 0, + UserDefaultKeys.startAtLogin: 0, + UserDefaultKeys.sunriseSunsetTime: 1, + UserDefaultKeys.userFontSizePreference: 4, + UserDefaultKeys.showUpcomingEventView: "YES", + UserDefaultKeys.showAppInForeground: 0, + UserDefaultKeys.futureSliderRange: 0, + UserDefaultKeys.showAllDayEventsInUpcomingView: 1, + UserDefaultKeys.showMeetingInMenubar: 0, + UserDefaultKeys.truncateTextLength: 30, + UserDefaultKeys.selectedCalendars: calendars, + UserDefaultKeys.appDisplayOptions: 0, + UserDefaultKeys.menubarCompactMode: 1] } } diff --git a/Clocker/Overall App/ConfigExport.swift b/Clocker/Overall App/ConfigExport.swift index feb4fe5..58c88a9 100644 --- a/Clocker/Overall App/ConfigExport.swift +++ b/Clocker/Overall App/ConfigExport.swift @@ -7,29 +7,29 @@ import Foundation struct ConfigExport { private func generateJSON(from store: DataStore) { let selectedKeys: Set = Set([ - CLShowOnboardingFlow, - CLSelectedTimeZoneFormatKey, - CLThemeKey, - CLShowDayInMenu, - CLShowDateInMenu, - CLShowPlaceInMenu, - CLDisplayFutureSliderKey, - CLStartAtLogin, - CLShowAppInForeground, - CLSunriseSunsetTime, - CLUserFontSizePreference, - CLShowUpcomingEventView, - CLShowAllDayEventsInUpcomingView, - CLShowMeetingInMenubar, - CLTruncateTextLength, - CLFutureSliderRange, - CLSelectedCalendars, - CLAppDisplayOptions, - CLLongStatusBarWarningMessage, - CLMenubarCompactMode, - CLDefaultMenubarMode, - CLInstallHomeIndicatorObject, - CLSwitchToCompactModeAlert, + UserDefaultKeys.showOnboardingFlow, + UserDefaultKeys.selectedTimeZoneFormatKey, + UserDefaultKeys.themeKey, + UserDefaultKeys.showDayInMenu, + UserDefaultKeys.showDateInMenu, + UserDefaultKeys.showPlaceInMenu, + UserDefaultKeys.displayFutureSliderKey, + UserDefaultKeys.startAtLogin, + UserDefaultKeys.showAppInForeground, + UserDefaultKeys.sunriseSunsetTime, + UserDefaultKeys.userFontSizePreference, + UserDefaultKeys.showUpcomingEventView, + UserDefaultKeys.showAllDayEventsInUpcomingView, + UserDefaultKeys.showMeetingInMenubar, + UserDefaultKeys.truncateTextLength, + UserDefaultKeys.futureSliderRange, + UserDefaultKeys.selectedCalendars, + UserDefaultKeys.appDisplayOptions, + UserDefaultKeys.longStatusBarWarningMessage, + UserDefaultKeys.menubarCompactMode, + UserDefaultKeys.defaultMenubarMode, + UserDefaultKeys.installHomeIndicatorObject, + UserDefaultKeys.switchToCompactModeAlert, ]) let dictionaryRep = UserDefaults.standard.dictionaryRepresentation() var clockerPrefs: [String: Any] = [:] diff --git a/Clocker/Overall App/DataStore.swift b/Clocker/Overall App/DataStore.swift index 4cf582e..3ddcb88 100644 --- a/Clocker/Overall App/DataStore.swift +++ b/Clocker/Overall App/DataStore.swift @@ -37,7 +37,7 @@ class DataStore: NSObject { } init(with defaults: UserDefaults) { - cachedTimezones = (defaults.object(forKey: CLDefaultPreferenceKey) as? [Data]) ?? [] + cachedTimezones = (defaults.object(forKey: UserDefaultKeys.defaultPreferenceKey) as? [Data]) ?? [] cachedMenubarTimezones = cachedTimezones.filter { let customTimezone = TimezoneData.customObject(from: $0) return customTimezone?.isFavourite == 1 @@ -69,10 +69,10 @@ class DataStore: NSObject { let userInfo = notification.userInfo ?? [:] let ubiquitousStore = notification.object as? NSUbiquitousKeyValueStore Logger.info("Ubiquitous Store Changed: User Info is \(userInfo)") - let currentTimezones = userDefaults.object(forKey: CLDefaultPreferenceKey) as? [Data] - let cloudTimezones = ubiquitousStore?.object(forKey: CLDefaultPreferenceKey) as? [Data] - let cloudLastUpdateDate = (ubiquitousStore?.object(forKey: CLUbiquitousStoreLastUpdateKey) as? Date) ?? Date() - let defaultsLastUpdateDate = (ubiquitousStore?.object(forKey: CLUserDefaultsLastUpdateKey) as? Date) ?? Date() + let currentTimezones = userDefaults.object(forKey: UserDefaultKeys.defaultPreferenceKey) as? [Data] + let cloudTimezones = ubiquitousStore?.object(forKey: UserDefaultKeys.defaultPreferenceKey) as? [Data] + let cloudLastUpdateDate = (ubiquitousStore?.object(forKey: UserDefaultKeys.ubiquitousStoreLastUpdateKey) as? Date) ?? Date() + let defaultsLastUpdateDate = (ubiquitousStore?.object(forKey: UserDefaultKeys.userDefaultsLastUpdateKey) as? Date) ?? Date() if cloudTimezones == currentTimezones { Logger.info("Ubiquitous Store timezones aren't equal to current timezones") @@ -84,8 +84,8 @@ class DataStore: NSObject { if cloudTimezones != currentTimezones, cloudLastUpdateDate.isLaterThanOrEqual(to: defaultsLastUpdateDate) { Logger.info("Syncing local timezones with data from the ☁️. ☁️ last update timestamp is recent") - userDefaults.set(cloudTimezones, forKey: CLDefaultPreferenceKey) - userDefaults.set(Date(), forKey: CLUserDefaultsLastUpdateKey) + userDefaults.set(cloudTimezones, forKey: UserDefaultKeys.defaultPreferenceKey) + userDefaults.set(Date(), forKey: UserDefaultKeys.userDefaultsLastUpdateKey) NotificationCenter.default.post(name: DataStore.didSyncFromExternalSourceNotification, object: self) return @@ -97,16 +97,16 @@ class DataStore: NSObject { } func setTimezones(_ timezones: [Data]?) { - userDefaults.set(timezones, forKey: CLDefaultPreferenceKey) - userDefaults.set(Date(), forKey: CLUserDefaultsLastUpdateKey) + userDefaults.set(timezones, forKey: UserDefaultKeys.defaultPreferenceKey) + userDefaults.set(Date(), forKey: UserDefaultKeys.userDefaultsLastUpdateKey) cachedTimezones = timezones ?? [] cachedMenubarTimezones = cachedTimezones.filter { let customTimezone = TimezoneData.customObject(from: $0) return customTimezone?.isFavourite == 1 } // iCloud sync - ubiquitousStore?.set(timezones, forKey: CLDefaultPreferenceKey) - ubiquitousStore?.set(Date(), forKey: CLUbiquitousStoreLastUpdateKey) + ubiquitousStore?.set(timezones, forKey: UserDefaultKeys.defaultPreferenceKey) + ubiquitousStore?.set(Date(), forKey: UserDefaultKeys.ubiquitousStoreLastUpdateKey) } func menubarTimezones() -> [Data]? { @@ -114,7 +114,7 @@ class DataStore: NSObject { } func selectedCalendars() -> [String]? { - return userDefaults.array(forKey: CLSelectedCalendars) as? [String] + return userDefaults.array(forKey: UserDefaultKeys.selectedCalendars) as? [String] } // MARK: Date (May 8th) in Compact Menubar @@ -158,7 +158,7 @@ class DataStore: NSObject { } func timezoneFormat() -> NSNumber { - return userDefaults.object(forKey: CLSelectedTimeZoneFormatKey) as? NSNumber ?? NSNumber(integerLiteral: 0) + return userDefaults.object(forKey: UserDefaultKeys.selectedTimeZoneFormatKey) as? NSNumber ?? NSNumber(integerLiteral: 0) } func isBufferRequiredForTwelveHourFormats() -> Bool { @@ -168,44 +168,44 @@ class DataStore: NSObject { func shouldDisplay(_ type: ViewType) -> Bool { switch type { case .futureSlider: - guard let value = retrieve(key: CLDisplayFutureSliderKey) as? NSNumber else { + guard let value = retrieve(key: UserDefaultKeys.displayFutureSliderKey) as? NSNumber else { return false } return value != 1 // Display slider is 0 and Hide is 1. case .upcomingEventView: - guard let value = retrieve(key: CLShowUpcomingEventView) as? NSString else { + guard let value = retrieve(key: UserDefaultKeys.showUpcomingEventView) as? NSString else { return false } return value == "YES" case .twelveHour: - return shouldDisplayHelper(CLSelectedTimeZoneFormatKey) + return shouldDisplayHelper(UserDefaultKeys.selectedTimeZoneFormatKey) case .showAllDayEventsInMenubar: - return shouldDisplayHelper(CLShowAllDayEventsInUpcomingView) + return shouldDisplayHelper(UserDefaultKeys.showAllDayEventsInUpcomingView) case .sunrise: - return shouldDisplayHelper(CLSunriseSunsetTime) + return shouldDisplayHelper(UserDefaultKeys.sunriseSunsetTime) case .showMeetingInMenubar: - return shouldDisplayHelper(CLShowMeetingInMenubar) + return shouldDisplayHelper(UserDefaultKeys.showMeetingInMenubar) case .showAppInForeground: - guard let value = retrieve(key: CLShowAppInForeground) as? NSNumber else { + guard let value = retrieve(key: UserDefaultKeys.showAppInForeground) as? NSNumber else { return false } return value.isEqual(to: NSNumber(value: 1)) case .dateInMenubar: - return shouldDisplayNonObjectHelper(CLShowDateInMenu) + return shouldDisplayNonObjectHelper(UserDefaultKeys.showDateInMenu) case .placeInMenubar: - return shouldDisplayHelper(CLShowPlaceInMenu) + return shouldDisplayHelper(UserDefaultKeys.showPlaceInMenu) case .dayInMenubar: - return shouldDisplayNonObjectHelper(CLShowDayInMenu) + return shouldDisplayNonObjectHelper(UserDefaultKeys.showDayInMenu) case .appDisplayOptions: - return shouldDisplayHelper(CLAppDisplayOptions) + return shouldDisplayHelper(UserDefaultKeys.appDisplayOptions) case .menubarCompactMode: - guard let value = retrieve(key: CLMenubarCompactMode) as? Int else { + guard let value = retrieve(key: UserDefaultKeys.menubarCompactMode) as? Int else { return false } return value == 0 case .sync: - return shouldDisplayHelper(CLEnableSyncKey) + return shouldDisplayHelper(UserDefaultKeys.enableSyncKey) } } diff --git a/Clocker/Overall App/Strings.swift b/Clocker/Overall App/Strings.swift index bd3fd71..b2a31ff 100644 --- a/Clocker/Overall App/Strings.swift +++ b/Clocker/Overall App/Strings.swift @@ -2,42 +2,45 @@ import Cocoa -let CLEmptyString = "" -let CLDefaultPreferenceKey = "defaultPreferences" -let CLTimezoneName = "formattedAddress" -let CLCustomLabel = "customLabel" -let CLSelectedTimeZoneFormatKey = "is24HourFormatSelected" -let CLDragSessionKey = "public.text" -let CLTimezoneID = "timezoneID" -let CLPlaceIdentifier = "place_id" -let CLRelativeDateKey = "relativeDate" -let CLThemeKey = "defaultTheme" -let CLShowDayInMenu = "showDay" -let CLShowDateInMenu = "showDate" -let CLShowPlaceInMenu = "showPlaceName" -let CLDisplayFutureSliderKey = "displayFutureSlider" -let CLStartAtLogin = "startAtLogin" -let CLShowAppInForeground = "displayAppAsForegroundApp" -let CLSunriseSunsetTime = "showSunriseSetTime" -let CLUserFontSizePreference = "userFontSize" -let CLShowUpcomingEventView = "ShowUpcomingEventView" -let CLShowAllDayEventsInUpcomingView = "showAllDayEventsInUpcomingView" -let CLShowMeetingInMenubar = "showMeetingInfoInMenubar" -let CLTruncateTextLength = "truncateTextLength" -let CLFutureSliderRange = "sliderDayRange" -let CLSelectedCalendars = "SelectedCalendars" -let CLShowOnboardingFlow = "com.abhishek.showOnboardingFlow" -let CLAppDisplayOptions = "com.abhishek.appDisplayOptions" -let CLLongStatusBarWarningMessage = "com.abhishek.longStatusBarWarning" -let CLUITestingLaunchArgument = "isUITesting" -let CLOnboardingTestsLaunchArgument = "isTestingTheOnboardingFlow" -let CLMenubarCompactMode = "com.abhishek.menubarCompactMode" -let CLDefaultMenubarMode = "com.abhishek.shouldDefaultToCompactMode" -let CLInstallHomeIndicatorObject = "installHomeIndicatorObject" -let CLSwitchToCompactModeAlert = "com.abhishek.switchToCompactMode" -let CLAppleInterfaceStyleKey = "AppleInterfaceStyle" +public enum UserDefaultKeys { + static let emptyString = "" + static let defaultPreferenceKey = "defaultPreferences" + static let timezoneName = "formattedAddress" + static let customLabel = "customLabel" + static let selectedTimeZoneFormatKey = "is24HourFormatSelected" + static let dragSessionKey = "public.text" + static let timezoneID = "timezoneID" + static let placeIdentifier = "place_id" + static let relativeDateKey = "relativeDate" + static let themeKey = "defaultTheme" + static let showDayInMenu = "showDay" + static let showDateInMenu = "showDate" + static let showPlaceInMenu = "showPlaceName" + static let displayFutureSliderKey = "displayFutureSlider" + static let startAtLogin = "startAtLogin" + static let showAppInForeground = "displayAppAsForegroundApp" + static let sunriseSunsetTime = "showSunriseSetTime" + static let userFontSizePreference = "userFontSize" + static let showUpcomingEventView = "ShowUpcomingEventView" + static let showAllDayEventsInUpcomingView = "showAllDayEventsInUpcomingView" + static let showMeetingInMenubar = "showMeetingInfoInMenubar" + static let truncateTextLength = "truncateTextLength" + static let futureSliderRange = "sliderDayRange" + static let selectedCalendars = "SelectedCalendars" + static let showOnboardingFlow = "com.abhishek.showOnboardingFlow" + static let appDisplayOptions = "com.abhishek.appDisplayOptions" + static let longStatusBarWarningMessage = "com.abhishek.longStatusBarWarning" + static let testingLaunchArgument = "isUITesting" + static let onboardingTestsLaunchArgument = "isTestingTheOnboardingFlow" + static let menubarCompactMode = "com.abhishek.menubarCompactMode" + static let defaultMenubarMode = "com.abhishek.shouldDefaultToCompactMode" + static let installHomeIndicatorObject = "installHomeIndicatorObject" + static let switchToCompactModeAlert = "com.abhishek.switchToCompactMode" + static let appleInterfaceStyleKey = "AppleInterfaceStyle" + // Sync Keys + static let enableSyncKey = "com.abhishek.enableSync" + static let ubiquitousStoreLastUpdateKey = "com.abhishek.ubiquitousLastUpdateKey" + static let userDefaultsLastUpdateKey = "com.abhishek.defaultsLastUpdateKey" +} + -// Sync Keys -let CLEnableSyncKey = "com.abhishek.enableSync" -let CLUbiquitousStoreLastUpdateKey = "com.abhishek.ubiquitousLastUpdateKey" -let CLUserDefaultsLastUpdateKey = "com.abhishek.defaultsLastUpdateKey" diff --git a/Clocker/Overall App/Themer.swift b/Clocker/Overall App/Themer.swift index 11c8e98..2815dd3 100644 --- a/Clocker/Overall App/Themer.swift +++ b/Clocker/Overall App/Themer.swift @@ -16,7 +16,7 @@ class Themer: NSObject { case solarizedDark } - private static var sharedInstance = Themer(index: UserDefaults.standard.integer(forKey: CLThemeKey)) + private static var sharedInstance = Themer(index: UserDefaults.standard.integer(forKey: UserDefaultKeys.themeKey)) private var effectiveApperanceObserver: NSKeyValueObservation? private var themeIndex: Theme { didSet { @@ -447,7 +447,7 @@ extension Themer { private func retrieveCurrentSystem() -> Theme { if #available(OSX 10.14, *) { - if let appleInterfaceStyle = UserDefaults.standard.object(forKey: CLAppleInterfaceStyleKey) as? String { + if let appleInterfaceStyle = UserDefaults.standard.object(forKey: UserDefaultKeys.appleInterfaceStyleKey) as? String { if appleInterfaceStyle.lowercased().contains("dark") { return .dark }