Skip to content

Commit

Permalink
[Refactor] Introduce GlobalContext and migrate the updater controll…
Browse files Browse the repository at this point in the history
…er into it (#365)

* introduce global context and migrate updater controller into

* refactor: mutually initialize global context

* revert `@Default` in `EasydictApp`

* fix: remove updaterController from Main.storyboard

* style: fix typo

* fix: updaterDelegate was nil

* perf: set updaterHelper to private

* perf: remove sparkle code from AppDelegate

* perf: remove unused #import header

---------

Co-authored-by: Tisfeng <[email protected]>
  • Loading branch information
CanglongCl and tisfeng authored Jan 27, 2024
1 parent b6974d1 commit 5d30f34
Show file tree
Hide file tree
Showing 11 changed files with 83 additions and 95 deletions.
4 changes: 4 additions & 0 deletions Easydict.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@
EA9943EE2B5353AB00EE7B97 /* WindowTypeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943ED2B5353AB00EE7B97 /* WindowTypeExtensions.swift */; };
EA9943F02B5354C400EE7B97 /* ShowWindowPositionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943EF2B5354C400EE7B97 /* ShowWindowPositionExtensions.swift */; };
EA9943F22B5358BF00EE7B97 /* LanguageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA9943F12B5358BF00EE7B97 /* LanguageExtensions.swift */; };
EAE3D3502B62E9DE001EE3E3 /* GlobalContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */; };
EAED41EC2B54AA920005FE0A /* ServiceConfigurationSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */; };
EAED41EF2B54B1430005FE0A /* ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */; };
EAED41F22B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */; };
Expand Down Expand Up @@ -772,6 +773,7 @@
EA9943ED2B5353AB00EE7B97 /* WindowTypeExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WindowTypeExtensions.swift; sourceTree = "<group>"; };
EA9943EF2B5354C400EE7B97 /* ShowWindowPositionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowWindowPositionExtensions.swift; sourceTree = "<group>"; };
EA9943F12B5358BF00EE7B97 /* LanguageExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageExtensions.swift; sourceTree = "<group>"; };
EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalContext.swift; sourceTree = "<group>"; };
EAED41EB2B54AA920005FE0A /* ServiceConfigurationSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceConfigurationSection.swift; sourceTree = "<group>"; };
EAED41EE2B54B1430005FE0A /* ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurableService.swift; sourceTree = "<group>"; };
EAED41F12B54B39D0005FE0A /* OpenAIService+ConfigurableService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OpenAIService+ConfigurableService.swift"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2230,6 +2232,7 @@
EA9943DD2B534BAE00EE7B97 /* Utility */ = {
isa = PBXGroup;
children = (
EAE3D34F2B62E9DE001EE3E3 /* GlobalContext.swift */,
EAED41ED2B54B1390005FE0A /* Protocol */,
EA9943E62B534D7C00EE7B97 /* Extensions */,
);
Expand Down Expand Up @@ -2795,6 +2798,7 @@
0320C5872B29F35700861B3D /* QueryServiceRecord.swift in Sources */,
03FC699A2B39D13A0035D2DA /* EZOpenAIChatResponse.m in Sources */,
03B022FA29231FA6001C7E63 /* EZServiceTypes.m in Sources */,
EAE3D3502B62E9DE001EE3E3 /* GlobalContext.swift in Sources */,
EA9943F02B5354C400EE7B97 /* ShowWindowPositionExtensions.swift in Sources */,
03B0233129231FA6001C7E63 /* MMCrash.m in Sources */,
03B0232629231FA6001C7E63 /* NSAttributedString+MM.m in Sources */,
Expand Down
3 changes: 0 additions & 3 deletions Easydict/App/AppDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@
//

#import <Cocoa/Cocoa.h>
#import <Sparkle/SPUStandardUpdaterController.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (weak) IBOutlet SPUStandardUpdaterController *updaterController;

@end
25 changes: 1 addition & 24 deletions Easydict/App/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,12 @@
//

#import "AppDelegate.h"
#import "EZMenuItemManager.h"
#import "EZShortcut.h"
#import "MMCrash.h"
#import "EZWindowManager.h"
#import "EZLanguageManager.h"
#import "EZLog.h"
#import "EZSchemeParser.h"
#import "AppDelegate+EZURLScheme.h"
#import <Sparkle/SPUUpdaterDelegate.h>
#import <Sparkle/SPUStandardUserDriverDelegate.h>
#import "Easydict-Swift.h"

@interface AppDelegate () <SPUUpdaterDelegate, SPUStandardUserDriverDelegate>
@interface AppDelegate ()

@end

Expand Down Expand Up @@ -99,20 +92,4 @@ - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)applica
return NO;
}

#pragma mark - SUUpdaterDelegate

- (NSString *)feedURLStringForUpdater:(SPUUpdater *)updater {
NSString *feedURLString = @"https://raw.githubusercontent.com/tisfeng/Easydict/main/appcast.xml";
#if DEBUG
feedURLString = @"http://localhost:8000/appcast.xml";
#endif
return feedURLString;
}

