summaryrefslogtreecommitdiffhomepage
path: root/ios/Operations/BackgroundObserver.swift
blob: c56e06d60f90e02940f4311d3daee43ef5c6e559 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//
//  BackgroundObserver.swift
//  Operations
//
//  Created by pronebird on 31/05/2022.
//  Copyright © 2026 Mullvad VPN AB. All rights reserved.
//

#if canImport(UIKit)

    import MullvadTypes
    import UIKit

    @available(iOSApplicationExtension, unavailable)
    public final class BackgroundObserver: OperationObserver {
        public let name: String
        public let backgroundTaskProvider: BackgroundTaskProviding
        public let cancelUponExpiration: Bool

        private var taskIdentifier: UIBackgroundTaskIdentifier?

        public init(backgroundTaskProvider: BackgroundTaskProviding, name: String, cancelUponExpiration: Bool) {
            self.backgroundTaskProvider = backgroundTaskProvider
            self.name = name
            self.cancelUponExpiration = cancelUponExpiration
        }

        public func didAttach(to operation: Operation) {
            let expirationHandler =
                cancelUponExpiration
                ? { @MainActor in operation.cancel() } as? @MainActor @Sendable () -> Void
                : nil

            taskIdentifier = backgroundTaskProvider.beginBackgroundTask(
                withName: name,
                expirationHandler: expirationHandler
            )
        }

        public func operationDidStart(_ operation: Operation) {
            // no-op
        }

        public func operationDidCancel(_ operation: Operation) {
            // no-op
        }

        public func operationDidFinish(_ operation: Operation, error: Error?) {
            if let taskIdentifier {
                backgroundTaskProvider.endBackgroundTask(taskIdentifier)
            }
        }
    }

#endif