diff --git a/Core/Core/Analytics/CoreAnalytics.swift b/Core/Core/Analytics/CoreAnalytics.swift index f9786d80..4a106e75 100644 --- a/Core/Core/Analytics/CoreAnalytics.swift +++ b/Core/Core/Analytics/CoreAnalytics.swift @@ -154,6 +154,7 @@ public enum AnalyticsEvent: String { case discussionFollowToggle = "Dicussion:Post Follow Toggle" case discussionLikeToggle = "Discussion:Like Toggle" case discussionReportToggle = "Discussion:Report Toggle" + case notificationSettingPermissionStatus = "Notification:Setting Permission Status" } public enum EventBIValue: String { @@ -253,6 +254,7 @@ public enum EventBIValue: String { case discussionFollowToggle = "edx.bi.app.discussion.follow_toggle" case discussionLikeToggle = "edx.bi.app.discussion.like_toggle" case discussionReportToggle = "edx.bi.app.discussion.report_toggle" + case notificationSettingPermissionStatus = "edx.bi.app.notification.setting_permission.status" } public struct EventParamKey { @@ -308,6 +310,7 @@ public struct EventParamKey { public static let like = "like" public static let report = "report" public static let discussionType = "discussion_type" + public static let status = "status" } public struct EventCategory { diff --git a/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift b/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift index 3f496db2..05f1ddc5 100644 --- a/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift +++ b/OpenEdX/Managers/AnalyticsManager/AnalyticsManager.swift @@ -26,7 +26,8 @@ class AnalyticsManager: AuthorizationAnalytics, CourseAnalytics, DiscussionAnalytics, CoreAnalytics, - WhatsNewAnalytics { + WhatsNewAnalytics, + @unchecked Sendable { private var services: [AnalyticsService] @@ -166,6 +167,16 @@ class AnalyticsManager: AuthorizationAnalytics, trackScreenEvent(.mainDashboardProgramsClicked, biValue: .mainDashboardProgramsClicked) } + public func notificationPermissionStatus(status: String) { + trackEvent( + .notificationSettingPermissionStatus, + biValue: .notificationSettingPermissionStatus, + parameters: [ + EventParamKey.status: status + ] + ) + } + // MARK: Discovery public func discoverySearchBarClicked() { diff --git a/OpenEdX/Managers/AnalyticsManager/MainScreenAnalytics.swift b/OpenEdX/Managers/AnalyticsManager/MainScreenAnalytics.swift index f65a7658..12b19310 100644 --- a/OpenEdX/Managers/AnalyticsManager/MainScreenAnalytics.swift +++ b/OpenEdX/Managers/AnalyticsManager/MainScreenAnalytics.swift @@ -8,22 +8,24 @@ import Foundation //sourcery: AutoMockable -public protocol MainScreenAnalytics { +public protocol MainScreenAnalytics: Sendable { func mainDiscoveryTabClicked() func mainLearnTabClicked() func mainProfileTabClicked() func mainProgramsTabClicked() func mainCoursesClicked() func mainProgramsClicked() + func notificationPermissionStatus(status: String) } #if DEBUG -public class MainScreenAnalyticsMock: MainScreenAnalytics { +final public class MainScreenAnalyticsMock: MainScreenAnalytics { public func mainDiscoveryTabClicked() {} public func mainLearnTabClicked() {} public func mainProfileTabClicked() {} public func mainProgramsTabClicked() {} public func mainProgramsClicked() {} public func mainCoursesClicked() {} + public func notificationPermissionStatus(status: String) {} } #endif diff --git a/OpenEdX/View/MainScreenViewModel.swift b/OpenEdX/View/MainScreenViewModel.swift index 7a705373..66d8e543 100644 --- a/OpenEdX/View/MainScreenViewModel.swift +++ b/OpenEdX/View/MainScreenViewModel.swift @@ -13,6 +13,7 @@ import Course import Swinject import Combine import Authorization +import UserNotifications public enum MainTab { case discovery @@ -69,6 +70,21 @@ final class MainScreenViewModel: ObservableObject { } } .store(in: &cancellables) + trackSettingPermissionStatus() + } + + private func trackSettingPermissionStatus() { + DispatchQueue.global(qos: .userInteractive).async { + UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { [weak self] (settings) in + if settings.authorizationStatus == .notDetermined { + self?.analytics.notificationPermissionStatus(status: "not_determined") + } else if settings.authorizationStatus == .denied { + self?.analytics.notificationPermissionStatus(status: "denied") + } else if settings.authorizationStatus == .authorized { + self?.analytics.notificationPermissionStatus(status: "authorized") + } + }) + } } public func select(tab: MainTab) {