#pragma mark - SPUStandardUserDriverDelegate

- (BOOL)supportsGentleScheduledUpdateReminders {
return YES;
}

@end
14 changes: 2 additions & 12 deletions Easydict/App/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
Expand Up @@ -716,18 +716,8 @@ DQ
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate">
<connections>
<outlet property="updaterController" destination="dTQ-Lg-1D6" id="ulf-mx-z8R"/>
</connections>
</customObject>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="dTQ-Lg-1D6" customClass="SPUStandardUpdaterController">
<connections>
<outlet property="updaterDelegate" destination="Voe-Tx-rLC" id="3Ya-Y2-qiK"/>
<outlet property="userDriverDelegate" destination="Voe-Tx-rLC" id="pxF-ql-RTh"/>
</connections>
</customObject>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<customObject id="qM9-fT-Fym" customClass="EZMenuItemManager">
<connections>
Expand Down Expand Up @@ -799,7 +789,7 @@ DQ
<menuItem title="检查更新" id="GQ2-WA-9QB">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="checkForUpdates:" target="dTQ-Lg-1D6" id="ydL-Jy-6z2"/>
<action selector="checkForUpdateItem:" target="qM9-fT-Fym" id="m6i-mV-Hiy"/>
</connections>
</menuItem>
<menuItem title="帮助" id="ICB-w8-IqK">
Expand Down
10 changes: 2 additions & 8 deletions Easydict/Feature/Configuration/Configuration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@ let kHideMenuBarIconKey = "EZConfiguration_kHideMenuBarIconKey"
}
}

var appDelegate = NSApp.delegate as? AppDelegate

var updater: SPUUpdater? {
appDelegate?.updaterController.updater
}

@DefaultsWrapper(.firstLanguage)
var firstLanguage: Language

Expand Down Expand Up @@ -65,10 +59,10 @@ let kHideMenuBarIconKey = "EZConfiguration_kHideMenuBarIconKey"

var automaticallyChecksForUpdates: Bool {
get {
updater?.automaticallyChecksForUpdates ?? false
GlobalContext.shared.updaterController.updater.automaticallyDownloadsUpdates
}
set {
updater?.automaticallyChecksForUpdates = newValue
GlobalContext.shared.updaterController.updater.automaticallyDownloadsUpdates = newValue
logSettings(["automatically_checks_for_updates": newValue])
}
}
Expand Down
3 changes: 3 additions & 0 deletions Easydict/Feature/Configuration/EZConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#import <Foundation/Foundation.h>
#import "EZLanguageManager.h"
#import "EZLayoutManager.h"
#import <Sparkle/SPUUpdater.h>

NS_ASSUME_NONNULL_BEGIN

