Replace completion handlers with async/await. (#407)

This commit is contained in:
Doug
2023-01-05 16:43:41 +00:00
committed by GitHub
parent 51e300642c
commit e4d087a0a4
8 changed files with 70 additions and 109 deletions
@@ -302,7 +302,7 @@ class AppCoordinator: AppCoordinatorProtocol {
.sink { [weak self] callback in
switch callback {
case .registeredNotifications(let deviceToken):
self?.notificationManager?.register(with: deviceToken, completion: nil)
Task { await self?.notificationManager?.register(with: deviceToken) }
case .failedToRegisteredNotifications(let error):
self?.notificationManager?.registrationFailed(with: error)
}
@@ -467,8 +467,8 @@ extension AppCoordinator: NotificationManagerDelegate {
break
default:
// error or no room proxy
service.showLocalNotification(with: "⚠️ " + ElementL10n.dialogTitleError,
subtitle: ElementL10n.a11yErrorSomeMessageNotSent)
await service.showLocalNotification(with: "⚠️ " + ElementL10n.dialogTitleError,
subtitle: ElementL10n.a11yErrorSomeMessageNotSent)
}
}
}
@@ -29,7 +29,7 @@ class MockNotificationManager: NotificationManagerProtocol {
delegate?.authorizationStatusUpdated(self, granted: false)
}
func register(with deviceToken: Data, completion: ((Bool) -> Void)? = nil) { }
func register(with deviceToken: Data) async -> Bool { false }
func registrationFailed(with error: Error) { }
@@ -46,30 +46,26 @@ class NotificationManager: NSObject, NotificationManagerProtocol {
options: [])
notificationCenter.setNotificationCategories([replyCategory])
notificationCenter.delegate = self
notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { [weak self] granted, error in
guard let self else {
return
}
if let error {
MXLog.debug("[NotificationManager] request authorization failed: \(error)")
} else {
Task {
do {
let granted = try await notificationCenter.requestAuthorization(options: [.alert, .sound, .badge])
MXLog.debug("[NotificationManager] permission granted: \(granted)")
DispatchQueue.main.async {
await MainActor.run {
self.delegate?.authorizationStatusUpdated(self, granted: granted)
}
} catch {
MXLog.debug("[NotificationManager] request authorization failed: \(error)")
}
}
}
func register(with deviceToken: Data, completion: ((Bool) -> Void)? = nil) {
setPusher(with: deviceToken,
clientProxy: clientProxy,
completion: completion)
func register(with deviceToken: Data) async -> Bool {
await setPusher(with: deviceToken, clientProxy: clientProxy)
}
func registrationFailed(with error: Error) { }
func showLocalNotification(with title: String, subtitle: String?) {
func showLocalNotification(with title: String, subtitle: String?) async {
let content = UNMutableNotificationContent()
content.title = title
if let subtitle {
@@ -78,44 +74,39 @@ class NotificationManager: NSObject, NotificationManagerProtocol {
let request = UNNotificationRequest(identifier: ProcessInfo.processInfo.globallyUniqueString,
content: content,
trigger: nil)
notificationCenter.add(request) { error in
if let error {
MXLog.debug("[NotificationManager] show local notification failed: \(error)")
} else {
MXLog.debug("[NotificationManager] show local notification succeeded")
}
do {
try await notificationCenter.add(request)
MXLog.debug("[NotificationManager] show local notification succeeded")
} catch {
MXLog.debug("[NotificationManager] show local notification failed: \(error)")
}
}
private func setPusher(with deviceToken: Data,
clientProxy: ClientProxyProtocol,
completion: ((Bool) -> Void)?) {
Task {
do {
try await clientProxy.setPusher(pushkey: deviceToken.base64EncodedString(),
kind: .http,
appId: ServiceLocator.shared.settings.pusherAppId,
appDisplayName: "\(InfoPlistReader.target.bundleDisplayName) (iOS)",
deviceDisplayName: UIDevice.current.name,
profileTag: pusherProfileTag(),
lang: Bundle.preferredLanguages.first ?? "en",
url: ServiceLocator.shared.settings.pushGatewayBaseURL.absoluteString,
format: .eventIdOnly,
defaultPayload: [
"aps": [
"mutable-content": 1,
"alert": [
"loc-key": "Notification",
"loc-args": []
]
private func setPusher(with deviceToken: Data, clientProxy: ClientProxyProtocol) async -> Bool {
do {
try await clientProxy.setPusher(pushkey: deviceToken.base64EncodedString(),
kind: .http,
appId: ServiceLocator.shared.settings.pusherAppId,
appDisplayName: "\(InfoPlistReader.target.bundleDisplayName) (iOS)",
deviceDisplayName: UIDevice.current.name,
profileTag: pusherProfileTag(),
lang: Bundle.preferredLanguages.first ?? "en",
url: ServiceLocator.shared.settings.pushGatewayBaseURL.absoluteString,
format: .eventIdOnly,
defaultPayload: [
"aps": [
"mutable-content": 1,
"alert": [
"loc-key": "Notification",
"loc-args": []
]
])
MXLog.debug("[NotificationManager] set pusher succeeded")
completion?(true)
} catch {
MXLog.debug("[NotificationManager] set pusher failed: \(error)")
completion?(false)
}
]
])
MXLog.debug("[NotificationManager] set pusher succeeded")
return true
} catch {
MXLog.debug("[NotificationManager] set pusher failed: \(error)")
return false
}
}
@@ -36,7 +36,7 @@ protocol NotificationManagerProtocol {
var delegate: NotificationManagerDelegate? { get set }
func start()
func register(with deviceToken: Data, completion: ((Bool) -> Void)?)
func register(with deviceToken: Data) async -> Bool
func registrationFailed(with error: Error)
func showLocalNotification(with title: String, subtitle: String?)
func showLocalNotification(with title: String, subtitle: String?) async
}
@@ -19,7 +19,7 @@ import UserNotifications
protocol UserNotificationCenterProtocol: AnyObject {
var delegate: UNUserNotificationCenterDelegate? { get set }
func add(_ request: UNNotificationRequest, withCompletionHandler completionHandler: ((Error?) -> Void)?)
func requestAuthorization(options: UNAuthorizationOptions, completionHandler: @escaping (Bool, Error?) -> Void)
func add(_ request: UNNotificationRequest) async throws
func requestAuthorization(options: UNAuthorizationOptions) async throws -> Bool
func setNotificationCategories(_ categories: Set<UNNotificationCategory>)
}