diff options
| author | Jon Petersson <jon.petersson@mullvad.net> | 2025-01-22 16:39:21 +0100 |
|---|---|---|
| committer | Jon Petersson <jon.petersson@mullvad.net> | 2025-01-22 16:39:21 +0100 |
| commit | a1b47c23a9532abc0f51fc94de481b0528afb9fb (patch) | |
| tree | 8c93aed3d2fc5540e963bc6b02dbdd8549268429 /ios/MullvadVPN/Notifications/Notification Providers | |
| parent | 060839d420a9cf222b49fe4932730a98fd5b1434 (diff) | |
| parent | 5f9315b46dc7a364bc20d40420c2e0feb34a2d6c (diff) | |
| download | mullvadvpn-a1b47c23a9532abc0f51fc94de481b0528afb9fb.tar.xz mullvadvpn-a1b47c23a9532abc0f51fc94de481b0528afb9fb.zip | |
Merge branch 'add-in-app-notification-banner-for-changelog-ios-989'
Diffstat (limited to 'ios/MullvadVPN/Notifications/Notification Providers')
| -rw-r--r-- | ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift | 85 | ||||
| -rw-r--r-- | ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift (renamed from ios/MullvadVPN/Notifications/Notification Providers/RegisteredDeviceInAppNotificationProvider.swift) | 8 |
2 files changed, 89 insertions, 4 deletions
diff --git a/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift b/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift new file mode 100644 index 0000000000..2e72f45545 --- /dev/null +++ b/ios/MullvadVPN/Notifications/Notification Providers/LatestChangesNotificationProvider.swift @@ -0,0 +1,85 @@ +// +// LatestChangesNotificationProvider.swift +// MullvadVPN +// +// Created by Mojgan on 2025-01-15. +// Copyright © 2025 Mullvad VPN AB. All rights reserved. +// +import Foundation +import UIKit + +class LatestChangesNotificationProvider: NotificationProvider, InAppNotificationProvider, @unchecked Sendable { + private var appPreferences: AppPreferencesDataSource + private let appVersion: String = Bundle.main.productVersion + + init(appPreferences: AppPreferencesDataSource) { + self.appPreferences = appPreferences + } + + var shouldShowNotification: Bool { + // If this is the first installation, no notification will be shown. + guard !appPreferences.lastSeenChangeLogVersion.isEmpty else { return false } + // Display the notification only if the app is updated from a previously installed version. + return appPreferences.lastSeenChangeLogVersion != appVersion + } + + override var identifier: NotificationProviderIdentifier { + .latestChangesInAppNotificationProvider + } + + var notificationDescriptor: InAppNotificationDescriptor? { + defer { + // Always update the last seen version + appPreferences.lastSeenChangeLogVersion = appVersion + } + + guard shouldShowNotification else { return nil } + + return InAppNotificationDescriptor( + identifier: identifier, + style: .success, + title: NSLocalizedString( + "LATEST_CHANGES_IN_APP_NOTIFICATION_TITLE", + value: "NEW VERSION INSTALLED", + comment: "" + ), + body: createNotificationBody(), + button: createCloseButtonAction(), + tapAction: createTapAction() + ) + } + + private func createNotificationBody() -> NSAttributedString { + NSAttributedString( + markdownString: NSLocalizedString( + "LATEST_CHANGES_IN_APP_NOTIFICATION_BODY", + value: "**Tap here** to see what’s new.", + comment: "" + ), + options: MarkdownStylingOptions(font: UIFont.preferredFont(forTextStyle: .body)), + applyEffect: { markdownType, _ in + guard case .bold = markdownType else { return [:] } + return [.foregroundColor: UIColor.InAppNotificationBanner.titleColor] + } + ) + } + + private func createCloseButtonAction() -> InAppNotificationAction { + InAppNotificationAction( + image: UIImage(named: "IconCloseSml"), + handler: { [weak self] in + self?.invalidate() + } + ) + } + + private func createTapAction() -> InAppNotificationAction { + InAppNotificationAction( + handler: { [weak self] in + guard let self else { return } + self.invalidate() + NotificationManager.shared.notificationProvider(self, didReceiveAction: "\(self.identifier)") + } + ) + } +} diff --git a/ios/MullvadVPN/Notifications/Notification Providers/RegisteredDeviceInAppNotificationProvider.swift b/ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift index ade1b0eb20..66b76f9116 100644 --- a/ios/MullvadVPN/Notifications/Notification Providers/RegisteredDeviceInAppNotificationProvider.swift +++ b/ios/MullvadVPN/Notifications/Notification Providers/NewDeviceNotificationProvider.swift @@ -1,5 +1,5 @@ // -// RegisteredDeviceInAppNotification.swift +// NewDeviceNotificationProvider.swift // MullvadVPN // // Created by Mojgan on 2023-04-21. @@ -11,7 +11,7 @@ import MullvadSettings import UIKit.UIColor import UIKit.UIFont -final class RegisteredDeviceInAppNotificationProvider: NotificationProvider, +final class NewDeviceNotificationProvider: NotificationProvider, InAppNotificationProvider, @unchecked Sendable { // MARK: - private properties @@ -57,8 +57,8 @@ final class RegisteredDeviceInAppNotificationProvider: NotificationProvider, comment: "" ), body: attributedBody, - action: .init( - image: .init(named: "IconCloseSml"), + button: InAppNotificationAction( + image: UIImage(named: "IconCloseSml"), handler: { [weak self] in guard let self else { return } isNewDeviceRegistered = false |
