-
Notifications
You must be signed in to change notification settings - Fork 19
/
AppDelegate.swift
120 lines (104 loc) · 3.95 KB
/
AppDelegate.swift
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* Copyright (c) 2011-2021, Zingaya, Inc. All rights reserved.
*/
import Flutter
import flutter_callkit_voximplant
@UIApplicationMain
final class AppDelegate: FlutterAppDelegate {
private let callKitPlugin = FlutterCallkitPlugin.sharedInstance
@UserDefault("blockedNumbers", defaultValue: [])
private var blockedNumbers: [BlockableNumber]
@UserDefault("identifiedNumbers", defaultValue: [])
private var identifiedNumbers: [IdentifiableNumber]
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
callKitPlugin.getBlockedPhoneNumbers = { [weak self] in
guard let self = self else { return [] }
return self.blockedNumbers.compactMap {
if $0.isRemoved {
return nil
} else {
return FCXCallDirectoryPhoneNumber(number: $0.number)
}
}
}
callKitPlugin.didAddBlockedPhoneNumbers = { [weak self] numbers in
guard let self = self else { return }
self.blockedNumbers.append(
contentsOf: numbers.map { BlockableNumber(blockableNumber: $0) }
)
self.blockedNumbers.sort()
}
callKitPlugin.didRemoveBlockedPhoneNumbers = { [weak self] numbers in
guard let self = self else { return }
self.blockedNumbers = self.blockedNumbers.map { number in
if numbers.contains(where: { $0.number == number.number }) {
return number.copyWithRemovalMark
} else {
return number
}
}
}
callKitPlugin.getIdentifiablePhoneNumbers = { [weak self] in
guard let self = self else { return [] }
return self.identifiedNumbers.compactMap {
if $0.isRemoved {
return nil
} else {
return FCXIdentifiablePhoneNumber(number: $0.number, label: $0.label)
}
}
}
callKitPlugin.didAddIdentifiablePhoneNumbers = { [weak self] numbers in
guard let self = self else { return }
self.identifiedNumbers.append(
contentsOf: numbers.map { IdentifiableNumber(identifiableNumber: $0) }
)
self.identifiedNumbers.sort()
}
callKitPlugin.didRemoveIdentifiablePhoneNumbers = { [weak self] numbers in
guard let self = self else { return }
self.identifiedNumbers = self.identifiedNumbers.map { number in
if numbers.contains(where: { $0.number == number.number }) {
return number.copyWithRemovalMark
} else {
return number
}
}
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
fileprivate extension BlockableNumber {
init(blockableNumber: FCXCallDirectoryPhoneNumber, removed: Bool = false) {
self.number = blockableNumber.number
self.modificationDate = Date()
self.isRemoved = removed
}
var copyWithRemovalMark: BlockableNumber {
BlockableNumber(
number: number,
modificationDate: Date(),
isRemoved: true
)
}
}
fileprivate extension IdentifiableNumber {
init(identifiableNumber: FCXIdentifiablePhoneNumber, removed: Bool = false) {
self.number = identifiableNumber.number
self.label = identifiableNumber.label
self.modificationDate = Date()
self.isRemoved = removed
}
var copyWithRemovalMark: IdentifiableNumber {
IdentifiableNumber(
number: number,
label: label,
modificationDate: Date(),
isRemoved: true
)
}
}