diff --git a/Xcodes/Backend/AppState+Install.swift b/Xcodes/Backend/AppState+Install.swift index ccf637d..d539263 100644 --- a/Xcodes/Backend/AppState+Install.swift +++ b/Xcodes/Backend/AppState+Install.swift @@ -5,6 +5,7 @@ import AppleAPI import Version import LegibleError import os.log +import DockProgress /// Downloads and installs Xcodes extension AppState { @@ -151,6 +152,7 @@ extension AppState { cookies ) progressChanged(progress) + updateDockIcon(withProgress: progress) return publisher .map { _ in destination.url } .eraseToAnyPublisher() @@ -160,11 +162,12 @@ extension AppState { let resumeDataPath = Path.xcodesApplicationSupport/"Xcode-\(availableXcode.version).resumedata" let persistedResumeData = Current.files.contents(atPath: resumeDataPath.string) - return attemptResumableTask(maximumRetryCount: 3) { resumeData -> AnyPublisher in + return attemptResumableTask(maximumRetryCount: 3) { [weak self] resumeData -> AnyPublisher in let (progress, publisher) = Current.network.downloadTask(with: availableXcode.url, to: destination.url, resumingWith: resumeData ?? persistedResumeData) progressChanged(progress) + self?.updateDockIcon(withProgress: progress) return publisher .map { $0.saveLocation } .eraseToAnyPublisher() @@ -174,6 +177,11 @@ extension AppState { }) .eraseToAnyPublisher() } + + private func updateDockIcon(withProgress progress: Progress) { + DockProgress.style = .bar + DockProgress.progressInstance = progress + } public func installArchivedXcode(_ availableXcode: AvailableXcode, at archiveURL: URL) -> AnyPublisher { do { diff --git a/Xcodes/Backend/AppState.swift b/Xcodes/Backend/AppState.swift index ebd44b5..ca629f2 100644 --- a/Xcodes/Backend/AppState.swift +++ b/Xcodes/Backend/AppState.swift @@ -7,6 +7,7 @@ import KeychainAccess import Path import Version import os.log +import DockProgress class AppState: ObservableObject { private let client = AppleAPI.Client() @@ -489,6 +490,9 @@ class AppState: ObservableObject { // Cancel the publisher installationPublishers[id] = nil + + // Remove dock icon progress indicator + DockProgress.progress = 1 // Only way to completely remove overlay with DockProgress is setting progress to complete // If the download is cancelled by the user, clean up the download files that aria2 creates. // This isn't done as part of the publisher with handleEvents(receiveCancel:) because it shouldn't happen when e.g. the app quits.