diff --git a/firefox-ios/Client/Frontend/Browser/DownloadHelper/DownloadLiveActivityWrapper.swift b/firefox-ios/Client/Frontend/Browser/DownloadHelper/DownloadLiveActivityWrapper.swift index 9cabf786c691..4d696fdbed30 100644 --- a/firefox-ios/Client/Frontend/Browser/DownloadHelper/DownloadLiveActivityWrapper.swift +++ b/firefox-ios/Client/Frontend/Browser/DownloadHelper/DownloadLiveActivityWrapper.swift @@ -10,10 +10,17 @@ import Shared @available(iOS 16.2, *) class DownloadLiveActivityWrapper: DownloadProgressDelegate { - enum DurationToDismissal: Double { + private struct UX { + static let updateCooldown: Double = 0.75 // Update Cooldown in Seconds + } + + enum DurationToDismissal: UInt64 { case none = 0 - case delayed = 2 + case delayed = 3_000_000_000 // Milliseconds to dismissal } + + let throttler = Throttler(seconds: UX.updateCooldown) + var downloadLiveActivity: Activity? var downloadProgressManager: DownloadProgressManager @@ -40,28 +47,35 @@ class DownloadLiveActivityWrapper: DownloadProgressDelegate { } } - private func update() { - let downloadsStates = DownloadLiveActivityUtil.buildContentState(downloads: downloadProgressManager.downloads) - let contentState = DownloadLiveActivityAttributes.ContentState(downloads: downloadsStates) + func end(durationToDismissal: DurationToDismissal) { Task { - await downloadLiveActivity?.update(using: contentState) + let downloadsStates = DownloadLiveActivityUtil.buildContentState(downloads: downloadProgressManager.downloads) + let contentState = DownloadLiveActivityAttributes.ContentState(downloads: downloadsStates) + await update() + try await Task.sleep(nanoseconds: durationToDismissal.rawValue) + await downloadLiveActivity?.end(using: contentState, dismissalPolicy: .immediate) } } - func end(durationToDismissal: DurationToDismissal) { + private func update() async { let downloadsStates = DownloadLiveActivityUtil.buildContentState(downloads: downloadProgressManager.downloads) let contentState = DownloadLiveActivityAttributes.ContentState(downloads: downloadsStates) - Task { - await downloadLiveActivity?.end(using: contentState, - dismissalPolicy: .after(.now.addingTimeInterval(durationToDismissal.rawValue))) - } + await self.downloadLiveActivity?.update(using: contentState) } func updateCombinedBytesDownloaded(value: Int64) { - update() + throttler.throttle { + Task { + await self.update() + } + } } func updateCombinedTotalBytesExpected(value: Int64?) { - update() + throttler.throttle { + Task { + await self.update() + } + } } }