summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPN/Notifications/Notification Providers
diff options
context:
space:
mode:
authorJon Petersson <jon.petersson@mullvad.net>2025-01-22 16:39:21 +0100
committerJon Petersson <jon.petersson@mullvad.net>2025-01-22 16:39:21 +0100
commita1b47c23a9532abc0f51fc94de481b0528afb9fb (patch)
tree8c93aed3d2fc5540e963bc6b02dbdd8549268429 /ios/MullvadVPN/Notifications/Notification Providers
parent060839d420a9cf222b49fe4932730a98fd5b1434 (diff)
parent5f9315b46dc7a364bc20d40420c2e0feb34a2d6c (diff)
downloadmullvadvpn-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.swift85
-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