Expand Down Expand Up @@ -84,6 +85,8 @@ typedef NS_ENUM(NSUInteger, EZAppearenceType) {

@property (nonatomic, assign) EZAppearenceType appearance;

@property (nonatomic, strong, readonly) SPUUpdater *updater;

+ (instancetype)shared;
+ (void)destroySharedInstance;

Expand Down
10 changes: 5 additions & 5 deletions Easydict/Feature/Configuration/EZConfiguration.m
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
@interface EZConfiguration ()

@property (nonatomic, strong) AppDelegate *appDelegate;
@property (nonatomic, strong) SPUUpdater *updater;
@property (nonatomic, strong, readwrite) SPUUpdater *updater;

@end

Expand Down Expand Up @@ -142,12 +142,12 @@ - (BOOL)launchAtStartup {
return launchAtStartup;
}

- (BOOL)automaticallyChecksForUpdates {
return self.updater.automaticallyChecksForUpdates;
- (SPUUpdater *)updater {
return GlobalContext.shared.updaterController.updater;
}

- (SPUUpdater *)updater {
return self.appDelegate.updaterController.updater;
- (BOOL)automaticallyChecksForUpdates {
return self.updater.automaticallyChecksForUpdates;
}

#pragma mark - setter
Expand Down
7 changes: 7 additions & 0 deletions Easydict/Feature/StatusItem/EZMenuItemManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
#import "EZRightClickDetector.h"
#import "EZConfiguration.h"
#import "Easydict-Swift.h"
#import <Sparkle/SPUStandardUpdaterController.h>
#import <Sparkle/SPUUpdater.h>

@interface EZMenuItemManager () <NSMenuDelegate>

Expand Down Expand Up @@ -181,6 +183,11 @@ - (IBAction)settingAction:(NSMenuItem *)sender {
[EZPreferencesWindowController.shared show];
}

- (IBAction)checkForUpdateItem:(id)sender {
NSLog(@"checkForUpdate");
[EZConfiguration.shared.updater checkForUpdates];
}

- (IBAction)feedbackAction:(NSMenuItem *)sender {
NSLog(@"反馈问题");
NSString *issueURL = [NSString stringWithFormat:@"%@/issues", EZGithubRepoEasydictURL];
Expand Down
39 changes: 7 additions & 32 deletions Easydict/NewApp/EasydictApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
// Copyright © 2023 izual. All rights reserved.
//

import Defaults
import Sparkle
import SwiftUI

Expand All @@ -21,28 +22,14 @@ enum EasydictCmpatibilityEntry {
}
}

class SPUUpdaterHelper: NSObject, SPUUpdaterDelegate {
func feedURLString(for _: SPUUpdater) -> String? {
var feedURLString = "https://raw.githubusercontent.com/tisfeng/Easydict/main/appcast.xml"
#if DEBUG
feedURLString = "http://localhost:8000/appcast.xml"
#endif
return feedURLString
}
}

class SPUUserDriverHelper: NSObject, SPUStandardUserDriverDelegate {
var supportsGentleScheduledUpdateReminders: Bool {
true
}
}

struct EasydictApp: App {
@NSApplicationDelegateAdaptor
var delegate: AppDelegate
private var delegate: AppDelegate

@AppStorage(kHideMenuBarIconKey)
private var hideMenuBar = false
// Use `@Default` will cause a purple warning and continuously call `set` of it.
// I'm not sure why. Just leave `AppStorage` here.
@AppStorage(Defaults.Key<Bool>.hideMenuBarIcon.name)
private var hideMenuBar = Defaults.Key<Bool>.hideMenuBarIcon.defaultValue

private var menuBarImage: String {
#if DEBUG
Expand All @@ -52,22 +39,10 @@ struct EasydictApp: App {
#endif
}

let userDriverHelper = SPUUserDriverHelper()
let upadterHelper = SPUUpdaterHelper()

private let updaterController: SPUStandardUpdaterController

init() {
// 参考 https://sparkle-project.org/documentation/programmatic-setup/
// If you want to start the updater manually, pass false to startingUpdater and call .startUpdater() later
// This is where you can also pass an updater delegate if you need one
updaterController = SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: upadterHelper, userDriverDelegate: userDriverHelper)
}

var body: some Scene {
if #available(macOS 13, *) {
MenuBarExtra(isInserted: $hideMenuBar.toggledValue) {
MenuItemView(updater: updaterController.updater)
MenuItemView()
} label: {
Label {
Text("Easydict")
Expand Down
43 changes: 43 additions & 0 deletions Easydict/NewApp/Utility/GlobalContext.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// GlobalContext.swift
// Easydict
//
// Created by 戴藏龙 on 2024/1/25.
// Copyright © 2024 izual. All rights reserved.
//

import Foundation
import Sparkle

@objcMembers
class GlobalContext: NSObject {
static let shared = GlobalContext()

let updaterController: SPUStandardUpdaterController

private let updaterHelper: SPUUpdaterHelper
private let userDriverHelper: SPUUserDriverHelper

override init() {
updaterHelper = SPUUpdaterHelper()
userDriverHelper = SPUUserDriverHelper()

updaterController = SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: updaterHelper, userDriverDelegate: userDriverHelper)
}

class SPUUpdaterHelper: NSObject, SPUUpdaterDelegate {
func feedURLString(for _: SPUUpdater) -> String? {
var feedURLString = "https://raw.githubusercontent.com/tisfeng/Easydict/main/appcast.xml"
#if DEBUG
feedURLString = "http://localhost:8000/appcast.xml"
#endif
return feedURLString
}
}

class SPUUserDriverHelper: NSObject, SPUStandardUserDriverDelegate {
var supportsGentleScheduledUpdateReminders: Bool {
true
}
}
}
20 changes: 9 additions & 11 deletions Easydict/NewApp/View/MenuItemView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,19 @@ import ZipArchive
@available(macOS 13, *)
final class MenuItemStore: ObservableObject {
@Published var canCheckForUpdates = false
var updater: SPUUpdater
init(updater: SPUUpdater) {
self.updater = updater
self.updater.publisher(for: \.canCheckForUpdates)

init() {
GlobalContext.shared
.updaterController
.updater
.publisher(for: \.canCheckForUpdates)
.assign(to: &$canCheckForUpdates)
}
}

@available(macOS 13, *)
struct MenuItemView: View {
@ObservedObject var store: MenuItemStore

init(updater: SPUUpdater) {
store = MenuItemStore(updater: updater)
}
@ObservedObject private var store = MenuItemStore()

var body: some View {
// ️.menuBarExtraStyle为 .menu 时某些控件可能会失效 ,只能显示内容(按照菜单项高度、图像以 template 方式渲染)无法交互 ,比如 Stepper、Slider 等,像基本的 Button、Text、Divider、Image 等还是能正常显示的。
Expand Down Expand Up @@ -173,7 +171,7 @@ struct MenuItemView: View {
private var checkUpdateItem: some View {
Button("check_updates") {
NSLog("检查更新")
store.updater.checkForUpdates()
GlobalContext.shared.updaterController.updater.checkForUpdates()
}.disabled(!store.canCheckForUpdates)
}

Expand Down Expand Up @@ -225,5 +223,5 @@ struct MenuItemView: View {

@available(macOS 13, *)
#Preview {
MenuItemView(updater: SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil).updater)
MenuItemView()
}

0 comments on commit 5d30f34

Please sign in to comment.