[AltStore] Tracks refresh progress in addition to installation

This commit is contained in:
Riley Testut
2019-07-19 16:10:30 -07:00
parent 362f833643
commit 7f85d73857
2 changed files with 41 additions and 8 deletions

View File

@@ -26,7 +26,8 @@ class AppManager
private let operationQueue = OperationQueue() private let operationQueue = OperationQueue()
private let processingQueue = DispatchQueue(label: "com.altstore.AppManager.processingQueue") private let processingQueue = DispatchQueue(label: "com.altstore.AppManager.processingQueue")
private var installationProgress = [App: Progress]() private var installationProgress = [String: Progress]()
private var refreshProgress = [String: Progress]()
private init() private init()
{ {
@@ -112,11 +113,13 @@ extension AppManager
return progress return progress
} }
let appIdentifier = app.identifier
let group = self.install([app], forceDownload: true, presentingViewController: presentingViewController) let group = self.install([app], forceDownload: true, presentingViewController: presentingViewController)
group.completionHandler = { (result) in group.completionHandler = { (result) in
do do
{ {
self.installationProgress[app] = nil self.installationProgress[appIdentifier] = nil
guard let (_, result) = try result.get().first else { throw OperationError.unknown } guard let (_, result) = try result.get().first else { throw OperationError.unknown }
completionHandler(result) completionHandler(result)
@@ -127,22 +130,35 @@ extension AppManager
} }
} }
self.installationProgress[app] = group.progress self.installationProgress[app.identifier] = group.progress
return group.progress return group.progress
} }
func refresh(_ installedApps: [InstalledApp], presentingViewController: UIViewController?, group: OperationGroup? = nil) -> OperationGroup func refresh(_ installedApps: [InstalledApp], presentingViewController: UIViewController?, group: OperationGroup? = nil) -> OperationGroup
{ {
let apps = installedApps.compactMap { $0.app } let apps = installedApps.compactMap { $0.app }.filter { self.refreshProgress(for: $0) == nil }
let group = self.install(apps, forceDownload: false, presentingViewController: presentingViewController, group: group) let group = self.install(apps, forceDownload: false, presentingViewController: presentingViewController, group: group)
for app in apps
{
guard let progress = group.progress(for: app) else { continue }
self.refreshProgress[app.identifier] = progress
}
return group return group
} }
func installationProgress(for app: App) -> Progress? func installationProgress(for app: App) -> Progress?
{ {
let progress = self.installationProgress[app] let progress = self.installationProgress[app.identifier]
return progress
}
func refreshProgress(for app: App) -> Progress?
{
let progress = self.refreshProgress[app.identifier]
return progress return progress
} }
} }
@@ -250,9 +266,8 @@ private extension AppManager
progress.addChild(installOperation.progress, withPendingUnitCount: 30) progress.addChild(installOperation.progress, withPendingUnitCount: 30)
installOperation.addDependency(sendAppOperation) installOperation.addDependency(sendAppOperation)
operations.append(installOperation) operations.append(installOperation)
group.progress.totalUnitCount += 1 group.set(progress, for: app)
group.progress.addChild(progress, withPendingUnitCount: 1)
} }
group.addOperations(operations) group.addOperations(operations)
@@ -302,6 +317,8 @@ private extension AppManager
} }
} }
self.refreshProgress[context.appIdentifier] = nil
print("Finished operation!", context.appIdentifier) print("Finished operation!", context.appIdentifier)
if context.group.results.count == context.group.progress.totalUnitCount if context.group.results.count == context.group.progress.totalUnitCount

View File

@@ -25,6 +25,8 @@ class OperationGroup
var results = [String: Result<InstalledApp, Error>]() var results = [String: Result<InstalledApp, Error>]()
private var progressByApp = [App: Progress]()
private let operationQueue = OperationQueue() private let operationQueue = OperationQueue()
private let installOperationQueue = OperationQueue() private let installOperationQueue = OperationQueue()
@@ -60,4 +62,18 @@ class OperationGroup
} }
} }
} }
func set(_ progress: Progress, for app: App)
{
self.progressByApp[app] = progress
self.progress.totalUnitCount += 1
self.progress.addChild(progress, withPendingUnitCount: 1)
}
func progress(for app: App) -> Progress?
{
let progress = self.progressByApp[app]
return progress
}
} }