Add dock progress indicator

in .bar style
This commit is contained in:
Sam Lu 2021-01-24 22:58:12 -07:00
parent ff73109f06
commit ec41e4ab49
No known key found for this signature in database
GPG key ID: 8BD793662CA8DC6E
2 changed files with 13 additions and 1 deletions

View file

@ -5,6 +5,7 @@ import AppleAPI
import Version
import LegibleError
import os.log
import DockProgress
/// Downloads and installs Xcodes
extension AppState {
@ -119,6 +120,7 @@ extension AppState {
cookies
)
progressChanged(progress)
updateDockIcon(withProgress: progress)
return publisher
.map { _ in destination.url }
.eraseToAnyPublisher()
@ -128,11 +130,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<URL, Error> in
return attemptResumableTask(maximumRetryCount: 3) { [weak self] resumeData -> AnyPublisher<URL, Error> 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()
@ -143,6 +146,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<InstalledXcode, Error> {
do {
let destinationURL = Path.root.join("Applications").join("Xcode-\(availableXcode.version.descriptionWithoutBuildMetadata).app").url

View file

@ -6,6 +6,7 @@ import LegibleError
import KeychainAccess
import Path
import Version
import DockProgress
class AppState: ObservableObject {
private let client = AppleAPI.Client()
@ -299,6 +300,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.
let expectedArchivePath = Path.xcodesApplicationSupport/"Xcode-\(availableXcode.version).\(availableXcode.filename.suffix(fromLast: "."))"